首页 > 解决方案 > Java CertificateFactory.generateCertPath(inputStream) 未按预期工作

问题描述

我最近发现了 Java 的 CertificateFactory 作为一种将 PEM 内容转换为证书和证书链的方法。我的 PEM 内容只是一个字符串中的 PEM 格式的 X.509 证书(即----BEGIN CERTIFICATE----\n ...)。

我试着这样写我的转换方法:

public List<? extends Certificate> certChainFromPem(String certPem) {
    try (ByteArrayInputStream bais = new ByteArrayInputStream(certPem.trim().getBytes(StandardCharsets.UTF_8))) {
        CertificateFactory factory = CertificateFactory.getInstance("X.509");
        CertPath certPath = factory.generateCertPath(bais);
        return certPath.getCertificates();
    } catch (GeneralSecurityException | IOException e) {
        throw new InvalidCertChainPemException("invalid cert chain pem content: " + certPem, e);
    }
}

这引发了异常消息中指示“空输入”的异常。经过大量的实验,我终于像这样重写了我的方法:

public List<? extends Certificate> certChainFromPem(String certPem) {
    try (ByteArrayInputStream bais = new ByteArrayInputStream(certPem.trim().getBytes(StandardCharsets.UTF_8))) {
        CertificateFactory factory = CertificateFactory.getInstance("X.509");
        Collection<? extends Certificate> certs = factory.generateCertificates(bais);
        CertPath certPath = factory.generateCertPath(new ArrayList<>(certs));
        return certPath.getCertificates();
    } catch (GeneralSecurityException | IOException e) {
        throw new InvalidCertChainPemException("invalid cert chain pem content: " + certPem, e);
    }
}

现在它可以工作了。有人可以向我解释为什么证书工厂能够从输入流生成证书,但不能生成证书路径?使用完全相同的输入,我能够从输入流生成的证书生成证书路径。我在这里缺少什么关键概念?这两种方法都有一个 InputStream 构造函数,进入 Java 源代码向我展示了 generateCertPath 方法似乎可以毫无问题地从输入流中解析 PEM 内容。之后似乎无法弄清楚如何处理解析的内容。

标签: javapathcertificatex509pem

解决方案


推荐阅读