java - 如何为 Tomcat7 WAR 指定 keystore 位置?

标签 java ssl tomcat7 jks

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

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

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

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

最佳答案

有多种选择。

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

  • 如果您可以更改代码,则可以为使用它的任何对象初始化单独的 SSLContext(您可以获得一个 SSLEngine 或一个 SSLSocketFactory 从它,你可以用它构建 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 加载 keystore ,或者可能通过 JNDI,具体取决于您希望如何配置整体设置。

关于java - 如何为 Tomcat7 WAR 指定 keystore 位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24064399/

相关文章:

javascript - 带有 SSL 的 stomp+ActiveMQ

C++ SSL/HTTPS 301 重定向循环

spring - 将Spring Boot RESTful Web Service部署到Tomcat时,Web.xml仍然丢失

java - 如何使用 + 或 - 拆分给定的字符串?

java - 创建单个列表的列表以在 HashMap 中使用

Java BufferedReader openvms

java - 无法调用 persistence.xml 文件中的 JNDI 资源

java - 如何对 JTable 中找到的符号着色?

git - TortoiseGit "SSL tlsv1 alert protocol version"问题

Tomcat 7 上的 JSP 失败,NoClassDefFoundError : Lorg/apache/AnnotationProcessor