有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java提取服务器证书

我需要帮助获取apt代码片段以获取服务器证书-有效和无效、由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上的(不知道加密)证书链。我希望我的程序提供完全相同的信息。打印整个证书链


共 (2) 个答案

  1. # 1 楼答案

    我过去也遇到过同样的挑战,并在我的库中提供了这个选项,您可以在这里看到: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>
    
  2. # 2 楼答案

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

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