Java中的SSL证书验证

时间:2012-06-21 17:17:34

标签: java ssl

我说我有两个Java应用程序:Ping.jarPong.jar,它们可以在两个不同的服务器上部署和运行(Ping.jar部署到srv-01.myorg.com和{{ 1}}部署到Pong.jar),这两个应用程序需要通过SSL相互通信(双向)。我们还假设每个应用都有自己的SSL证书。

  • 我是一名Java程序员,代码srv-02.myorg.comPing如何验证彼此的SSL证书?每个CA是否提供某种我可以使用的RESTful API,比如Pong? Java是否有自己的证书验证API?是否有我可以使用的开源第三方JAR或服务?

当我在网上搜索时,我感到很惊讶。

4 个答案:

答案 0 :(得分:23)

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

它将根据用于创建此SSLContextSSLSocket的{​​{1}}来验证远程方的证书。

SSLEngine将使用TrustManager进行初始化,以确定应如何建立信任。

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

您还可以通过编程方式(如this answer中所述)基于自定义密钥库创建keytool,并将其用于不影响默认密码库的特定X509TrustManager。< / p>

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

答案 1 :(得分:1)

您可以通过将HandshakeCompletedListener附加到SSLSocket并从活动中获取证书,或者从SSLSession获取SSLSocket来获取对等证书并从会话中获取对等证书。

SSL提供对等身份的隐私,完整性和身份验证。应用程序是否必要时应检查该对等标识是否是应用程序所期望的标识以及该标识允许在应用程序中执行的操作。这是“授权”步骤,SSL无法为您执行此操作。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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