【问题标题】:How to specify keystore location for Tomcat7 WAR?如何为 Tomcat7 WAR 指定密钥库位置?
【发布时间】:2014-06-05 15:35:54
【问题描述】:

我的文件系统上的/opt/myapp/keystore/myapp.jks 下有一个自定义JKS 文件(密钥库),我正在将myapp.war 部署到需要使用它的Tomcat7。

如果这是一个可执行的 JAR(而不是 WAR),我可能会这样做:

java -jar myapp.jar -Djavax.net.ssl.keyStore=/opt/myapp/keystore/myapp.jks
    -Djavax.net.ssl/keyStorePassword=mypasswd

在 Tomcat7 中如何/在哪里完成相同的操作?

【问题讨论】:

  • 您能否编辑您的问题以澄清 (a) 您是否希望 WAR 文件中的代码使用这些设置,或者 (b) 您是否希望 Tomcat 连接器使用这些设置来服务 HTTPS 请求?这些将是完全不同的答案。

标签: java ssl tomcat7 jks


【解决方案1】:

您可以将 SSL 连接器添加到 conf/server.xml 文件,如下例所示:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               keyAlias="your-cert-key" keystoreFile="your-keystore-path.keystore" 
               keystorePass="yourpassword"
               clientAuth="false" sslProtocol="TLS" />

【讨论】:

  • 这里,WAR 文件中的应用程序很可能将密钥库用于客户端证书,或者至少不用于配置服务器证书。在这里,您在服务器配置中配置的内容与 WAR 文件无关。
  • @Bruno ` to Tomcat7 that need to use it` => 所以,也许我不明白这个问题,但我知道他想要它的 tomcat7 使用这个密钥库。如果我错了,请告诉我。
  • 我将问题理解为“该 WAR 文件中的 webapp 需要使用它”(“需要使用它的 Tomcat7 的 myapp.war ”),而不是 Tomcat需要使用它...
  • @Bruno 让我们等待更多细节 :)。但是,如果我没记错的话,客户端证书是通过信任库而不是密钥库管理的。
  • 作为客户端,您的 客户端证书通过您的keystore 而非信任库进行管理。见this question
【解决方案2】:

有多种选择。

  • 如果您乐于让 JVM 全局访问这些设置,包括在 Tomcat 容器中运行的所有 WAR(但可能不包括服务器连接器本身,因为它可以单独配置),在catalina 启动脚本(.sh.bat 取决于平台)中将这些选项添加到JAVA_OPTS。这并不理想,因为实际上在该 JVM 中运行的任何代码都可以访问该密钥库,因此您需要确保它是可接受的。

  • 如果您可以更改代码,您可以为正在使用它的任何东西初始化单独的 SSLContexts(您可以从中获取 SSLEngineSSLSocketFactory,您可以使用它构建 SSLSockets 或初始化HttpsUrlConnection)。这些方面的东西应该可以工作:

    // Load the key store: change store type if needed
    KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
    FileInputStream fis = new FileInputStream("/path/to/keystore");
    try {
        ks.load(fis, keystorePassword);
    } finally {
        if (fis != null) { fis.close(); }
    }
    
    SSLContext sslContext = SSLContext.getInstance("TLS");
    // the second "null" argument will let you use the default trust manager settings.
    sslContext.init(kmf.getKeyManagers(), null, null);
    
    SSLSocketFactory sslSocketFactory = sslContext.getSSLSocketFactory();
    

    您可以从 web 应用程序中的资源加载密钥库,而不是 FileInputStream,或者可能通过 JNDI,具体取决于您要如何配置整体设置。

【讨论】:

  • 谢谢@Bruno (+1) - 我很欣赏这个答案,我应该澄清一下,我只是将 1 个 WAR 部署到 Tomcat 实例,因此定义 Tomcat 范围(不是特定于应用程序)就足够了) SSL 设置。不过再次感谢!
  • 当然,但是您当前接受的其他答案中的设置只会影响 Tomcat 连接器,而不影响在其中运行的 WAR 应用程序。如果您希望在您的 WAR 中运行的应用程序使用这些设置,您将需要我刚才提到的两个选项之一(如果您只有一个应用程序,可能是第一个选项)。
猜你喜欢
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 2016-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-25
  • 2021-12-05
相关资源
最近更新 更多