SSL证书验证在Java中(SSL Certificate Verification in Java

2019-06-25 16:30发布

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

  • 如何,一个Java程序员,代码PingPong核实对方的SSL证书? 是否每个CA提供某种REST的API,我可以用,比如,打HttpClient ? 难道Java的拥有自己的证书验证API? 是否有开源的第三方JAR文件或服务可以使用吗?

我被当我搜索了这个网上怎么一点打开了一惊。

Answer 1:

如果你使用的是Java SE SSL / TLS连接类(如SSLSocketSSLEngine ),您使用的Java安全套接字扩展(JSSE) 。

它会根据验证对方的证书SSLContext是用于创建本SSLSocketSSLEngine

SSLContext将被初始化TrustManager是决定信任如何建立。

除非你需要特定的配置,你经常可以依靠的默认值 :这将依赖于PKIX算法(RFC 3280)来验证(在针对一组信任锚证书cacerts默认情况下)。 cacerts ,附带了Oracle JRE是一个JKS密钥库,你可以添加额外的证书。 您可以添加明确使用证书keytool的例子。

您还可以创建一个X509TrustManager基于自定义密钥库程序(如描述这个答案 ),并在特定的使用它SSLContext不影响默认的。

除此之外,如果你使用自己的协议,你需要确认你已经获得的证书,您正在寻找的主机名匹配(参见RFC 6125)。 通常情况下,你可以看看在使用者替代名称X509Certificate你(获得来自链中的第一对证书SSLSession ),做不到这一点,寻找CN RDN在主题专有名称。



Answer 2:

您可以通过附加得到同行证书HandshakeCompletedListenerSSLSocket ,或者通过获取和正从该事件的证书SSLSessionSSLSocket和得到从会话中同证书。

SSL提供保密性,完整性和对等的身份认证。 无论是对等的身份是一个应用程序期待,以及什么身份允许应用程序做的,应该由应用程序在必要时进行检查。 这是“授权”的步骤,和SSL不能为你做。



Answer 3:

你没有必要手动检查每个other's证书。

你只需要导入每个服务器证书到每个other's cacerts中,这样两台应用服务器会自动信任对方。



文章来源: SSL Certificate Verification in Java
标签: java ssl