如何解决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 内容时似乎没有问题。它似乎无法弄清楚在那之后如何处理解析的内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。