我的应用程序如何访问 Tomcat server.xml 中配置的 keyStore.jks

How can my application access the keyStore.jks configured in Tomcat server.xml

在conf/server.xml中我写了以下文字:

<Connector port="8443" SSLEnabled="true" maxHttpHeaderSize="8192" 
    maxThreads="150" minSpareThreads="25" maxSpareThreads="200"
    enableLookups="false" disableUploadTimeout="true"         
    acceptCount="100" scheme="https" secure="true"
     clientAuth="false" sslProtocol="TLS"
     keystoreFile="keyStore" keystorePass="password" keystoreType="JKS"
     keyAlias="tomcat"/>

接下来我需要在代码中(在服务器端的servlet中)使用keyStore的内容。

我试过这个:

 System.getProperty("javax.net.ssl.keyStore")

但它 returns keyStore 的名称。

那么有什么办法可以获取到keyStore的内容吗?或者我应该对服务器进行另一个配置?

(我的下一步是从 keyStore 中提取私钥和 public 密钥并将它们用于 JWT)

我想你应该可以通过 ServerFactory.getServer().findServices()[0].findConnectors()[0]org.apache.tomee.loader.TomcatHelper.getServer() 获取参数值(取决于你的版本 Tomcat - 参见 this question),然后照常使用它们打开密钥库 (KeyStore.getInstance(...).load(...))。

但我建议您使用另一个密钥库 + 密钥,在专门的配置中满足您的 JWT 需求,以便:

  • 您的代码与 Tomcat(= 可移植性)
  • 没有紧密耦合
  • 您的操作员不需要关心您的应用程序的特定需求(and/or 不会愿意更新他们所有 tomcat 服务器上使用的标准 SSL 密钥库)
  • 您没有使用相同的密钥进行加密 (SSL) 和授权 (JWT)。让攻击者的日子难过一点总是好的。

如果您的应用程序中没有配置文件,并且不想添加一个,那么您可以简单地期望一个系统 属性 被定义为带有密钥库的路径。例如,在命令行中使用 -Djwt.keystore=<keystore location> 启动 Tomcat。