証明書の検証

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

概要

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

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

証明書ステートメントと証明書チェーンをダウンロードしたら、証明書チェーンを使用して属性をチェックするか、証明書の有効性を確認できます。

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

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

始める前に

証明書の検証

証明書検証プロセスは、Google Cloud コンソールから自動的に実行することもできますが、証明書バンドルと証明書検証スクリプトをダウンロードしてローカルまたは Cloud Shell で実行することもできます。

Google Cloud コンソールを使用した証明書の検証

Google Cloud コンソールで証明書を確認できます。これにより、Cloud Shell が開き、証明書検証プロセス全体を実行するために必要なコード スニペットが事前に入力されます。

  1. Google Cloud コンソールで、[鍵の管理] ページに移動します。

    [鍵管理] ページに移動

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

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

  4. [証明書の検証] ダイアログで [Cloud Shell を開く] をクリックします。これにより、Cloud Shell が開き、検証プロセス全体を実行するために必要なコード スニペットが事前に入力されます。

  5. Cloud Shell で事前入力されたコード スニペットを検査します。このスニペットでは、証明書検証スクリプトとその依存関係をダウンロードし、gcloud コマンドを実行して証明書と証明書チェーンをダウンロードし、スクリプトを実行して証明書を検証します。

  6. コード スニペットを実行して証明書を検証します。

証明書を手動で確認する

証明書を手動で検証する前に、証明書、証明書チェーン、証明書検証スクリプトをダウンロードする必要があります。

  1. 証明書と証明書チェーンをダウンロードします。

    Console

    1. Google Cloud コンソールで、[鍵の管理] ページに移動します。

      [鍵管理] ページに移動

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

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

    4. [証明書の検証] ダイアログで [証明書バンドルをダウンロード] をクリックします。これにより、証明書と証明書チェーンを含む zip ファイルがダウンロードされます。

    5. 証明書バンドルから証明書と証明書チェーンを抽出します。

    gcloud

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

      Cloud Shell をアクティブにする コンソールの下部の新しいフレーム内で Cloud Shell セッションが開き、コマンドライン プロンプトが表示されます。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 は、16 進数の SHA-256 ハッシュ ダイジェストが 2 つ連結されて構成されます。2 つ目のものは鍵のリソース名と一致する必要があります。

  1. 鍵バージョンのリソース ID を取得します。Google Cloud コンソールを使用して鍵バージョンのリソース 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 内部で作成されたかどうかを判別できます。