2012-03-19 38 views
3

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

如何找到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"); 
    

但是,这似乎是一个脆弱的解决方案如Tomcat不具有与系统属性进行配置。在其中一个测试环境中,设置了信任商店信息,但密钥库变量不是。它们在Tomcat的server.xml中定义。

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

更新时间:

This question is similar和一个问题的答案指出,SSL可以通过OpenSSL的\ APR进行处理,所以这里的任何解决方案将在很大程度上取决于在Tomcat的配置方式。假设JSSE,解决方案似乎是:

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

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

这些真的是我想要做的最好的实践吗?

+0

[从Servlet访问SSL私钥]可能的重复(http://stackoverflow.com/questions/4048892/accessing-ssl-private-key-from-a-servlet) – Bruno 2012-03-19 16:13:33

+0

请注意,一般来说,不是能够访问容器的SSL设置(特别是其私钥)是一项安全功能,因为Web应用可能不完全受信任。您可能也对此感兴趣:http://stackoverflow.com/q/5162279/372643 – Bruno 2012-03-19 16:23:03

+0

我怀疑它可能是一个安全功能,但很奇怪,因为这些存储实际上非常容易访问,具体取决于Tomcat的配置方式。我希望有一种方法可以将servlet标记为可信任或某种东西。 – Don 2012-03-19 18:14:40

回答

0

我认为除了其他事情之外,你会混淆入站和出站SSL连接。 Server.xml包含入站SSL设置。

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

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

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

+0

如果我没有记错的话,如果你指定了别名,你可以在一个KeyStore中拥有多个私钥。 – Pith 2015-09-09 15:44:24