我需要帮助获取适当的代码片段以获取服务器证书 - 有效和无效,由 CA 签名和自签名。非常感谢任何链接和引用。
我有一个 UNIX 命令,可以提供我想要的东西,但我想要使用 Java 得到相同的输出。 UNIX中的命令是这样的——
echo -n | openssl s_client -connect www.gmail.com:443 -showcerts | \
sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /tmp/$SERVERNAME.cert
这将返回 gmail 上的(不知道加密)证书链。我希望我的程序提供完全相同的信息。打印整个证书链。
最佳答案
这可以通过以下步骤完成:
- 使用信任任何事物的
TrustManager
初始化SSLContext
(此用例是使用此类信任管理器的极少数原因之一)。仅当您怀疑远程证书不可信时才会这样做。 - 从中获取一个
SSLSocketFactory
。 - 使用您要连接的主机名从此工厂创建一个
SSLSocket
。如果您使用主机名(而不是InetAddress
),这将在 Java 7 上启用 SNI,因此这相当于使用-servername
作为附加选项你的openssl
命令。 - 开始握手(例如使用
startHandhsake()
) - 从此
SSLSocket
获取SSLSession
。 - 对于
getPeerCertificates()
中的每个Certificate
:- 使用
getEncoded()
获取其编码值(如byte[]
) - 将其转换为 PEM,或者:
- 使用 BouncyCaSTLe 的
PEMWriter
。 - 使用 Base 64 编码器(例如 Apache Commons),添加 BEGIN/END 分隔符并每 64 个字符用一个新行拆分字符串。
- 使用 BouncyCaSTLe 的
- 使用
关于java - 提取服务器证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19297446/