在 OpenSSL 中使用 Cloud HSM 金鑰

本指南提供操作說明,說明如何在 Debian 11 (Bullseye) 上設定 OpenSSL,以便使用 Cloud HSM 金鑰。即使您使用的是其他作業系統或環境,這些操作說明通常也適用,但請注意,可能會有些微差異。

需求條件

下載程式庫的發布版本即可開始使用。如要進一步瞭解 PKCS #11 程式庫,請參閱使用手冊

開始前,請先安裝 libengine-pkcs11-openssl 套件。

sudo apt-get update
sudo apt-get install libengine-pkcs11-openssl

設定

設定 PKCS11_MODULE_PATH 環境變數。

為了讓 openssl 使用 PKCS #11 程式庫,請設定 PKCS11_MODULE_PATH 環境變數:

export PKCS11_MODULE_PATH="/path/to/libkmsp11.so"

如要永久設定環境變數,請執行下列指令,將 export PKCS11_MODULE_PATH="/path/to/libkmsp11.so" 新增至 /etc/profile

echo 'export PKCS11_MODULE_PATH="/path/to/libkmsp11.so"' | sudo tee -a /etc/profile

PKCS #11 程式庫設定

PKCS #11 程式庫需要 YAML 設定檔來尋找 Cloud KMS 資源。YAML 至少必須設定一個 PKCS #11 權杖。

如果您將 OpenSSL 與其他可能會分支的程序 (例如 Apache 或 Nginx) 搭配使用,請務必確認 refresh_interval_secs 欄位未設定,或已設為 0。

設定檔範例:

---
tokens:
  - key_ring: "projects/my-project/locations/us-central1/keyRings/my-keyring"

有了這項設定,程式庫中就會提供 my-keyring 中的所有非對稱簽署和解密金鑰。

您必須設定設定檔的權限,讓只有檔案擁有者可以寫入檔案。將 KMS_PKCS11_CONFIG 指向設定檔:

export KMS_PKCS11_CONFIG="/path/to/pkcs11-config.yaml"

同樣地,您可以將這項設定新增至 /etc/profile,即可永久保留這項設定。

echo 'export KMS_PKCS11_CONFIG="/path/to/pkcs11-config.yaml"' | sudo tee -a /etc/profile

執行 OpenSSL 指令

在正確設定引擎和程式庫後,您現在可以在 OpenSSL 指令中使用引擎。

建立非對稱簽名時,請注意 Cloud KMS 金鑰只能使用單一摘要。舉例來說,使用 EC_SIGN_P256_SHA256 演算法的 CryptoKeyVersion 一律必須搭配 SHA-256 摘要使用。這會對應至 OpenSSL 中的 -sha256 旗標。需要 SHA-384 或 SHA-512 摘要的金鑰應搭配 -sha384-sha512 旗標使用。

建立新的簽名

假設已設定的金鑰環中含有名為 foo 的金鑰,請使用下列指令在 bar.txt 上建立簽名:

openssl dgst -sha256 -engine pkcs11 -keyform engine -sign pkcs11:object=foo bar.txt

這個指令的輸出內容是未格式化的二進位檔。

該指令假設您使用的是採用 SHA-256 摘要的金鑰,因此使用了 -sha256 引數。-sha384-sha512 選項適合使用這些摘要類型的 Cloud HSM 金鑰。

針對 RSA-PSS 金鑰,請務必使用先前討論的 -sigopt 選項。

建立新的憑證簽署要求

您也可以為 Cloud HSM 簽署金鑰產生憑證簽署要求 (CSR)。如果憑證授權單位要求您提供 CSR,以便產生新的憑證來簽署程式碼,或保護 TLS 網頁工作階段,這項功能就很實用。

openssl req -new -subj '/CN=test/' -sha256 -engine pkcs11 \
  -keyform engine -key pkcs11:object=foo > my-request.csr

產生新的自行簽署憑證

如要進行本機開發和測試,您可以為 Cloud HSM 簽署金鑰使用自行簽署的憑證。自行簽署的憑證也適用於 SAML 權杖簽署。

openssl req -new -x509 -days 3650 -subj '/CN=test/' -sha256 -engine pkcs11 \
  -keyform engine -key pkcs11:object=foo > my-request.crt

使用 PKCS #11 Spy 排解問題

PKCS #11 Spy 是開放原始碼工具,可記錄透過 PKCS #11 介面進行互動的內容。這項工具會位於應用程式和 PKCS #11 程式庫之間,並記錄所有發出的呼叫。這項設定在疑難排解時相當實用,

如要使用 PKCS #11 Spy,您必須先安裝 opensc 套件。opensc 套件包含 PKCS #11 Spy。如要確認已安裝 opensc,請執行下列指令:

sudo apt-get install opensc

接著,執行下列指令,設定 PKCS11_MODULE_PATH 環境變數,將 OpenSSL 指向 PKCS #11 Spy 程式庫:

export PKCS11_MODULE_PATH=/usr/lib/x86_64-linux-gnu/pkcs11-spy.so

最後,請設定 PKCS11SPYPKCS11SPY_OUTPUT 環境變數,將 PKCS #11 Spy 指向 Cloud HSM PKCS #11 程式庫。如要設定這些環境變數,請執行下列指令:

export PKCS11SPY="/path/to/libkmsp11.so"
# Optional, stderr will be used for logging if not set
export PKCS11SPY_OUTPUT="/path/to/pkcs11-spy.log"