驗證認證

本指南說明如何驗證 Cloud HSM 金鑰的認證,這些金鑰一律儲存在硬體安全性模組 (HSM) 中。本指南適用於多租戶 Cloud HSM 和單一租戶 Cloud HSM 金鑰。

總覽

在密碼編譯中,驗證是機器可讀取的程式輔助證明陳述式,軟體可藉此證明自身狀態。認證是可信賴運算的重要元件,可能因法規遵循需求而必須提供。

如要查看及驗證認證,請向 HSM 要求經過密碼編譯簽署的認證聲明,以及用於簽署聲明的憑證鏈結。認證聲明是由 HSM 硬體產生,並由 Google 和 HSM 製造商擁有的憑證簽署。

下載認證聲明和憑證鏈結後,您可以使用憑證鏈結檢查屬性驗證認證的有效性

認證指令碼是 Google 開發的開放原始碼 Python 指令碼,您可以查看指令碼的原始碼,進一步瞭解認證格式和驗證方式,或做為自訂解決方案的範本。

本主題中的範例適用於 Linux 環境,包括 Cloud Shell。如要在 macOS 或 Windows 用戶端上操作,可能需要進行修改。

事前準備

驗證認證

認證驗證程序可透過 Google Cloud 控制台自動執行,也可以手動執行,方法是下載認證套件和認證驗證指令碼,然後在本機或 Cloud Shell 中執行。

透過 Google Cloud 控制台驗證認證

您可以透過 Google Cloud 控制台驗證認證,控制台會開啟 Cloud Shell,並預先填入執行完整認證驗證程序所需的程式碼片段。

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

    前往「金鑰管理」頁面

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

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

  4. 在「驗證認證」對話方塊中,按一下「開啟 Cloud Shell」。這會開啟 Cloud Shell,並預先填入完成整個驗證程序所需的程式碼片段。

  5. 檢查 Cloud Shell 中預先填入的程式碼片段。程式碼片段會下載認證驗證指令碼和依附元件,執行 gcloud 指令來下載認證和憑證鏈結,然後執行指令碼來驗證認證。

  6. 執行程式碼片段,驗證認證。

手動驗證認證

您必須先下載認證、憑證鏈結和認證驗證指令碼,才能手動驗證認證。

  1. 下載認證和憑證鏈結。

    控制台

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

      前往「金鑰管理」頁面

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

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

    4. 在「Verify attestation」(驗證認證) 對話方塊中,按一下「Download Attestation Bundle」(下載認證組合)。 系統會下載內含認證和憑證鏈結的 ZIP 檔案。

    5. 從認證套件中擷取認證和憑證鏈結。

    gcloud

    1. 按一下主控台視窗頂端的「啟用 Cloud Shell」

      啟用 Cloud Shell 系統會在主控台底部的新頁框中開啟 Cloud Shell 工作階段,並顯示指令列提示。殼層工作階段可能需要幾秒鐘的時間才能完成初始化。

      Cloud Shell 工作階段

    2. 在 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] \
      
    3. 在 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] \
      
  2. 下載用來驗證認證的指令碼和必要條件,然後參閱指令碼說明文件,使用憑證檔案中的憑證驗證認證檔案中的認證。

剖析認證的值

HSM 製造商的文件包含完整操作說明,教您如何使用他們的指令碼剖析認證值,並驗證非對稱金鑰組的公開金鑰。您必須先使用下列指令解壓縮認證,才能剖析認證。

  • 解壓縮壓縮的認證。

    gzip -d < compressed_attestation.dat > attestation.dat
    

這些連結會直接前往 HSM 製造商提供的特定操作說明:

剖析認證值的操作說明包含認證中的一般欄位參照,而非 Cloud HSM 中的 HSM 金鑰專用欄位。

以下各節說明如何驗證金鑰的資訊,這些資訊專屬於 Cloud HSM。

驗證金鑰版本 ID

您可以驗證金鑰版本資源 ID 的 SHA-256 雜湊是否存在於認證中。金鑰的資源名稱是認證檔案中 0x0102 欄位或金鑰 ID 欄位的一部分。金鑰 ID 包含兩個十六進位格式串聯 SHA-256 雜湊摘要。第二個金鑰 ID 應符合該金鑰的資源名稱。

  1. 取得金鑰版本的金鑰版本資源 ID。您可以使用Google Cloud 控制台取得金鑰版本資源 ID,也可以執行下列指令:

    gcloud kms keys versions list \
       --location location \
       --keyring key-ring-name \
       --key key-name
    
  2. 在指令列中,將 resource_name 指派給您剛剛擷取的金鑰版本資源 ID。

    RESOURCE_NAME="projects/project-id/locations/location/keyRings/key-ring-name/cryptoKeys/key-name/cryptoKeyVersions/key-version"
    
  3. 由於剖析指令碼會以十六進位格式傾印所有認證欄位,因此金鑰 ID 會格式化為十六進位格式兩次 (建立 keyID 時格式化一次,剖析認證時格式化另一次)。如要驗證資源名稱是否符合金鑰 ID,請將資源名稱轉換為 SHA-256 十六進位格式,然後還原認證檔案中金鑰 ID 的一個十六進位轉換,並對這兩者進行比較。

    RESOURCE_NAME_HEX="$(echo -n ${RESOURCE_NAME} | openssl dgst -sha256 -hex | awk '{print $2}')"
    
  4. 剖析指令碼會以十六進位格式傾印所有認證欄位,而金鑰 ID 會在內部以十六進位格式編碼第二次。將 KEYID_HEX 環境變數設為金鑰 ID 的值,並解碼一層十六進位編碼:

    KEYID_HEX=$(grep -m 1 0x0102 /path/to/parsed/attestation.dat | awk '{print $2}' | xxd -p -r)
    
  5. 以字串形式比較 RESOURCE_NAME_HEXKEYID_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 中建立金鑰版本。