本指南提供相關操作說明,說明如何透過 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 release 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"
接著,在您剛建立的金鑰環中,在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 電腦,以便您使用 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 後,您可以將 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 說明文件。