【问题标题】:Tomcat with 1-way and 2-way SSL具有 1 路和 2 路 SSL 的 Tomcat
【发布时间】:2013-09-08 17:58:33
【问题描述】:

我有一个使用 1-way SSL 和 2-way SSL 向服务 B 发出安全请求的服务 A。1-way SSL 由 Tomcat 配置指定,我提供 keystoreFile、keystorePass、启用 SSL 等。2 -way SSL 在客户端(服务 A)上使用 JSSE 实现。我知道这也可以在 Tomcat server.xml 中以类似方式完成(示例在这里:http://blog1.vorburger.ch/2006/08/setting-up-two-way-mutual-ssl-with.html)。

我的 1-way SSL Tomcat 配置的一部分:

<Connector port="securePort"
           scheme="https"
           secure="true"
           clientAuth="false"
           sslProtocol="TLS"
           SSLEnabled="true"
           keystoreFile="keystoreFile"
           keystorePass="keystorePass"
           keystoreType="keystoreType"
           ...
/>

有没有办法为 Tomcat 中的同一服务同时指定 1 路和 2 路(客户端)SSL。这里的挑战是我在同一个 IP 上使用 2 个证书(服务器和客户端一个)。有什么提示吗?

【问题讨论】:

    标签: tomcat ssl certificate ssl-certificate fqdn


    【解决方案1】:

    当服务 A 通过客户端身份验证向服务 B 发出 SSL 请求时,它不是服务器,而是客户端。这与在运行服务 A 的 Tomcat 服务器上配置客户端身份验证无关。

    您的服务 A 如何获取其密钥库设置(它用作客户端)取决于它的实现方式以及用于建立这些连接的库。它与任何独立客户端都没有特别的不同。

    它可能至少会通过系统属性获取默认设置。您可以在容器中设置javax.net.ssl.keyStore(及相关)系统属性(例如,通过catalina.sh.bat 中的JAVA_OPTS)。但是,这些设置将可供容器中运行的所有 webapps 使用(但如果您在那里配置了不同的密钥库,则 &lt;Connector/&gt; 配置不会使用这些设置)。像这样影响容器中的所有 web 应用程序可能并不总是可取的。

    您还可以拥有您的客户端代码可以加载的密钥库文件(例如,在WEB-INF 下的某个位置)并将此密钥库作为资源流加载以初始化您的客户端库使用的SSLContext(如果您的客户端应用程序可以使用此类设置)。另一种可能的方法是通过 JNDI 传递密钥库。这一切都取决于您希望如何配置服务的部署以及期望如何配置其代码。

    【讨论】:

      【解决方案2】:

      我希望这是你的场景

      服务 A ---> 1 向端点的 SSL 请求 服务 B ---> 对端点的 2 路 SSL 请求 Tomcat 连接器配置了 2 路 SSL

      由于 tomcat 连接器配置了 2 路 SSL,所有传入连接都将进行握手验证;这意味着如果 1 路 ssl 端点没有密钥,握手将失败。要克服这个问题,您需要将 1 路 ssl 端点证书导入到信任库中

      现在 1 路和 2 路 SSL 都可以工作

      【讨论】:

        最近更新 更多