我有一个在Tomcat中运行的Web应用程序,它正在向另一个系统发出Web服务调用。我需要使用SSL和客户端身份验证来保护此通话。我托管的Tomcat已经正确配置了一个特定于环境的信任库和密钥库,因此我需要使用这些商店来保护我自己的呼叫。这是我卡住的地方。访问Tomcat配置的KeyStore和TrustStore
如何找到Tomcat配置的密钥库和信任库以进行自己的SSL调用?或者更好的是,用这些值生成一个正确配置的SSLContext或SSLSocketFactory?
事情我已经尝试:
我试图依靠SSLContext.getDefault()。这似乎没有设置。
我试图依靠系统属性:
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通过系统属性进行配置。
- 让商店住在服务器上的预定义位置。
- 在战争中打包自己的商店副本。
对于上面的前两个,您必须确保安全策略允许访问这些文件。
这些真的是我想要做的最好的实践吗?
[从Servlet访问SSL私钥]可能的重复(http://stackoverflow.com/questions/4048892/accessing-ssl-private-key-from-a-servlet) – Bruno 2012-03-19 16:13:33
请注意,一般来说,不是能够访问容器的SSL设置(特别是其私钥)是一项安全功能,因为Web应用可能不完全受信任。您可能也对此感兴趣:http://stackoverflow.com/q/5162279/372643 – Bruno 2012-03-19 16:23:03
我怀疑它可能是一个安全功能,但很奇怪,因为这些存储实际上非常容易访问,具体取决于Tomcat的配置方式。我希望有一种方法可以将servlet标记为可信任或某种东西。 – Don 2012-03-19 18:14:40