假设我编写了两个 Java 应用程序:Ping.jar
和 Pong.jar
,它们在两个独立的服务器上部署和运行 (Ping. jar
部署到 srv-01.myorg.com
和 Pong.jar
部署到 srv-02.myorg.com
),这两个应用程序需要通过 SSL 相互通信(双向)。我们还假设每个应用都有自己的 SSL 证书。
- 作为 Java 程序员,我如何编写
Ping
和Pong
代码来验证彼此的 SSL 证书?每个 CA 是否都提供某种 RESTful API,我可以使用它,比如HttpClient
? Java 有自己的证书验证 API 吗?是否有我可以使用的开源第三方 JAR 或服务?
当我在网上搜索这个时,我很惊讶地发现了这么少的东西。
最佳答案
如果您使用 Java SE SSL/TLS 类(例如 SSLSocket
或 SSLEngine
)进行连接,则您使用的是 Java Secure Socket Extension (JSSE) .
它将根据用于创建此SSLSocket
或SSLEngine
的SSLContext
验证远程方的证书。
此 SSLContext
将使用 TrustManager
初始化这决定了如何建立信任。
除非你需要特定的配置,你通常可以依赖the default values :这将依靠 PKIX 算法 (RFC 3280) 根据一组信任 anchor 验证证书(默认情况下在 cacerts
中)。 cacerts
随 Oracle JRE 一起提供,是一个 JKS keystore ,您可以向其中添加其他证书。例如,您可以使用 keytool
显式添加证书。
您还可以以编程方式创建基于自定义 keystore 的 X509TrustManager
(如 this answer 中所述),并在不影响的特定 SSLContext
中使用它默认一个。
除此之外,如果您使用自己的协议(protocol),则需要验证您获得的证书是否与您要查找的主机名相匹配(请参阅 RFC 6125)。通常,您可以在您获得的 X509Certificate
中查找主题备用名称(从 SSLSession
获取链中的第一个对等证书),否则,查找 CN
Subject Distinguished Name 中的 RDN。
关于java - Java 中的 SSL 证书验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11143360/