如何为Tomcat7 WAR指定密钥库位置?

时间:2014-06-05 15:35:55

标签: java ssl tomcat7 jks

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

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

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

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

2 个答案:

答案 0 :(得分: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" />

答案 1 :(得分:2)

有多种选择。

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

  • 如果您可以更改代码,则可以针对使用它的任何内容初始化单独的SSLContext(您可以从中获取SSLEngineSSLSocketFactory,您可以构建SSLSocket或初始化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加载密钥库,具体取决于您希望如何配置整体设置。