有没有办法漂亮地打印 X509Certificate?
Posted
技术标签:
【中文标题】有没有办法漂亮地打印 X509Certificate?【英文标题】:Is there a way to pretty print an X509Certificate? 【发布时间】:2012-06-13 05:47:25 【问题描述】:我有一个网页,其中显示了与服务器一起使用的 SSL 证书的详细信息。我认为 toString() 可能没问题,但它看起来像这样:
[0] Version: 3
SerialNumber: 117262955582477610212812061435665386300
IssuerDN: CN=localhost
Start Date: Wed Jun 13 15:15:05 EST 2012
Final Date: Tue Jun 08 15:15:05 EST 2032
SubjectDN: CN=localhost
Public Key: DSA Public Key
y: 6ef96c2ace616280c5453dda2[TRUNCATED BY ME]
Signature Algorithm: SHA1withDSA
Signature: 302c021450b1557d879a25ccf6b89e7ac6de8dc6
0b13df7e0214559cdc810cdb1faa3a645da837cd
5efdeb81d62e
Extensions:
critical(true) 2.5.29.17 value = DER Sequence
Tagged [7] IMPLICIT
DER Octet String[4]
我遇到的问题是扩展的模糊表示。我希望看到“subjectAltNames”和替代名称列表,就像我在查看证书信息时在网络浏览器中看到的那样。
有没有办法做到这一点?我的班级路径上有整个 BouncyCastle,所以我希望我能在其中找到它,但我似乎无法找到它。
最坏的结果是最坏的,我知道我可以花时间自己整理所有的零碎东西,但我不知道我是否会错过有人可能希望在其中找到的扩展。
【问题讨论】:
【参考方案1】:用我自己的解决方案回答我自己的问题。
事实证明,这种糟糕的 toString() 输出仅在使用 Sun 的 X509Certificate 实现时才会发生。使用 BouncyCastle 时,它看起来好多了(或者至少更详细。)
事实证明,我们没有在页面呈现之前初始化 BC 的提供程序。初始化被延迟到我们想用它来实际生成证书,现在它是在 webapp 启动时完成的,toString() 看起来好多了。
【讨论】:
【参考方案2】:标准 X509Certificate 类中几乎所有的“点点滴滴”都应该是可用的:
http://docs.oracle.com/javase/6/docs/api/java/security/cert/X509Certificate.html您应该能够非常轻松地格式化您想要的任何内容,无论您想要什么。您还可以访问和遍历“getIssuerAlternativeNames()”集合。
PS:
这是一个关于实现 X509Certificate 类的绝佳链接:
http://www.mayrhofer.eu.org/create-x509-certs-in-java这是来自使用 Bouncy Castle 的人的链接(解决方案也涉及上述链接):
Generating X509Certificate using bouncycastle X509v3CertificateBuilder【讨论】:
“点点滴滴”根本不是漂亮打印 X509 证书的意思。其中有很多,正确格式化和打印(文本控制台)或显示(Swing、JavaFX、HTML)所有这些数据是一项巨大的工作。我希望有一个可用的开源代码,因为这是一种常见的问题。当然,问题不在于实施 X509 证书。【参考方案3】:试试 BC Provider 的 PEMReader API
byte[] content = data.getBytes();
// create new buffered reader
PEMReader pemReader = new PEMReader(br, null);
Object obj = pemReader.readObject();
一旦你打印了 obj,它就会给你 toString 格式
【讨论】:
以上是关于有没有办法漂亮地打印 X509Certificate?的主要内容,如果未能解决你的问题,请参考以下文章
在 NSObject 的子类上实现啥方法以允许在 swift 操场上进行漂亮的打印?