【发布时间】:2012-04-04 01:57:33
【问题描述】:
我有一个在 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,解决方案似乎是:
- 确保通过系统属性配置 Tomcat。
- 让商店位于服务器上的预定义位置。
- 在您的战争中打包您自己的商店副本。
对于上述前两个,您必须确保安全策略允许访问这些文件。
这些真的是我尝试做的最佳实践吗?
【问题讨论】:
-
请注意,一般来说,无法访问容器的 SSL 设置(尤其是其私钥)是一项安全功能,因为 Web 应用程序可能不完全受信任。您可能也对此感兴趣:stackoverflow.com/q/5162279/372643
-
我怀疑这可能是一项安全功能,但奇怪的是,这些存储实际上很容易访问,具体取决于 Tomcat 的配置方式。我希望有一种方法可以将 servlet 标记为受信任之类的。
-
如果您在启动 Tomcat 的脚本中配置系统属性(例如
catalina.sh或其 Windows 等效项,请参见上面的第二个链接),您应该能够访问系统属性(假设您是未使用安全管理器或已配置为允许)。 -
我不认为这是 Accessing SSL Private Key From a Servlet 的副本。虽然相关,但这是一个关于如何管理密钥/信任库的更普遍的问题。这篇文章比其他文章对我的帮助更大(针对我的特定问题)。我认为这个问题应该保留。