我想知道是否有一種方法可以配置 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 結合使用的基本步驟是:
- 建立一個文件:
/etc/java-<name>.cfg
姓名 =<hsm_名稱>
(根據您的發行版調整庫路徑。此設定檔的完整文件可以在Java PKCS#11 指南.)
庫= /usr/lib/p11-kit-proxy.so - 在您的文件中新增一行
java.security
:安全提供者。編號=sun.security.pkcs11.SunPKCS11 /etc/java-<名字>.cfg
- 運行 keytool 並確保它顯示您的 HSM 內容:
keytool --list --storetype PKCS11
最後,設定 Tomcat 使用 PKCS#11:
<Connector ... keystore="NONE" keystoreType="PKCS11" keystoreProvider="SunPKCS11-hsm_name" keystorePass="[HSM PIN here]" />
使用遠端伺服器上的 PKCS#11 模組
這p11-試劑盒軟體包附帶兩個可以實現此目的的組件:
PKCS#11模組
p11-kit-proxy.so
,可作為多工器,可根據配置載入各種其他模組。除此之外,它還可以透過管道與進程外模組進行通訊。該
p11-kit remote
工具充當 p11-kit 進程外模組支援的另一個管道端。它可以透過 SSH 或任何其他隧道使用。
首先在 HSM 方面:
- 安裝 p11-kit 並選擇或建立將使用它的使用者帳戶。
- 在該使用者帳戶中建立一個文件,向 p11-kit 告知您的 HSM PKCS#11 模組。該文件的內容由一行組成:
~/.config/pkcs11/modules/<name>.module
模組:/usr/lib/<hsm_pkcs11_名稱>。
(或者,您可以在系統範圍的目錄中建立它/usr/share/p11-kit/modules/
。) - 確保
p11-kit list
並p11tool --list-tokens
使用 HSM。
注意:此計劃實際上不需要步驟 2-3;它們的存在只是為了儘早發現可能出現的問題。如果發現 p11-kit 與 HSM 模組不相容,這將為您節省一些工作。 (如果它相容,那麼您將能夠使用p11tool
它來管理它。)
然後在Tomcat端:
- 也要安裝 p11-kit。
- 為 Tomcat 建立 SSH 金鑰對,並將其放入 HSM 帳戶中
authorized_keys
以進行無密碼 SSH 使用。 - 再次在 Tomcat 使用者帳戶的主目錄中建立一個文件,但這次文件的內容應如下所示:
~/.config/pkcs11/modules/<name>.module
遠端: |ssh user@hsmserver p11-kit 遠端 /usr/lib/<hsm_pkcs11_名稱>。
- 再次,確保
p11-kit list
並p11tool --list-tokens
工作。他們應該神奇地建立 SSH 連線並顯示有關遠端 HSM 的資訊。 - 若要加快遠端存取速度,請透過以下方式在 SSH 中啟用連線重複使用
~/.ssh/config
:主持人高速管理伺服器
ControlPath ~/.ssh/S.%r@%h:%p
ControlMaster 自動
ControlPersist 1h
keytool
如果一切正常,請嘗試與 p11-kit-proxy PKCS#11 模組一起使用:
- 建立一個
/etc/java-p11-kit.cfg
文件:名稱 = p11-kit
(根據您的發行版調整庫路徑。此設定檔的完整文件可以在Java PKCS#11 指南.)
庫 = /usr/lib/p11-kit-proxy.so - 在您的文件中新增一行
java.security
:安全提供者。編號=sun.security.pkcs11.SunPKCS11 /etc/java-p11-kit.cfg
- 運行 keytool 並確保它顯示您的 HSM 內容:
keytool --list --storetype PKCS11
最後,設定 Tomcat 使用 p11-kit-proxy PKCS#11 模組:
<Connector ... keystore="NONE" keystoreType="PKCS11" keystoreProvider="SunPKCS11-p11-kit" keystorePass="[HSM PIN here]" />