JAVA:提取服务器证书

时间:2013-10-10 13:42:02

标签: java ssl openssl certificate

我希望获得帮助以获取适当的代码来获取服务器证书 - 有效且无效,由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程序提供完全相同的信息。打印整个证书链。

2 个答案:

答案 0 :(得分:4)

可以使用以下步骤完成:

  • 使用信任任何内容的SSLContext初始化TrustManager(此用例是使用此类信任管理器的极少数原因之一)。仅当您怀疑远程证书不受信任时才会这样做。
  • 从中获取SSLSocketFactory
  • 使用您要连接的主机名从此工厂创建SSLSocket。如果您使用主机名(而不是InetAddress),这将启用Java 7上的SNI,因此这相当于使用-servername作为openssl命令的附加选项
  • 开始握手(例如使用startHandhsake()
  • 从此SSLSession获取SSLSocket
  • Certificate中的每个getPeerCertificates()
    • 使用byte[]
    • 获取其编码值(getEncoded()
    • 将其转换为PEM,或者:
      • 使用BouncyCastle的PEMWriter
      • 使用Base 64编码器(例如Apache Commons),添加BEGIN / END分隔符,并使用每64个字符的新行拆分字符串。

答案 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>