说我有两个Java应用程序,我写道: Ping.jar
和Pong.jar
,他们得到部署并在两个单独的服务器跑( Ping.jar
部署到srv-01.myorg.com
和Pong.jar
部署到srv-02.myorg.com
),而这两个应用程序需要通过SSL相互(双向通信)。 让我们还假设每个应用程序都有自己的SSL证书。
- 如何,一个Java程序员,代码
Ping
和Pong
核实对方的SSL证书? 是否每个CA提供某种REST的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在主题专有名称。
您可以通过附加得到同行证书HandshakeCompletedListener
到SSLSocket
,或者通过获取和正从该事件的证书SSLSession
从SSLSocket
和得到从会话中同证书。
SSL提供保密性,完整性和对等的身份认证。 无论是对等的身份是一个应用程序期待,以及什么身份允许应用程序做的,应该由应用程序在必要时进行检查。 这是“授权”的步骤,和SSL不能为你做。
你没有必要手动检查每个other's证书。
你只需要导入每个服务器证书到每个other's cacerts中,这样两台应用服务器会自动信任对方。