使用Tomcat的密钥库在Tomcat中进行SSL客户端调用

时间:2012-03-19 15:06:57

标签: java tomcat ssl keystore

我有一个在Tomcat中运行的Web应用程序正在对另一个系统进行Web服务调用。我需要使用SSL和客户端身份验证来保护此调用。我托管的Tomcat已经正确配置了特定于环境的信任库和密钥库,因此我需要使用这些商店来保护自己的呼叫。这就是我被困住的地方。

如何找到Tomcat配置的密钥库和信任库来进行自己的SSL调用?或者更好的是,使用这些值生成正确配置的SSLContext或SSLSocketFactory?

我尝试过的事情:

  1. 我尝试依赖SSLContext.getDefault()。这似乎没有设定。

  2. 我尝试依赖系统属性:

    System.getProperty("javax.net.ssl.trustStore");
    System.getProperty("javax.net.ssl.trustStorePassword");
    System.getProperty("javax.net.ssl.trustStoreType");
    System.getProperty( "javax.net.ssl.keyStore");
    System.getProperty( "javax.net.ssl.keyStorePassword");
    System.getProperty("javax.net.ssl.keyStoreType");
    
  3. 但这似乎是一个脆弱的解决方案,因为Tomcat不必配置系统属性。在其中一个测试环境中,设置了信任库信息,但密钥库变量不是。它们是在Tomcat的server.xml中定义的。

    有一些简单的方法可以做到这一点,我忽略了吗?

    已更新:

    This question is similar并且其中一个答案指出SSL可以由OpenSSL \ APR处理,因此这里的任何解决方案都将在很大程度上取决于Tomcat的配置方式。假设JSSE,解决方案似乎是:

    • 确保通过系统属性配置Tomcat。
    • 将商店置于服务器上的预定义位置。
    • 在战争中打包自己的商店副本。

    对于前两个,您必须确保安全策略允许访问这些文件。

    这些确实是我正在尝试做的最佳做法吗?

1 个答案:

答案 0 :(得分:-1)

我认为在其他方面你会混淆入站和出站SSL连接。 Server.xml包含入站SSL设置。

在Java中使用出站SSL时,应在Tomcat的启动中显式设置javax.net.ssl.trustStore *和javax.net.ssl.keyStore *。请记住,默认情况下,密钥库只能包含一个私钥,除非您编写自己的密钥管理器。

大多数众所周知的Web服务库使用标准HTTP库,这些库使用HTTPConnection / HTTPSConnection或Jakatta HTTPClient,并且如果服务器请求,将从密钥库中提供客户端证书。您不需要创建自己的SSLContext。

如果您要终止入站Webservice调用,那么我会使用带有SSL的Apache HTTP Server和客户端身份验证(如果需要)。

为清晰起见编辑:javax.net.ssl.keyStore指定的密钥库可以包含多个私钥/证书对,但除非您自己编写{{1},否则无法使用其他私钥/证书。 }。当您在Tomcat中终止入站SSL连接时,这可能是一个问题 - 您需要外部入站连接的私钥/证书和出站连接的另一个私钥/证书。

相关问题