ファイルへの署名に、AWS Key Management Service (AWS KMS) を使用したいです。署名を行った後、ファイル、かかるファイルの署名、パブリックキーを共有し、署名が有効であることを検証したいです。AWS KMS キーにアクセスするユーザーに API アクセスを付与することは避けたいです。
解決策
次の例では、ECC_NIST_P256 (secp256r1) 非対称キーペアを使用する AWS KMS を使用しています。AWS KMS がこのキーペアを使用して署名ファイルを生成すると、ファイルは NIST FIPS 168-4 に準拠して作成されます。(r, ** s**) 値を含む ECDSA デジタル署名は、ANS X9.62 の指定に従って生成されます。オープン規格のため、署名の検証には OpenSSL を使用できます。
RSA キーペアの署名形式を取得するには、「署名と検証に関する RSA キーの仕様」を参照してください。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI で発生したエラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用していることを確認してください。
ローカルファイルに署名する
AWS アカウントで AWS KMS 非対称キーを作成した後、AWS CLI を使用してファイルに署名するときのキーを参照します。AWS KMS API が返す応答は、base64 でエンコードされています。次の例では、--query パラメータを使用して応答から署名値を取得し、sign.b64 ファイルに格納します。
[ec2-user@ip-172-31-23-22 ~]$ aws kms sign --key-id arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab --message fileb://message.txt --signing-algorithm ECDSA_SHA_256 --query 'Signature' --output text > sign.b64
注: 最大 4096 B のメッセージを送信できます。サイズの大きいメッセージに署名するには、メッセージのハッシュダイジェストを生成します。次に、メッセージパラメータにハッシュダイジェストを指定します。メッセージが完全なメッセージかダイジェストかを示すには、MessageType パラメータを使用します。後で署名を検証するために、署名アルゴリズムを書き留めておきます。
署名は base64 形式なので、次の Linux base64 エンコーディングコマンドを実行して形式をバイナリに変換します。
[ec2-user@ip-172-31-23-22 ~]$ base64 -d sign.b64 > sign.bin
次のコマンドを実行し、Windows オペレーティングシステム (OS) 用の base64 ファイルをデコードします。
certutil -decode C:\Temp\sign.b64 C:\Temp\sign.bin
完了後、sign.b64 署名ファイルを共有できるようになります。
AWS KMS の署名を検証する
署名ファイルを検証するには、パブリックキーが必要です。パブリックキーを取得するには、AWS CLI コマンド get-public-key を実行します。
[ec2-user@ip-172-31-23-22 ~]$ aws kms get-public-key --key-id arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab --output text --query 'PublicKey' > KMSPublic.b64
次のコマンドを実行し、base64 ファイルを KMSPublic.key という名前の DER エンコードされたファイルに変換します。
[ec2-user@ip-172-31-23-22 ~]$ base64 -d KMSPublic.b64 > KMSPublic.key
完了すると、バイナリ形式のパブリックキーと署名および、message.txt ファイルができます。
署名を確認するには、OpenSSL コマンド dgst を実行します。
[ec2-user@ip-172-31-23-22 ~]$ openssl dgst -sha256 -verify KMSPublic.key -keyform DER -signature sign.bin message.txtVerified OK
出力に "Verified OK" と表示されている場合、検証に成功しています。
検証の応答を受信しなかった場合は、次のことを確認してください。
- OpenSSL 署名アルゴリズムは、ファイルの署名に使用したものと同一である。
- ファイルが base64 でエンコードされていない。
関連情報
暗号プリミティブ
AWS KMS の概念