Java中的SSL证书验证

IAm*_*aja 15 java ssl

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

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

当我在网上搜索这个时,我感到很惊讶.

Bru*_*uno 25

如果您使用Java SE SSL/TLS类(例如SSLSocketSSLEngine)进行连接,那么您正在使用Java安全套接字扩展(JSSE).

它将根据SSLContext用于创建此消息SSLSocket或用于创建此消息的证书来验证远程方的证书SSLEngine.

SSLContextTrustManager初步确定如何建立信任.

除非您需要特定配置,否则通常可以依赖于默认值:这将依赖于PKIX算法(RFC 3280)来针对一组信任锚(cacerts默认情况下为)验证证书.cacerts随Oracle JRE一起提供的是JKS密钥库,您可以向其添加其他证书.例如,您可以使用显式添加证书keytool.

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

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