証明書の検証

このトピックでは、常にハードウェア セキュリティ モジュール(HSM)に保存されている Cloud HSM 鍵の証明書を検証する方法について説明します。

概要

暗号化において、証明書とは、ソフトウェアがそれ自体について記述した、機械で検証可能なステートメントです。証明書は信頼できるコンピューティングの重要なコンポーネントであり、コンプライアンス上の理由から必要になる場合があります。

証明書を表示して検証するには、HSM に、暗号署名付き構成証明ステートメントおよびその署名に使用された証明書バンドルをリクエストします。証明書ステートメントは HSM ハードウェアによって作成され、Google と HSM メーカーが所有する証明書によって署名されます。

証明書をダウンロードしたら、バンドル内の証明書の有効性を検証し、証明書自体を検証します。

証明書ステートメントの形式は HSM メーカーにより定義されています。Cloud Console、Cloud KMS API、または gcloud ツールを使用して証明書を検証することはできません。この検証は意図的に Google から独立されています。

証明書スクリプトは、Google が開発したオープンソースの Python スクリプトです。スクリプトのソースコードを表示して、証明書の形式の詳細や検証の仕組みを確認できます。また、カスタマイズされたソリューションのモデルとしても利用できます。

このトピックの例は、Cloud Shell を含む Linux 環境向けに設計されています。macOS または Windows クライアントを使用するには、変更が必要になる場合があります。

始める前に

アーティファクトのダウンロード

鍵を証明する前に、証明書をダウンロードします。

証明書のダウンロード

証明書の署名は、Google と HSM メーカーのルート証明書までの証明書バンドルを使用して検証されてから、Google と HSM メーカーの認証局(CA)によって署名されます。

  1. Google のルート証明書に至る証明書バンドルをダウンロードします。

    curl -O https://www.gstatic.com/cloudhsm/cloud-kms-prod-[location]-google.pem
    
  2. HSM メーカーのルート証明書に至る証明書バンドルをダウンロードします。

    curl -O https://www.gstatic.com/cloudhsm/cloud-kms-prod-[location]-cavium.pem
    
  3. Google のルート証明書をダウンロードします。

    curl -O https://www.gstatic.com/cloudhsm/roots/global_1498867200.pem
    
  4. HSM メーカーのルート証明書と公開鍵をダウンロードして抽出します。

    curl -O https://www.marvell.com/content/dam/marvell/en/public-collateral/security-solutions/liquid_security_certificate.zip
    
    unzip liquid_security_certificate.zip
    

    証明書は liquid_security_certificate.crt に抽出され、公開鍵は liquid_security_certificate.txt に抽出されます。

証明書ステートメントのダウンロード

Google Cloud Console またはコマンドラインを使用して、暗号鍵バージョンの証明書をダウンロードできます。証明書ステートメントは、鍵を含む HSM デバイスから直接ダウンロードされます。

コンソール

  1. Cloud Console で [暗号鍵] ページに移動します。

    [暗号鍵] ページに移動

  2. 証明する鍵を含むキーリングを選択してから、鍵を選択します。

  3. 証明する鍵バージョンのその他アイコン をクリックし、[証明書を取得] を選択します。

  4. [証明書を取得] ダイアログで [ダウンロード] をクリックします。証明書ファイルがローカル システムにダウンロードされます。

    証明書ファイルの名前の形式は [keyring-name]-[key-name]-[key-version]-[attestation-format]-attestation.dat です。 ファイル名の各部分はハイフンで区切られます。そのため、プレースホルダ テキストは角かっこ([])で囲まれます。

