如何配置 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 模組

您可以快轉瀏覽本部分,但將 PKCS#11 與 Tomcat 結合使用的基本步驟是:

  1. 建立一個文件:/etc/java-<name>.cfg
    姓名 =<hsm_名稱>
    庫= /usr/lib/p11-kit-proxy.so
    (根據您的發行版調整庫路徑。此設定檔的完整文件可以在Java PKCS#11 指南.)
  2. 在您的文件中新增一行java.security
    安全提供者。編號=sun.security.pkcs11.SunPKCS11 /etc/java-<名字>.cfg
  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#11模組p11-kit-proxy.so,可作為多工器,可根據配置載入各種其他模組。除此之外,它還可以透過管道與進程外模組進行通訊。

  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-tokens使用 HSM。

注意:此計劃實際上不需要步驟 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 user@hsmserver p11-kit 遠端 /usr/lib/<hsm_pkcs11_名稱>
  4. 再次,確保p11-kit listp11tool --list-tokens工作。他們應該神奇地建立 SSH 連線並顯示有關遠端 HSM 的資訊。
  5. 若要加快遠端存取速度,請透過以下方式在 SSH 中啟用連線重複使用~/.ssh/config
    主持人高速管理伺服器
    ControlPath ~/.ssh/S.%r@%h:%p
    ControlMaster 自動
    ControlPersist 1h

keytool如果一切正常,請嘗試與 p11-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]" />
    

相關內容