我正在使用 Apache Tomcat webapp 作为 IIS 托管 web 服务的客户端 (java)。我需要使用 SSL 进行客户端身份验证。客户端使用哪种匹配标准将客户端证书作为 ServerHello 的一部分的证书请求 (CertificateRequest) 发送到服务器。
我在 IE 中安装了客户端证书并访问 WSDL,然后它会提示输入客户端证书,我选择我安装的证书并且它可以工作。
如果需要的话,我可以发送调试 SSL 转储。
答案1
最终,将使用客户端使用X509KeyManager
的机制发送证书。SSLContext
SSLSocket
SSLEngine
默认SSLContext
使用系统属性初始化其密钥管理器javax.net.ssl.keyStore*
。(见这个答案对于“密钥库”和“信任库”之间的区别:两者都使用“密钥库”API/存储格式。)
最简单的方法是使用这些属性配置运行 Tomcat 的 JVM,您的客户端/webapp 在其中运行javax.net.ssl.keyStore*
。默认SSLContext
会选择它,并且默认情况下它用于 HTTPS 连接(即使第三方 HTTPS 库也倾向于使用它)。
如果您需要针对特定请求提供更具体的内容,则可能需要更改 web 应用程序代码,以便在给定的SSLContext
请求中使用特定的密钥库(或至少选择特定的证书)。
如何配置运行 Tomcat 的 JVM 将取决于启动脚本。如果在 Windows 下,这个问题应该有所帮助,否则,我怀疑在某处有一行catalina.sh
可以设置系统属性。
如果您为此配置了全局javax.net.ssl.keyStore*
,这将影响整个 VM,包括连接器。为了防止 Tomcat 连接器使用该密钥库,请确保配置<Connector />
确实指定了其自己的keyStore*
属性(以免使用系统属性中的值)。
如果您的密钥库中有多个证书(带有私钥),则应根据服务器在其CertificateRequest
消息中发送的 CA 列表自动进行选择。默认情况下,密钥管理器将选择它在配置的密钥库中找到的第一个由该列表中的 CA(或中间 CA)颁发的证书。如果您需要更具体的内容(特别是如果您的密钥库中有多个有效候选证书),您需要实现自己的X509KeyManager
,将逻辑放入chooseClientAlias
,用它初始化SSLContext
,并且使任何发出这些请求的 API 使用它。