我有一个网页,其中显示了与服务器一起使用的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,所以我希望能在那里找到它,但我似乎无法找到它。
最糟糕的是我知道我可以花时间自己弄清楚所有的点点滴滴,但我不知道是否会错过某人可能期望在那里找到的扩展名。
答案 0 :(得分:2)
用自己的解决方案回答我自己的问题。
事实证明,这种糟糕的toString()输出仅在使用Sun的X509Certificate实现时发生。当使用BouncyCastle时,它看起来好多了(或者更详细,至少。)
事实证明,在呈现页面之前我们没有初始化BC的提供者。初始化被推迟,直到我们想用它来实际生成证书,现在它已经在webapp启动时完成,toString()看起来好多了。
答案 1 :(得分:1)
几乎所有的“零碎”都应该从标准的X509Certificate类中获得:
你应该可以很容易地格式化你想要的任何东西,无论你想要什么。您还可以访问并遍历“getIssuerAlternativeNames()”集合。
PS:
这是关于实现X509Certificate类的一个很好的链接:
这是来自使用Bouncy Castle的人的链接(解决方案也涉及上述链接):
答案 2 :(得分:0)
尝试来自BC Provider的PEMReader API
byte[] content = data.getBytes();
// create new buffered reader
PEMReader pemReader = new PEMReader(br, null);
Object obj = pemReader.readObject();
一旦打印出obj,它将为您提供toString格式