本主題說明如何驗證 Cloud HSM 金鑰的認證,這些金鑰一律會儲存在硬體安全性模組 (HSM) 中。
總覽
在密碼學中,「驗證」是指機器可讀取的,可透過程式碼驗證的陳述式,表示某個軟體對自身做出的陳述。認證是信任運算的重要元件,可能會因法規遵循而需要。
如要查看及驗證認證,您必須向 HSM 要求經密碼編譯簽署的認證聲明,以及用於簽署的憑證鏈結。認證聲明是由 HSM 硬體產生,並由 Google 和 HSM 製造商擁有的憑證簽署。
下載認證陳述式和憑證鏈結後,您可以檢查其屬性,或使用憑證鏈結驗證認證有效性。
認證指令碼是 Google 開發的開放原始碼 Python 指令碼。您可以查看指令碼的來源程式碼,進一步瞭解認證格式和驗證運作方式,或將其做為自訂解決方案的模型。
本主題中的範例適用於 Linux 環境,包括 Cloud Shell。如要在 macOS 或 Windows 用戶端上進行操作,您可能需要進行修改。
事前準備
- 如有需要,請在Cloud HSM 支援的地區中,在金鑰環上建立 Cloud HSM 金鑰。
請從 HSM 製造商下載並安裝用於剖析認證值的腳本。下載下列每個指令碼:
verify_pubkey.py
parse_v1.py
parse_v2.py
請查看同一個位置提供的使用指令碼說明文件。
下載並安裝用來驗證認證的指令碼及其必要條件,並查看指令碼的說明文件。
驗證認證
您可以透過 Google Cloud 主控台自動執行認證驗證程序,也可以手動下載認證套件和認證驗證指令碼,然後在本機或 Cloud Shell 中執行。
透過 Google Cloud 控制台驗證認證
您可以透過 Google Cloud 主控台驗證認證,主控台會開啟 Cloud Shell,並預先填入執行整個認證驗證程序所需的程式碼片段。
前往 Google Cloud 控制台的「Key Management」頁面。
選取包含要認證金鑰的金鑰環,然後選取金鑰。
按一下要認證金鑰版本的「更多」圖示 more_vert,然後選取「驗證認證」。
在「Verify attestation」對話方塊中,按一下「Open Cloud Shell」。這會開啟 Cloud Shell,並預先填入完成整個驗證程序所需的程式碼片段。
檢查 Cloud Shell 中預先填入的程式碼片段。程式碼片段會下載認證驗證指令碼及其依附元件,執行 gcloud 指令下載認證和憑證鏈結,然後執行指令碼驗證認證。
執行程式碼片段,驗證認證。
手動驗證認證
您必須先下載認證、憑證鏈結和認證驗證指令碼,才能手動驗證認證。
下載認證和憑證鏈結。
控制台
前往 Google Cloud 控制台的「Key Management」頁面。
選取包含要認證金鑰的金鑰環,然後選取金鑰。
按一下要認證金鑰版本的「更多」圖示 more_vert,然後選取「驗證認證」。
在「Verify attestation」對話方塊中,按一下「Download Attestation Bundle」。系統會下載內含認證和憑證鏈結的 ZIP 檔案。
從認證套件中擷取認證和憑證鏈結。
gcloud
按一下主控台視窗頂端的「Activate Cloud Shell」。
系統會在主控台底部的新頁框中開啟 Cloud Shell 工作階段,並顯示指令列提示。殼層工作階段可能需要幾秒鐘的時間才能完成初始化。
在 Cloud Shell 指令列提示中,使用
gcloud kms keys versions describe
指令來擷取您要認證的金鑰認證。--attestation-file
標記會指定已擷取認證的路徑和檔案名稱目的地。gcloud kms keys versions describe key-version \ --key key-name \ --location location \ --keyring keyring-name \ --attestation-file [attestation-file] \
在 Cloud Shell 指令列提示中,使用
gcloud kms keys versions get-certificate-chain
指令來擷取您要認證的金鑰證書鏈結。--output-file
標記會指定已擷取憑證的路徑和檔案名稱目的地。gcloud kms keys versions get-certificate-chain key-version \ --key key-name \ --location location \ --keyring keyring-name \ --output-file [certificates-file] \
下載用來驗證認證的指令碼及其必要條件,並參閱指令碼說明文件,使用憑證檔案中的憑證驗證認證檔案中的認證。
剖析認證值
HSM 製造商的說明文件包含完整操作說明,說明如何使用指令碼剖析認證值,並驗證非對稱金鑰組的公開金鑰。您必須使用下列指令解壓縮認證,才能剖析認證。
解壓縮壓縮的認證。
gzip -d < compressed_attestation.dat > attestation.dat
以下連結可直接前往 HSM 製造商提供的特定操作說明:
剖析認證值的指示包含認證中的一般欄位參照,並非 Cloud HSM 中的 HSM 金鑰專屬。
以下各節說明如何驗證 Cloud HSM 專屬金鑰的相關資訊。
驗證金鑰的版本 ID
您可以驗證金鑰版本資源 ID 的 SHA-256 雜湊是否存在於認證中。金鑰的資源名稱是認證檔案中 0x0102
欄位或金鑰 ID 欄位的一部分。金鑰 ID 包含兩個十六進位格式串聯 SHA-256 雜湊摘要。第二個金鑰 ID 應符合該金鑰的資源名稱。
取得金鑰版本的金鑰版本資源 ID。您可以使用Google Cloud 主控台取得金鑰版本資源 ID,也可以執行下列指令:
gcloud kms keys versions list \ --location location \ --keyring key-ring-name \ --key key-name
在指令列中,將
resource_name
指派給您剛剛擷取的金鑰版本資源 ID。RESOURCE_NAME="projects/project-id/locations/location/keyRings/key-ring-name/cryptoKeys/key-name/cryptoKeyVersions/key-version"
由於剖析指令碼會以十六進位格式傾印所有認證欄位,因此金鑰 ID 會格式化為十六進位格式兩次 (建立 keyID 時格式化一次,剖析認證時格式化另一次)。如要驗證資源名稱是否符合金鑰 ID,請將資源名稱轉換為 SHA-256 十六進位格式,然後還原認證檔案中金鑰 ID 的一個十六進位轉換,並對這兩者進行比較。
RESOURCE_NAME_HEX="$(echo -n ${RESOURCE_NAME} | openssl dgst -sha256 -hex | awk '{print $2}')"
剖析指令碼會以十六進位格式傾印所有認證欄位,而金鑰 ID 會在內部以十六進位編碼兩次。將
KEYID_HEX
環境變數設為金鑰 ID 的值,並解碼一層十六進位編碼:KEYID_HEX=$(grep -m 1 0x0102 /path/to/parsed/attestation.dat | awk '{print $2}' | xxd -p -r)
比較
RESOURCE_NAME_HEX
和KEYID_HEX
的值,並以字串格式顯示:test ${RESOURCE_NAME_HEX} == ${KEYID_HEX:(-64)} || echo "Values don't match"
如果值相符,系統就不會傳回任何輸出內容,且指令會以
0
代碼結束。
驗證金鑰的其他屬性
您可以查看各種金鑰屬性,這些屬性與 PKCS #11 標準中的欄位對應。請參考下列範例,驗證金鑰的其他屬性。
金鑰是否可擷取會儲存在剖析輸出的
0x0102
欄位中。如要判斷金鑰是否可擷取,請檢查0x0162
欄位。\x01
的值為true
,\x00
的值為false
。無法擷取 Cloud HSM 金鑰。
grep '0x0162:' /path/to/parsed/attestation.dat
金鑰進入 HSM 的方式 (是直接建立還是匯入) 會儲存在
0x0163
欄位中。如果金鑰是在 HSM 本機上建立,則欄位會設為\x01
。匯入鍵的欄位設為\x00
。您可以根據金鑰如何出現在 HSM 上,推斷出一些資訊。如果金鑰是在 Cloud HSM 中建立,表示金鑰從未在 HSM 外部以未加密的方式儲存。如果已匯入金鑰,匯入機制可確保金鑰在匯入程序期間和之後在 Cloud HSM 內的傳輸過程中受到保護。
grep '0x0163:' /path/to/parsed/attestation.dat
金鑰類型會儲存在
0x0100
欄位中。金鑰類型會在 PCKS#11 標準中記錄,前置字串為CKK_*
。例如,AES 金鑰的類型為\x1f
。grep '0x0100:' /path/to/parsed/attestation.dat
其他資訊
您可以驗證認證來判斷是否已在 HSM 中建立金鑰版本。