我有一个在Tomcat中运行的Web应用程序正在对另一个系统进行Web服务调用。我需要使用SSL和客户端身份验证来保护此调用。我托管的Tomcat已经正确配置了特定于环境的信任库和密钥库,因此我需要使用这些商店来保护自己的呼叫。这就是我被困住的地方。
如何找到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,解决方案似乎是:
对于前两个,您必须确保安全策略允许访问这些文件。
这些确实是我正在尝试做的最佳做法吗?
答案 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连接时,这可能是一个问题 - 您需要外部入站连接的私钥/证书和出站连接的另一个私钥/证书。