2

我的文件系统上有一个自定义 JKS 文件(密钥库),/opt/myapp/keystore/myapp.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 中如何/在哪里完成相同的任务?

4

2 回答 2

2

有多种选择。

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

  • 如果您可以更改代码,则可SSLContext以为使用它的任何东西初始化单独的 s(您可以从中获取 anSSLEngine或 an SSLSocketFactory,您可以使用它们构建SSLSockets 或初始化 an 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();
    

    您可以从 webapp 中的资源加载密钥库,而不是FileInputStream通过 JNDI,这取决于您希望如何配置整体设置。

于 2014-06-05T16:12:44.080 回答
2

您可以将 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" />
于 2014-06-05T15:44:58.700 回答