gcloud

  1. コンソール ウィンドウの上部にある [Cloud Shell を有効にする] をクリックします。

    Cloud Shell をアクティブにする コンソールの下部の新しいフレーム内で Cloud Shell セッションが開き、コマンドライン プロンプトが表示されます。shell セッションが初期化されるまで、数秒かかる場合があります。

    Cloud Shell セッション

  2. Cloud Shell のコマンドライン プロンプトで、gcloud kms keys versions describe コマンドを使用して、証明を行う鍵の証明書の形式を取得します。

    gcloud kms keys versions describe key-version \
      --key key-name \
      --location location \
      --keyring keyring-name
    

    このコマンドの出力には、鍵バージョンの証明書の形式が表示されます。この情報は次の手順で必要になります。

  3. Cloud Shell のコマンドライン プロンプトで、gcloud kms keys versions describe を使用して、証明を行う鍵の証明書を取得します。attestation-format は、前の手順で取得した認証書の形式に置き換えます。--attestation-file フラグには、取得した証明書を保存するパスとファイル名を指定します。ファイル名の各部分はハイフンで区切られます。そのため、プレースホルダ テキストは角かっこ([])で囲まれます。

    gcloud kms keys versions describe key-version \
     --key key-name \
     --location location \
     --keyring keyring-name \
     --attestation-file \
     [keyring-name]-[key-name]-[key-version]-[attestation-format]-attestation.dat
    

証明書の署名の確認

証明書の暗号署名を確認するには、オープンソースのスクリプトを使用します。

非対称鍵ペアの公開鍵を確認することもできます。

証明書の値の解析

HSM メーカーのドキュメントには、スクリプトを使用して証明書の値を解析し、非対称鍵ペアの公開鍵を確認する方法が記載されています。証明書を解析する前に、次のコマンドを使用して解凍する必要があります。

  • 圧縮された証明書を解凍します。

    gzip -d < compressed_attestation.dat > attestation.dat
    

以下は、HSM メーカーによる特定の手順についての直接のリンクです。

証明書の値を解析するための手順には、Cloud HSM の HSM 鍵に固有ではなく、証明書の一般的なフィールドの参照が含まれています。

以下のセクションでは、Cloud HSM に固有の鍵に関する情報を確認する方法について説明します。

鍵のバージョン ID を確認する

鍵バージョンのリソース ID の SHA-256 ハッシュが証明書内に存在するかどうかを検証できます。鍵のリソース名は、証明書ファイル内の 0x0102 フィールドか鍵 ID フィールドの一部です。鍵 ID は、16 進数の SHA-256 ハッシュ ダイジェストが 2 つ連結されて構成されます。2 つ目のものは鍵のリソース名と一致する必要があります。

  1. 鍵バージョンのリソース ID を取得します。Cloud Console を使用して、鍵バージョン リソース ID を取得するか、次のコマンドを実行できます。

    gcloud kms keys versions list \
       --location location \
       --keyring key-ring-name \
       --key key-name
    
  2. コマンドラインで、先ほど取得した鍵バージョンのリソース ID に resource_name を割り当てます。

    RESOURCE_NAME="projects/project-id/locations/location/keyRings/key-ring-name/cryptoKeys/key-name/cryptoKeyVersions/key-version"
    
  3. 解析スクリプトはすべての証明書フィールドを 16 進数でダンプするため、鍵 ID は 2 回 16 進数にフォーマットされることになります(keyID の作成時に 1 回、証明書の解析時に 1 回)。リソース名が鍵 ID と一致することを確認するには、リソース名を 16 進数の SHA-256 ダイジェストに変換し、証明書ファイル内の鍵 ID の 16 進数変換を 1 回元に戻して、それら 2 つを比較します。

    RESOURCE_NAME_HEX="$(echo -n ${RESOURCE_NAME} | openssl dgst -sha256 -hex | awk '{print $2}')"
    
  4. 解析スクリプトはすべての証明書フィールドを 16 進数でダンプし、鍵 ID は内部的に 16 進エンコードされます。16 進エンコードがデコードされた 1 つのレイヤの鍵 ID の値に、KEYID_HEX 環境変数を設定します。

    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 内部で作成されたかどうかを判別できます。この検証は意図的に Google から独立して実施されるようになっているため、Cloud Console、Cloud KMS API、または gcloud ツールを使用して証明書を検証することはできません。