本指南提供操作說明,說明如何透過 CNG 供應器和 SignTool,建立用於 Microsoft Authenticode 簽署的 Cloud HSM 金鑰。
您可以在 kms-solutions GitHub 存放區中,找到以 Terraform 為基礎的藍圖版本教學課程。
用途
本文件所述的工作流程有助於滿足下列企業安全需求:
- 使用由 FIPS140-2 第 3 級 HSM 保護的私密金鑰簽署韌體。
- 使用 Windows 標準 SignTool 工具簽署 Windows 構件。
事前準備
如要完成本教學課程,您需要取得下列項目:
- 含有要簽署的構件 Windows 機器。
- 最新的 Cloud KMS CNG 供應器版本,可使用隨附的 .msi 安裝程式在 Windows 電腦上安裝。
Cloud Shell 或您自己的 Linux 機器,以產生憑證簽署要求或憑證。在這個電腦上完成「OpenSSL 設定」一文中所述的設定,下載並設定 PKCS#11 程式庫。
請記得執行 gcloud auth application-default login
(如果尚未執行)。
如果尚未下載,請在 Windows 電腦上下載最新的 Windows SDK,其中包含 SignTool。
設定
建立由 Cloud KMS 代管的簽署金鑰
使用 Cloud Shell 或您自己的電腦,使用下列指令在 Google Cloud 專案中建立 Cloud KMS 金鑰環:
gcloud kms keyrings create "KEY_RING" --location "LOCATION"
接著,在您剛建立的金鑰環中,在Google Cloud 專案中建立 Cloud KMS EC-P256-SHA256
硬體簽署金鑰:
gcloud kms keys create "KEY_NAME" --keyring "KEY_RING" \
--project "PROJECT_ID" --location "LOCATION" \
--purpose "asymmetric-signing" --default-algorithm "ec-sign-p256-sha256" \
--protection-level "hsm"
下載 HSM 認證
HSM 認證是證明金鑰位於 HSM 中的證明。憑證授權單位 (CA) 可能會要求您提供這項證明,才能核發延伸驗證 (EV) 憑證。
如要下載與 Cloud KMS 金鑰相關聯的 HSM 認證,請完成下列步驟:
前往 Google Cloud 控制台的「Key Management」頁面。
選取包含要認證金鑰的金鑰環,然後選取金鑰。
按一下您要認證的金鑰版本的「更多」圖示 more_vert,然後點選「驗證認證」。
在「Verify attestation」對話方塊中,按一下「Download attestation bundle」。系統會下載內含認證和憑證鏈結的 ZIP 檔案。
如需驗證下載的認證資訊的完整操作說明,請參閱「剖析認證資訊」。
使用 OpenSSL 建立自行簽署的憑證
這個步驟並非必要,但有助於您在購買由憑證授權單位簽署的憑證前,先熟悉後續步驟和相關費用。
使用 Cloud Shell 或您自己的電腦,透過 Cloud KMS 代管的簽署金鑰產生自行簽署的憑證。您可以使用 OpenSSL 使用 PKCS #11 URI 取代檔案路徑,並透過標籤識別金鑰。在 Cloud KMS PKCS #11 程式庫中,金鑰標籤等同於 CryptoKey 名稱。
openssl req -new -x509 -days 3650 -subj '/CN=test/' -sha256 -engine pkcs11 \
-keyform engine -key pkcs11:object=KEY_NAME > ca.cert
如果這項指令失敗,表示 PKCS11_MODULE_PATH
可能設定不正確,或是您可能沒有使用 Cloud KMS 簽署金鑰的權限。
您現在應該會看到類似下方的證書:
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
將憑證複製到 Windows 電腦,以便使用 SignTool 為構件簽署。
建立新的憑證簽署要求
您可以為 Cloud HSM 簽署金鑰產生憑證簽署要求 (CSR)。如果憑證授權單位要求您提供 CSR,才能產生新的憑證以便簽署程式碼,請完成下列步驟。
使用 Cloud Shell 或您自己的電腦執行下列指令:
openssl req -new -subj '/CN=CERTIFICATE_NAME/' DIGEST_FLAG \
-engine pkcs11 -keyform engine \
-key pkcs11:id=KEY_ID > REQUEST_NAME.csr
更改下列內容:
CERTIFICATE_NAME
:您要產生的憑證名稱。DIGEST_FLAG
:標記,表示摘要的類型。請根據金鑰的演算法使用-sha256
、-sha384
或-sha512
。KEY_ID
:非對稱簽署金鑰版本的完整資源 ID,例如projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1
。REQUEST_NAME
:憑證簽署要求的名稱。
請務必針對所使用的鍵類型使用正確的 -sigopt
選項。
您無法使用長度超過 100 個半形字元的物件 ID 與 OpenSSL 搭配運作。請使用簡短的 KeyRing
和 CryptoKey
名稱,或改用 pkcs11:object=KEY_NAME
。如要進一步瞭解 OpenSSL 物件 ID 限制,請參閱 GitHub 上的相關問題。
取得 CSR 後,您可以將 CSR 提供給憑證授權單位 (CA),以取得簽署憑證。請在下一節中使用 CA 提供的憑證。
使用 SignTool 簽署構件
您已成功建立憑證 (自行簽署或從憑證授權單位取得),並將其複製到 Windows 電腦,現在可以使用該憑證為 Windows 構件簽署。
使用 SignTool 簽署構件,並使用 Cloud KMS 金鑰和憑證。
"PATH_TO_SIGNTOOL.EXE" sign ^
/v /debug /fd sha256 /t http://timestamp.digicert.com ^
/f PATH_TO_CA.CERT ^
/csp "Google Cloud KMS Provider" ^
/kc projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1 ^
PATH_TO_ARTIFACT_TO_SIGN
更改下列內容:
PATH_TO_SIGNTOOL.EXE
:signtool.exe
的路徑 (例如C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x64\\signtool.exe
)。PATH_TO_CA.CERT
:憑證ca.cert
的路徑。PATH_TO_ARTIFACT_TO_SIGN
:您要簽署的成果路徑。
如需各指令選項和支援的構件檔案格式的詳細說明,請參閱官方 SignTool 說明文件。