キー管理サービス (AWS KMS) を使用してファイルに署名したいと考えています。さらに、署名が有効であることを確認するために、ファイル、署名、およびパブリックキーを共有したいと考えています。ただし、AWS KMS キーにアクセスするための API アクセスをユーザーに提供するつもりはありません。
解決方法
次の例では、ECC_NIST_P256 (secp256r1) の非対称キーペアがある AWS KMS を使用しています。AWS KMS がこのキーペアを使用して署名ファイルを生成すると、NIST FIPS 168-4 に従って署名が作成されます。ANS X9.62 で規定されているように、(r、s) 値を含む ECDSA デジタル署名が生成されます。オープンスタンダードであるため、OpenSSL を使用してこの署名を検証できます。
RSA キーペアの署名形式を取得するには、手順に従って AWS KMS キーの作成および管理を行います。
注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、AWS CLI の最新バージョンを使用していることを確認してください。
AWS KMS を使用してローカルファイルに署名する
アカウントで 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 バイトまで送信できます。より大きなメッセージに署名するには、メッセージのハッシュダイジェストを生成します。続いて、メッセージパラメーターにハッシュダイジェストを指定します。メッセージが完全なメッセージとダイジェストのどちらであるかを示すには、MessageType パラメーターを使用します。署名アルゴリズムは、後で署名を検証する際に必要になるため、必ずメモしておいてください。
署名は Base64 形式であるため、次のような Linux base64 encoding コマンドを使用してバイナリ形式に変換できます。
[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
OpenSSL を使用して AWS KMS の署名を検証する
これにより sign.b64 署名ファイルを共有できます。署名ファイルを検証するには、パブリックキーが必要です。パブリックキーを取得するには、次のような 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
KMSPublic.key という名前の別のファイルを使用して base64 ファイルを 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.txt
Verified OK
この例では、「Verified OK」の出力で検証が成功したことが示されています。
懸賞のレスポンスが届かない場合は、次の点を確認してください。
- OpenSSL 署名アルゴリズムが、ファイルの署名に使用されたものと同じであること。
- ファイルが Base64 でエンコードされていないこと。
関連情報
暗号プリミティブ
「AWS KMS の概念」