提取服务器证书

问题描述 投票:0回答:2

我需要帮助获取适当的代码片段来获取服务器证书 - 有效和无效、由 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 ssl openssl certificate
2个回答
6
投票

这可以通过以下步骤完成:

  • 使用信任任何东西的
    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
投票

我过去也遇到过同样的挑战,并在我的库中提供了此选项,您可以在这里看到: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>
© www.soinside.com 2019 - 2024. All rights reserved.