使用 CNG 提供者和 SignTool 為 Windows 構件簽署

本指南提供操作說明,說明如何透過 CNG 提供者和 SignTool 建立 Cloud HSM 金鑰,用於 Microsoft Authenticode 簽署。

您可以在 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"

接著,在您剛建立的金鑰環中,於專案中建立 Cloud KMS EC-P256-SHA256 硬體簽署金鑰:Google Cloud

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 驗證,請完成下列步驟:

  1. 前往 Google Cloud 控制台的「Key Management」頁面。

    前往「金鑰管理」

  2. 選取包含要認證金鑰的金鑰環,然後選取該金鑰。

  3. 按一下要認證的金鑰版本「更多」圖示 ,然後按一下「驗證認證」。

  4. 在「驗證認證」對話方塊中,按一下「下載認證組合」。 系統會下載內含驗證和憑證鏈結的 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 選項。

使用 OpenSSL 時,物件 ID 不得超過 100 個半形字元。請使用簡短的 KeyRing 和 CryptoKey 名稱,或改用 pkcs11:object=KEY_NAME。如要進一步瞭解 OpenSSL 物件 ID 限制,請參閱 GitHub 上的相關問題。

現在您已取得 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 說明文件。