我需要帮助获取适当的代码片段来获取服务器证书 - 有效和无效、由 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 上的证书链(不知道加密)。我希望我的程序能够提供完全相同的信息。打印整个证书链。
这可以通过以下步骤完成:
SSLContext
初始化TrustManager
(此用例是使用此类信任管理器的极少数原因之一)。仅当您怀疑远程证书不可信时才这样做。SSLSocketFactory
。SSLSocket
。如果您使用主机名(而不是 InetAddress
),这将在 Java 7 上启用 SNI,因此这相当于使用 -servername
作为 openssl
命令的附加选项。startHandhsake()
)SSLSession
获取SSLSocket
。Certificate
中的每个getPeerCertificates()
:
byte[]
获取其编码值(如
getEncoded()
PEMWriter
。我过去也遇到过同样的挑战,并在我的库中提供了此选项,您可以在这里看到:GitHub - SSLKickstart - Kickstart我认为这对于其他开发人员在此处分享可能会有所帮助。
用法
List<X509Certificate> certificates = CertificateUtils.getCertificatesFromExternalSource("https://stackoverflow.com/");
// or get the server certificates as pem format
List<String> certificatesAsPem = CertificateUtils.getCertificatesFromExternalSourceAsPem("https://stackoverflow.com/");
使用maven安装库
<dependency>
<groupId>io.github.hakky54</groupId>
<artifactId>sslcontext-kickstart</artifactId>
<version>8.2.0</version>
</dependency>