本指南提供操作說明,說明如何透過 PKCS#11 和 Jsign 建立 Cloud HSM 金鑰,用於 Microsoft Authenticode 簽署。
用途
本文所述工作流程有助於滿足下列企業安全需求:
- 使用受 FIPS140-2 第 3 級 HSM 保護的私密金鑰簽署韌體。
- 不必使用 signtool 即可簽署 Windows 構件。
事前準備
如要完成本教學課程,您需要下列項目:
- 含有要簽署構件的 Windows 電腦。請確認這部電腦已安裝 Java。
Cloud Shell 或您自己的 Linux 電腦,產生憑證簽署要求或憑證。在這部電腦上,完成「OpenSSL 設定」文件中記錄的設定。
如果尚未執行 gcloud auth application-default login,請務必執行。
在 Windows 電腦上,使用下列 PowerShell 指令下載最新 Jsign 版本 JAR 檔案:
wget https://github.com/ebourg/jsign/releases/download/JSIGN.VERSION/jsign-JSIGN.VERSION.jar -O jsign.jar
設定
建立 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 驗證,請完成下列步驟:
前往 Google Cloud 控制台的「Key Management」頁面。
選取包含要認證金鑰的金鑰環,然後選取該金鑰。
針對要認證的金鑰版本,按一下「更多」圖示 more_vert,然後按一下「驗證認證」。
在「驗證認證」對話方塊中,按一下「下載認證組合」。 系統會下載內含驗證和憑證鏈結的 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 電腦,以便搭配 Jsign 使用,簽署構件。
建立新的憑證簽署要求
您可以為 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 選項。
現在您已取得 CSR,可以提供給憑證授權單位 (CA),以取得簽署憑證。在下一節中,請使用 CA 提供的憑證。
使用 Jsign 簽署構件
您已成功建立憑證 (自簽或從憑證授權單位取得),並複製到 Windows 電腦,現在可以使用憑證簽署 Windows 構件。
如需支援的檔案格式清單,請執行 jsign --help 指令。
使用 Jsign 簽署構件,並使用 Cloud KMS 金鑰和憑證。
java -jar PATH_TO_JSIGN.JAR --storetype GOOGLECLOUD \
--storepass $(gcloud auth application-default print-access-token) \
--keystore projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING \
--alias KEY_NAME \
--certfile PATH_TO_CA.CERT
PATH_TO_ARTIFACT_TO_SIGN
更改下列內容:
PATH_TO_JSIGN.JAR:jsign.jar的路徑。PATH_TO_CA.CERT:憑證的路徑ca.cert。PATH_TO_ARTIFACT_TO_SIGN:要簽署的構件路徑。
如需各項指令選項的詳細說明,請參閱官方 Jsign 說明文件。