[英]Make SSL client call in Tomcat using Tomcat's keystore
我有一个在 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 中定义。
有没有一些简单的方法可以做到这一点,我忽略了?
更新:
这个问题很相似,其中一个答案指出 SSL 可以由 OpenSSL\\APR 处理,因此这里的任何解决方案都将在很大程度上取决于 Tomcat 的配置方式。 假设 JSSE,解决方案似乎是:
对于上面的前两个,您必须确保安全策略允许访问这些文件。
这些真的是我想要做的事情的最佳实践吗?
我认为除其他事项外,您还混淆了入站和出站 SSL 连接。 Server.xml 包含入站 SSL 设置。
在 Java 中使用出站 SSL 时,应在 Tomcat 启动时显式设置 javax.net.ssl.trustStore* 和 javax.net.ssl.keyStore*。 请记住,除非您编写自己的密钥管理器,否则默认情况下密钥库只能包含一个私钥。
大多数著名的 Web 服务库使用标准 HTTP 库,这些库使用 HTTPConnection/HTTPSConnection 或 Jakatta HTTPClient,如果服务器请求,将从密钥库中提供客户端证书。 您不需要创建自己的 SSLContext。
如果您要终止入站 Web 服务调用,那么我会在需要时使用带有 SSL 和客户端身份验证的 Apache HTTP Server。
为清楚起见进行编辑: javax.net.ssl.keyStore
指定的密钥库可以包含多个私钥/证书对,但除非您编写自己的KeyManager
否则您将无法使用其他私钥/证书。 当您在 Tomcat 中终止入站 SSL 连接时,这可能是一个问题 - 您将需要一个用于外部入站连接的私钥/证书和另一个用于出站连接的私钥/证书。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.