如何配置 Tomcat 以使用 SSL 加密并将私钥存储在远程服务器上?

如何配置 Tomcat 以使用 SSL 加密并将私钥存储在远程服务器上?

我想知道是否有办法配置 Tomcatserver.xml以使用 SSL 加密,并使用远程存储在服务器上的私钥。我可以想象服务器配置会是这样的

Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
proxyPort=""
keystoreFile="{./script-return}/keystore.jks"
keystorePass="12345"
keystoreType="jks"
truststorePass="12345"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS" />

但该keystoreFile指令指向从远程服务器提取私钥的脚本。

Tomcat 配置中是否有办法使其指向 shell 脚本来提取密钥?

我发现了一些关于信托经理但我可以看到该路径必须指向文件系统路径,这对我来说不是一种选择。

答案1

“提取密钥”完全违背了使用 HSM 的意义——这意味着私钥仍然存储在 Tomcat 的内存中(因此有可能通过 Heartbleed 等技术窃取),任何看到它的人server.xml仍然可以通过以下方式窃取它:只需运行完全相同的命令就像 Tomcat 一样。

你的想法只有当你能制作 Tomcat 时才有意义发送签名请求到 HSM。这会增加一点延迟(因为每个 TLS 连接都必须到达 HSM),但这是唯一真正增加安全性的方法。

(它甚至不需要是真正的 HSM;它甚至可以是在同一系统上运行的 SoftHSM2,只要它牢牢地将密钥保存在一个用户帐户上,将 Tomcat 保存在另一个用户帐户上,它仍然会更安全。)

在同一系统上使用 PKCS#11 模块

您可以快进此部分,但在 Tomcat 中使用 PKCS#11 的基本步骤是:

  1. 创建一个文件:/etc/java-<name>.cfg
    名称 =<hsm_名称>
    库 = /usr/lib/p11-kit-proxy.so
    (根据您的发行版调整库路径。此配置文件的完整文档可以在Java PKCS#11 指南
  2. java.security在您的文件中添加新行:
    安全.提供者。数量=sun.security.pkcs11.SunPKCS11 /etc/java-<名称>配置文件
  3. 运行 keytool 并确保它显示您的 HSM 内容:
    keytool --list --storetype PKCS11
  4. 最后,配置 Tomcat 以使用 PKCS#11:

    <Connector ...
               keystore="NONE"
               keystoreType="PKCS11"
               keystoreProvider="SunPKCS11-hsm_name"
               keystorePass="[HSM PIN here]" />
    

使用远程服务器的 PKCS#11 模块

p11 套件软件包附带两个可以实现此目的的组件:

  1. PKCS p11-kit-proxy.so#11 模块,充当多路复用器,可根据配置加载各种其他模块。除其他功能外,它还可通过管道与进程外模块进行通信。

  2. p11-kit remote工具充当 p11-kit 进程外模块支持的另一个管道端。它可以通过 SSH 或任何其他隧道使用。

首先从 HSM 方面来说:

  1. 安装 p11-kit 并选择或创建将使用它的用户帐户。
  2. 在该用户帐户中创建一个文件,以告知 p11-kit 有关您的 HSM PKCS#11 模块的信息。该文件的内容由一行组成:~/.config/pkcs11/modules/<name>.module
    模块:/usr/lib/<hsm_pkcs11_名称>。所以
    (或者,您可以在系统范围目录中创建它/usr/share/p11-kit/modules/。)
  3. 确保p11-kit listp11tool --list-tokensHSM 配合使用。

注意:本计划实际上不需要步骤 2-3;它们只是为了尽早发现可能出现的问题。如果事实证明 p11-kit 与 HSM 模块不兼容,这将为您节省一些工作。(如果它兼容,那么您将能够使用它来p11tool管理它。)

然后在Tomcat端:

  1. 也安装 p11-kit。
  2. 为 Tomcat 创建一个 SSH 密钥对,并将其放入 HSM 账户中,authorized_keys以实现无密码 SSH 使用。
  3. 再次在 Tomcat 用户帐户的主目录中创建一个文件,但这次文件的内容应如下所示:~/.config/pkcs11/modules/<name>.module
    远程:|ssh 用户@hsmserver p11-kit 远程 /usr/lib/<hsm_pkcs11_名称>。所以
  4. 再次确认p11-kit list并正常p11tool --list-tokens工作。它们应该会神奇地建立 SSH 连接并显示有关远程 HSM 的信息。
  5. 为了加快远程访问,请通过以下方式在 SSH 中启用连接多路复用~/.ssh/config
    主持人高速缓存服务器
    ControlPath ~/.ssh/S.%r@%h:%p
    ControlMaster 自动
    ControlPersist 1h

如果一切正常,请尝试使用keytoolp11-kit-proxy PKCS#11 模块:

  1. 创建一个/etc/java-p11-kit.cfg文件:
    名称 = p11-kit
    库 = /usr/lib/p11-kit-proxy.so
    (根据您的发行版调整库路径。此配置文件的完整文档可以在Java PKCS#11 指南
  2. java.security在您的文件中添加新行:
    安全.提供者。数量=sun.security.pkcs11.SunPKCS11 /etc/java-p11-kit.cfg
  3. 运行 keytool 并确保它显示您的 HSM 内容:
    keytool --list --storetype PKCS11
  4. 最后,配置 Tomcat 以使用 p11-kit-proxy PKCS#11 模块:

    <Connector ...
               keystore="NONE"
               keystoreType="PKCS11"
               keystoreProvider="SunPKCS11-p11-kit"
               keystorePass="[HSM PIN here]" />
    

相关内容