假设我编写了两个 Java 应用程序:Ping.jar
并且Pong.jar
它们在两个单独的服务器上部署和运行(Ping.jar
部署到srv-01.myorg.com
和Pong.jar
部署到srv-02.myorg.com
),这两个应用程序需要通过 SSL 相互通信(2 路)。我们还假设每个应用程序都有自己的 SSL 证书。
- 作为 Java 程序员,我如何编码
Ping
并Pong
验证彼此的 SSL 证书?每个 CA 是否都提供某种我可以使用的 RESTful API,例如,HttpClient
?Java 是否有自己的证书验证 API?是否有我可以使用的开源第三方 JAR 或服务?
当我在网上搜索这个时,我惊讶地发现它很少出现。
如果您使用 Java SE SSL/TLS 类(例如
SSLSocket
或SSLEngine
)进行连接,则您使用的是Java 安全套接字扩展 (JSSE)。它将根据
SSLContext
用于创建此SSLSocket
或SSLEngine
.这
SSLContext
将根据TrustManager
应如何建立信任的指示进行初始化。除非您需要特定配置,否则您通常可以依赖默认值:这将依赖 PKIX 算法 (RFC 3280) 根据一组信任锚(
cacerts
默认情况下)验证证书。cacerts
,Oracle JRE 附带的是一个 JKS 密钥库,您可以向其中添加其他证书。您可以使用keytool
例如显式添加证书。您还可以以
X509TrustManager
编程方式创建基于自定义密钥库的密钥库(如本答案中所述),并在SSLContext
不影响默认密钥库的特定情况下使用它。除此之外,如果您使用自己的协议,则需要验证您获得的证书是否与您要查找的主机名匹配(请参阅 RFC 6125)。通常,您可以在
X509Certificate
您获得的(从 中获取链中的第一个对等证书)中查找主题备用名称SSLSession
,否则,CN
在主题专有名称中查找RDN。