驗證認證

本主題說明如何驗證 Cloud HSM 金鑰的認證,這些金鑰一律會儲存在硬體安全性模組 (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」頁面。

    前往「Key Management」(金鑰管理) 頁面

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

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

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

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

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

手動驗證認證

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

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

    控制台

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

      前往「Key Management」(金鑰管理) 頁面

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

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

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

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

    gcloud

    1. 按一下主控台視窗頂端的「Activate 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 中建立金鑰版本。