Apache Tomcat中的webapps如何使用SSL / TLS客户端 – 证书身份validation作为客户端?

我正在使用Apache Tomcat webapp作为客户端(Java)到IIS托pipe的Web服务。 我需要使用客户端身份validation的SSL。 客户端使用什么样的匹配标准将客户端证书作为ServerHello的一部分CertificateRequest的一部分发送到服务器。

我在IE中安装了客户端证书,然后访问WSDL,然后提示客户端证书,我select了我安装的那个证书。

如果需要,我可以发送debuggingSSL转储。

最终,证书将使用客户端使用的SSLSocket / SSLEngine使用的SSLContext使用的X509KeyManager的机制发送。

默认的SSLContext使用javax.net.ssl.keyStore*系统属性初始化其密钥pipe理器。 (关于“密钥存储”和“信任存储”之间的区别,请参阅这个答案 :都使用“密钥存储”API /存储格式。)

最简单的方法是使用这些javax.net.ssl.keyStore*属性来configuration运行Tomcat的JVM,在该JVM中运行您的客户端/ web应用程序。 默认的SSLContext会将其提取出来,默认情况下用于HTTPS连接(即使第三方HTTPS库也倾向于使用它)。

如果您需要更具体的特定请求,您可能需要更改Web应用程序代码,以便在给定的SSLContext中为该请求使用特定的密钥库(或至lessselect特定的证书)。

如何configuration运行Tomcat的JVM将取决于启动脚本。 如果在Windows下, 这个问题应该有所帮助,否则,我怀疑catalina.sh中有一行可以设置系统属性。

如果为此configuration了全局javax.net.ssl.keyStore* ,则这将影响整个VM,包括连接器。 要防止使用该密钥库的Tomcat连接器,请确保<Connector />configuration确实指定了其自己的keyStore*属性(以免使用系统属性中的值)。

如果密钥库中有多个证书(带有私钥),则应根据服务器在其CertificateRequest请求消息中发送的CA列表自动进行select。 默认情况下,密钥pipe理器将获取在该列表(或中间CA)中由CA颁发的已configuration密钥库中find的第一个证书。 如果你需要一些更具体的东西(特别是如果你的密钥库中有多个有效的候选者),你需要实现自己的X509KeyManager ,把逻辑放在X509KeyManager ,用它初始化一个SSLContext ,并使这些请求使用的API它。