java - 提取服务器证书

标签 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 上的(不知道加密)证书链。我希望我的程序提供完全相同的信息。打印整个证书链。

最佳答案

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

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

关于java - 提取服务器证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19297446/

相关文章:

ruby-on-rails - 如何强制 Rails 仅使用 TLS over SSL?

java - 未提供 Android 列出的加密算法

发图片到粉丝专页墙的Java代码

java - 通过 ezjcom 在 swing 中运行 flash swf 时缺少 dll

java - 按下按钮时画一个圆圈

azure - 在没有 DigiCert 巴尔的摩根证书的情况下连接到 Azure IoT 中心

java - 使用spring从jar文件访问静态html页面

python - Scapy 嗅探 SSL

python - 是否可以使用 pyOpenSSL 设置 subjectAltName?

ios - PKCS12_newpass 中的内存泄漏