我说我有两个Java应用程序:Ping.jar
和Pong.jar
,它们可以在两个不同的服务器上部署和运行(Ping.jar
部署到srv-01.myorg.com
和{{ 1}}部署到Pong.jar
),这两个应用程序需要通过SSL相互通信(双向)。我们还假设每个应用都有自己的SSL证书。
srv-02.myorg.com
和Ping
如何验证彼此的SSL证书?每个CA是否提供某种我可以使用的RESTful API,比如Pong
? Java是否有自己的证书验证API?是否有我可以使用的开源第三方JAR或服务?当我在网上搜索时,我感到很惊讶。
答案 0 :(得分:23)
如果您使用Java SE SSL / TLS类(例如SSLSocket
或SSLEngine
)进行连接,则表示您正在使用Java Secure Socket Extension (JSSE)。
它将根据用于创建此SSLContext
或SSLSocket
的{{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证书验证应包括以下步骤: