具有单向和双向SSL的Tomcat

时间:2013-09-05 03:22:01

标签: tomcat ssl certificate ssl-certificate fqdn

我有一个服务A,它使用单向SSL和双向SSL来向服务B发出安全请求。单向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)。

我的单向SSL Tomcat配置的一部分:

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

是否有办法为Tomcat中的同一服务指定单向和双向(客户端)SSL。这里的挑战是我在同一个IP上使用2个证书(服务器和客户端1)。任何提示?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

我希望这是你的情景

服务A ---&gt; 1路SSL请求到端点 服务B ---&gt; 2路SSL请求到端点 Tomcat连接器配置了2路SSL

由于tomcat连接器配置了2路SSL,所有传入连接都将被验证用于握手;这意味着如果1路ssl端点没有密钥,则握手将失败。要解决此问题,您需要将1路ssl端点证书导入truststore

现在,1路和2路SSL都能正常工作