Cloud KMS でデータに署名して検証する(非対称)

1. 概要

Cloud KMS はクラウドでホストされる鍵管理サービスです。このサービスを利用することで、オンプレミスと同じ方法でクラウド サービスの暗号鍵を管理できます。ハードウェア格納型鍵用の Cloud HSM など、さまざまな鍵の種類とソースを使用した暗号化、復号、署名、検証がサポートされています。このチュートリアルでは、非対称の Cloud KMS 鍵を使用してデータを署名および検証する方法について説明します。

学習内容

  • Cloud KMS API を有効にする方法
  • キーリングを作成する方法
  • 非対称署名/検証用の Crypto Key を作成する方法

2. 設定と要件

セルフペース型の環境設定

  1. Cloud Console にログインし、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します(Gmail アカウントまたは G Suite アカウントをお持ちでない場合は、アカウントを作成する必要があります)。

dMbN6g9RawQj_VXCSYpdYncY-DbaRzr2GbnwoV7jFf1u3avxJtmGPmKpMYgiaMH-qu80a_NJ9p2IIXFppYk8x3wyymZXavjglNLJJhuXieCem56H30hwXtd8PvXGpXJO9gEUDu3cZw

ci9Oe6PgnbNuSYlMyvbXF1JdQyiHoEgnhl4PlV_MFagm2ppzhueRkqX4eLjJllZco_2zCp0V0bpTupUSKji9KkQyWqj11pqit1K1faS1V6aFxLGQdkuzGp4rsQTan7F01iePL5DtqQ

8-tA_Lheyo8SscAVKrGii2coplQp2_D1Iosb2ViABY0UUO1A8cimXUu6Wf1R9zJIRExL5OB2j946aIiFtyKTzxDcNnuznmR45vZ2HMoK3o67jxuoUJCAnqvEX6NgPGFjCVNgASc-lg

プロジェクト ID を忘れないようにしてください。プロジェクト ID はすべての Google Cloud プロジェクトを通じて一意の名前にする必要があります(上記の名前はすでに使用されているので使用できません)。以降、このコードラボでは PROJECT_ID と呼びます。

  1. 次に、Google Cloud リソースを使用するために、Cloud Console で課金を有効にする必要があります。

このコードラボを実行しても、費用はほとんどかからないはずです。このチュートリアル以外で請求が発生しないように、リソースのシャットダウン方法を説明する「クリーンアップ」セクションの手順に従うようにしてください。Google Cloud の新規ユーザーは $300 の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

この Codelab では、Google Cloud で実行される無料の仮想化環境である Cloud Shell を使用します。GCP Console で右上のツールバーにある Cloud Shell アイコンをクリックします。

vezHz_9nBUSt_0pD8eMHkzgHehRa83ILgMpcztEJtGZspECiZTk47O02PYk6Zp7jyStful3AIDEZU8qcCNbiXF4WcpkUdJi2LoUbxTWg4cZ4skDnvGKNywBZlDBzzWha111IZ1KqXQ

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

wQQCzLZ7_omk2cuoBaKVPnniKDFG6MsP8h2OA0j3Iw9LRSFQ9TkD6Ccq4dcUASPoD5UKe1Ur7bIgYn5gAh2r6BlQDnpFmgyAtv9x2D6ppXS0pfjfxViuEfoetgLvgVeduekc2hgU2Q

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。特に指示がない限り、このシェルからすべてのコマンドを実行します。

3. Cloud KMS サービスを有効にする

Cloud KMS を使用するには、まずプロジェクトでサービスを有効にする必要があります。これはプロジェクトごとに 1 回だけ行います。Cloud KMS サービスを有効にするには、次のコマンドを実行します。

$ gcloud services enable cloudkms.googleapis.com \
    --project "${GOOGLE_CLOUD_PROJECT}"

有効になるまでに最大で 1 分かかることがあります。コマンドが完了すると、成功が報告されます。

4. KMS 鍵を作成する

Cloud KMS キーリングを作成します。Cloud KMS では、キーリングは暗号鍵の論理コレクションです。キーリングには、鍵のロケーションなどのメタデータが含まれています。global リージョンに my-keyring という名前のキーリングを作成します。

$ gcloud kms keyrings create "my-keyring" \
    --location "global"

作成したキーリング内に、my-asymmetric-signing-key という名前の暗号鍵を作成します。目的は asymmetric-signing にします。

$ gcloud kms keys create "my-asymmetric-signing-key" \
    --location "global" \
    --keyring "my-keyring" \
    --purpose "asymmetric-signing" \
    --default-algorithm "rsa-sign-pkcs1-4096-sha512"

5. 署名データ

暗号化とは異なり、非対称の Cloud KMS 鍵を使用して暗号化されたデータを復号するには、Cloud KMS サービスへのオンライン アクセスが必要です。gcloud コマンドライン ツールを使用して、ファイルの暗号文を復号します。

署名するデータを含むファイルを作成し、gcloud コマンドライン ツールを使用して Cloud KMS 鍵でデータに署名します。

$ echo "my-contents" > ./data.txt
$ gcloud kms asymmetric-sign \
    --location "global" \
    --keyring "my-keyring" \
    --key "my-asymmetric-signing-key" \
    --version "1" \
    --digest-algorithm "sha512" \
    --input-file ./data.txt \
    --signature-file ./data.txt.sig

署名はディスクの data.txt.sig に保存されます。data.txt.sig ファイルを開くと、印刷できない奇妙な文字が含まれていることがわかります。これは、結果のデータがバイナリ形式であるためです。

署名をデータベースに保存したり、HTTP リクエストの一部として送信したりする際には、データをエンコードする必要があります。よく使用されるエンコード メカニズムは base64 です。

6. データを確認する

非対称鍵の場合、Cloud KMS は検証を直接実行しません。代わりに、公開鍵へのアクセスを提供します。ユーザーは、公開鍵暗号化を使用してその公開鍵でデータを検証します。非対称鍵を使用すると、検証を完全にオフラインで行うことができ、Cloud KMS や他の Google Cloud API へのアクセスは必要ありません。検証は、openssl などの暗号ツール、または公開鍵暗号をサポートするプログラミング言語またはライブラリを使用して行われます。

Cloud KMS から公開鍵をダウンロードします。

$ gcloud kms keys versions get-public-key "1" \
    --location "global" \
    --keyring "my-keyring" \
    --key "my-asymmetric-signing-key" \
    --output-file ./key.pub

openssl コマンドライン ツールを使用して、公開鍵に対して署名を検証します。

$ openssl dgst -sha256 \
    -verify ./key.pub \
    -signature ./data.txt.sig ./data.txt

コンソールには、デジタル署名が有効であることを示す成功メッセージが表示されます。

Verified OK

7. 完了

Cloud KMS API を有効にして、非対称署名鍵を作成し、データに署名して検証しました。Cloud KMS は強力なプロダクトであり、署名と検証は機能のほんの一部にすぎません。

クリーンアップ

確認が完了したら、プロジェクトの削除を検討してください。

  • Cloud Platform Console に移動します。
  • シャットダウンするプロジェクトを選択し、上部の [削除] をクリックします。これにより、プロジェクトの削除スケジュールが設定されます。

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。