繁体   English   中英

使用 Tomcat 的密钥库在 Tomcat 中进行 SSL 客户端调用

[英]Make SSL client call in Tomcat using Tomcat's keystore

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

如何找到配置 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 中定义。

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

更新:

这个问题很相似,其中一个答案指出 SSL 可以由 OpenSSL\\APR 处理,因此这里的任何解决方案都将在很大程度上取决于 Tomcat 的配置方式。 假设 JSSE,解决方案似乎是:

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

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

这些真的是我想要做的事情的最佳实践吗?

我认为除其他事项外,您还混淆了入站和出站 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM