java - 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 内容。之后似乎无法弄清楚如何处理解析的内容。
解决方案
推荐阅读
- git - 根据 git describe 输出重建 make 目标
- python - 读取文件名,然后使用 python 调用可调用函数(带有一个或两个参数)
- arrays - 0和1的Concentrix矩阵
- css - 如何从带有样式组件的反应路由器的链接中删除样式
- c# - 基础连接已关闭。从 Windows Server 2012 中的任务计划程序进行计划时
- python - 将接收到的消息从 DBus 发送到 websocket 服务器并返回
- c++ - 无法在 ROS 节点中使用文件系统
- c# - DataGrid 中的 ComboBox ItemSource 无法正常工作
- typescript - 使用 Typescript 限制上传文件的大小和类型
- android - 如何将 SDK 放入 JFrog 神器?