Apache Tomcat 中的 Web 应用程序如何使用 SSL/TLS 客户端证书身份验证作为客户端?

Apache Tomcat 中的 Web 应用程序如何使用 SSL/TLS 客户端证书身份验证作为客户端?

我正在使用 Apache Tomcat webapp 作为 IIS 托管 web 服务的客户端 (java)。我需要使用 SSL 进行客户端身份验证。客户端使用哪种匹配标准将客户端证书作为 ServerHello 的一部分的证书请求 (CertificateRequest) 发送到服务器。

我在 IE 中安装了客户端证书并访问 WSDL,然后它会提示输入客户端证书,我选择我安装的证书并且它可以工作。

如果需要的话,我可以发送调试 SSL 转储。

答案1

最终,将使用客户端使用X509KeyManager的机制发送证书。SSLContextSSLSocketSSLEngine

默认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 使用它。

相关内容