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