我正在使用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它。