このトピックでは、非対称鍵に基づくデジタル署名の作成と検証について説明します。
デジタル署名は、非対称鍵の秘密鍵部分を使用して作成します。署名の検証は、同じ非対称鍵の公開鍵部分を使用して行います。
始める前に
デジタル署名を作成するときは、
ASYMMETRIC_SIGN
を鍵の目的とする鍵を使用する必要があります。鍵の作成には、ASYMMETRIC_SIGN
を使用します。署名を検証するには、鍵の作成時に使用された完全なアルゴリズムを知る必要があります。
openssl
コマンドを使用する以下のコマンドラインの手順については、これらのコマンドにこの情報を渡す必要があります。署名を行うユーザーまたはサービスに、非対称鍵に対する
cloudkms.cryptoKeyVersions.useToSign
権限を付与します。Cloud Key Management Service の権限については、権限とロールをご覧ください。署名を検証する場合は、検証に使用する公開鍵をダウンロードするユーザーまたはサービスに、非対称鍵に対する
cloudkms.cryptoKeyVersions.viewPublicKey
権限を付与します。コマンドラインを使用する場合、OpenSSL をまだインストールしていなければ、ここでインストールしてください。Cloud Shell を使用する場合、OpenSSL はすでにインストールされています。
データとダイジェスト
AsymmetricSign リクエストに指定された入力は、data
フィールドや digest
フィールドを介して渡すことができます。これらのフィールドは同時に指定できません。未加工のアルゴリズムや Cloud External Key Manager 鍵による署名など、データフィールドが必要なアルゴリズムもあります。
未加工アルゴリズム
「未加工」アルゴリズム(RSA_SIGN_RAW_
接頭辞で識別)は、DigestInfo へのエンコードを省略した PKCS #1 署名のバリアントです。バリアントでは、次のことが行われます。
- ダイジェストは、署名されるメッセージに対して計算されます。
- ダイジェストには、直接 PKCS #1 パディングが適用されます。
- パディングされたダイジェストの署名は、RSA 秘密鍵を使用して計算されます。
こうしたアルゴリズムを使用するには、次のようにします。
- 未加工データは、(ダイジェストの代わりに)
data
フィールドの一部として提供する必要があります。 - データの長さの上限は、RSA 鍵のサイズよりも 11 バイト少なくします。たとえば、2,048 ビットの RSA 鍵がある PKCS #1 では、最大 245 バイトに署名できます。
cloudkms.expertRawPKCS1
ロールを適切なユーザーまたはサービスに付与します。Cloud Key Management Service の権限については、権限とロールをご覧ください。
他のハッシュ アルゴリズムの ECDSA サポート
Google の ECDSA 署名アルゴリズムの一般的な形式は次のとおりです。
EC_SIGN_ELLIPTIC_CURVE_[DIGEST_ALGORITHM]
DIGEST_ALGORITHM の値は SHA256
、SHA384
、または SHA512
です。ハッシュは署名の作成前に実行されるため、これらの署名アルゴリズムは、SHA 以外のダイジェスト(Keccak など)でも使用できます。Keccak ダイジェストを使用するには、Keccak ハッシュ値を指定し、同じ長さの SHA ダイジェスト アルゴリズムを使用します。たとえば、EC_SIGN_P256_SHA256
アルゴリズムを使用するリクエストで KECCAK256
ダイジェストを使用できます。
署名の作成
gcloud
コマンドラインで Cloud KMS を使用するには、まず Google Cloud CLI の最新バージョンをインストールまたはアップグレードします。
gcloud kms asymmetric-sign \ --version key-version \ --key key \ --keyring key-ring \ --location location \ --digest-algorithm digest-algorithm \ --input-file input-file \ --signature-file signature-file
key-version は、署名に使用する鍵のバージョンに置き換えます。key は、鍵名で置き換えます。key-ring は、鍵が配置されている鍵リングの名前に置き換えます。location を鍵リングの Cloud KMS の場所に置き換えます。digest-algorithm は、使用するアルゴリズムに置き換えます。input-file を Cloud KMS に送信して署名する場合は、digest-algorithm を省略します。input-file と signature-file は、署名するファイルのローカルパスと署名ファイルに置き換えます。
すべてのフラグと有効な値については、--help
フラグを指定してコマンドを実行してください。
C#
このコードを実行するには、まず C# 開発環境を設定し、Cloud KMS C# SDK をインストールします。
Go
このコードを実行するには、まず Go 開発環境を設定し、Cloud KMS Go SDK をインストールします。
Java
このコードを実行するには、まず Java 開発環境を設定し、Cloud KMS Java SDK をインストールします。
Node.js
このコードを実行するには、まず Node.js 開発環境を設定し、Cloud KMS Node.js SDK をインストールします。
PHP
このコードを実行するには、まず Google Cloud での PHP の使用について学び、Cloud KMS PHP SDK をインストールします。
Python
このコードを実行するには、まず Python 開発環境を設定し、Cloud KMS Python SDK をインストールします。
Ruby
このコードを実行するには、まず Ruby 開発環境を設定し、Cloud KMS Ruby SDK をインストールします。
API
これらの例では、HTTP クライアントとして curl を使用して API の使用例を示しています。アクセス制御の詳細については、Cloud KMS API へのアクセスをご覧ください。
CryptoKeyVersions.asymmetricSign
メソッドを使用して署名を行います。このメソッドからのレスポンスに、base64 エンコードの署名が含まれています。
楕円曲線署名の検証
gcloud
コマンドラインで Cloud KMS を使用するには、まず Google Cloud CLI の最新バージョンをインストールまたはアップグレードします。
公開鍵を取得する
gcloud kms keys versions get-public-key key-version \ --key key \ --keyring key-ring \ --location location \ --output-file output-file
key-version を鍵バージョンに置き換えます。key を鍵の名前に置き換えます。key-ring は、鍵が配置されている鍵リングの名前に置き換えます。location を鍵リングの Cloud KMS の場所に置き換えます。output-file は、ローカル システム上の公開鍵を保存するファイルパスに置き換えます。
すべてのフラグと有効な値については、--help
フラグを指定してコマンドを実行してください。
署名の検証
署名を検証する OpenSSL コマンドは、作成された署名の種類によって異なります。たとえば、OpenSSL を使用して SHA-256 曲線の署名を検証するには、-sha256
を指定する必要があります。SHA-384 だ円曲線の署名を検証するには、-sha384
を指定する必要があります。
openssl dgst \ -sha256 \ -verify public-key-file \ -signature signature-file \ message-file
変数を独自の値に置き換えます。
public-key-file。公開鍵を含むファイルへのパス(
"./my-key.pub"
など)。signature-file。検証する署名を含むファイルへのパス(
"./my-data.sig"
など)。message-file。メッセージを含むファイルへのパス(
"./my-data.txt"
など)。
署名が有効な場合、コマンドは文字列 Verified OK
を出力します。
すべてのフラグと有効な値については、help
サブコマンドを指定してコマンドを実行してください。
C#
このコードを実行するには、まず C# 開発環境を設定し、Cloud KMS C# SDK をインストールします。
Go
このコードを実行するには、まず Go 開発環境を設定し、Cloud KMS Go SDK をインストールします。
Java
このコードを実行するには、まず Java 開発環境を設定し、Cloud KMS Java SDK をインストールします。
Node.js
このコードを実行するには、まず Node.js 開発環境を設定し、Cloud KMS Node.js SDK をインストールします。
PHP
このコードを実行するには、まず Google Cloud での PHP の使用について学び、Cloud KMS PHP SDK をインストールします。
Python
このコードを実行するには、まず Python 開発環境を設定し、Cloud KMS Python SDK をインストールします。
Ruby
このコードを実行するには、まず Ruby 開発環境を設定し、Cloud KMS Ruby SDK をインストールします。
API
これらの例では、HTTP クライアントとして curl を使用して API の使用例を示しています。アクセス制御の詳細については、Cloud KMS API へのアクセスをご覧ください。
CryptoKeyVersions.getPublicKey メソッドを使用して公開鍵を取得し、さらにコマンドライン用の例を使用して署名を検証します。
RSA 署名の検証
gcloud
コマンドラインで Cloud KMS を使用するには、まず Google Cloud CLI の最新バージョンをインストールまたはアップグレードします。
公開鍵を取得する
gcloud kms keys versions get-public-key key-version \ --key key \ --keyring key-ring \ --location location \ --output-file output-file
key-version を鍵バージョンに置き換えます。key を鍵の名前に置き換えます。key-ring は、鍵が配置されている鍵リングの名前に置き換えます。location を鍵リングの Cloud KMS の場所に置き換えます。output-file は、ローカル システム上の公開鍵を保存するパスに置き換えます。
すべてのフラグと有効な値については、--help
フラグを指定してコマンドを実行してください。
署名の検証
署名を検証する OpenSSL コマンドは、作成された署名の種類によって異なります。たとえば、SHA-256 RSA 署名を PSS パディングで検証するには、-sha256
と -sigopt rsa_padding_mode:pss
を指定する必要があります。PSS パディングで SHA-512 RSA 署名を検証するには、-sha512
と -sigopt
rsa_padding_mode:pss
を指定する必要があります。
openssl dgst \ -sha256 \ -sigopt rsa_padding_mode:pss \ -sigopt rsa_pss_saltlen:-1 \ -verify public-key-file \ -signature signature-file \ message-file
変数を独自の値に置き換えます。
public-key-file。公開鍵を含むファイルへのパス(
"./my-key.pub"
など)。signature-file。検証する署名を含むファイルへのパス(
"./my-data.sig"
など)。message-file。メッセージを含むファイルへのパス(
"./my-data.txt"
など)。
署名が有効な場合、コマンドは文字列 Verified OK
を出力します。
すべてのフラグと有効な値については、help
サブコマンドを指定してコマンドを実行してください。
C#
このコードを実行するには、まず C# 開発環境を設定し、Cloud KMS C# SDK をインストールします。
Go
このコードを実行するには、まず Go 開発環境を設定し、Cloud KMS Go SDK をインストールします。
Java
このコードを実行するには、まず Java 開発環境を設定し、Cloud KMS Java SDK をインストールします。
Node.js
このコードを実行するには、まず Node.js 開発環境を設定し、Cloud KMS Node.js SDK をインストールします。
PHP
このコードを実行するには、まず Google Cloud での PHP の使用について学び、Cloud KMS PHP SDK をインストールします。
Python
このコードを実行するには、まず Python 開発環境を設定し、Cloud KMS Python SDK をインストールします。
Ruby
このコードを実行するには、まず Ruby 開発環境を設定し、Cloud KMS Ruby SDK をインストールします。
API
これらの例では、HTTP クライアントとして curl を使用して API の使用例を示しています。アクセス制御の詳細については、Cloud KMS API へのアクセスをご覧ください。
CryptoKeyVersions.getPublicKey
メソッドを使用して公開鍵を取得し、さらにコマンドライン用の例を使用して署名を検証します。