19

假设我有两个我编写的 Java 应用程序:它们被部署Ping.jarPong.jar运行在两个单独的服务器上(Ping.jar部署到srv-01.myorg.comPong.jar部署到srv-02.myorg.com),这两个应用程序需要通过 SSL 相互通信(双向)。我们还假设每个应用程序都有自己的 SSL 证书。

  • 作为一名 Java 程序员,我如何编写代码PingPong验证彼此的 SSL 证书?每个 CA 是否都提供某种我可以使用的 RESTful API,例如,HttpClient?Java 是否有自己的证书验证 API?是否有我可以使用的开源第三方 JAR 或服务?

当我在网上搜索这个时,我对出现的很少感到惊讶。

4

4 回答 4

32

如果您使用 Java SE SSL/TLS 类(例如SSLSocketSSLEngine)进行连接,则您使用的是Java Secure Socket Extension (JSSE)

它将根据SSLContext用于创建此SSLSocketSSLEngine.

SSLContext将使用TrustManager指示如何建立信任来初始化。

除非您需要特定配置,否则您通常可以依赖默认值:这将依赖 PKIX 算法(RFC 3280)根据一组信任锚(cacerts默认情况下)验证证书。cacerts,Oracle JRE 附带的是一个 JKS 密钥库,您可以向其中添加其他证书。keytool您可以使用例如显式添加证书。

您还可以以编程方式创建X509TrustManager基于自定义密钥库的密钥库(如本答案SSLContext中所述),并在不影响默认密钥的特定密钥库中使用它。

除此之外,如果您使用自己的协议,则需要验证您获得的证书是否与您正在寻找的主机名匹配(请参阅 RFC 6125)。通常,您可以在X509Certificate您获得的主题备用名称中查找(从 获取链中的第一个对等证书SSLSession),如果失败,请CN在主题可分辨名称中查找 RDN。

于 2012-06-21T19:25:30.577 回答
1

您可以通过将 a 附加HandshakeCompletedListenerSSLSocket并从事件中获取证书,或者通过SSLSession从 the 中SSLSocket获取并从会话中获取对等证书来获取对等证书。

SSL 提供对等身份的隐私、完整性和身份验证。该对等身份是否是应用程序期望的身份,以及该身份在应用程序中被允许做什么,如有必要,应由应用程序检查。这是“授权”步骤,SSL 无法为您完成。

于 2012-06-22T00:15:04.133 回答
0

AFAIK 证书验证应包括以下步骤:

  1. 证书形式验证通过验证其签名、当前时间的有效性和使用给定证书的域的有效性。无需任何额外的网络通信即可检查这些内容。
  2. 检查证书是否未被吊销 - 这是@Bruno 给出的答案中缺少的内容(否则我同意他的观点)。我认为只有在从签署证书的 CA(与 CA 的网络通信)获得新的 CRL(证书吊销列表)后才能进行此检查。
于 2020-05-13T09:24:25.820 回答
-1

您不必手动检查彼此的证书。

您只需将每个服务器证书导入到彼此的 cacerts 中,这样两个应用程序服务器就会自动相互信任。

于 2012-06-21T18:56:15.700 回答