メニュー
アマゾン ウェブ サービス
全般的なリファレンス (Version 1.0)

署名バージョン 4 の署名キーを取得する方法の例

このページでは、署名バージョン 4 の署名キーを取得する方法の例を、いくつかのプログラミング言語で示します。このページの例では、署名キーを取得する方法のみを示します。これは AWS リクエストへの署名の一部にすぎません。完全なプロセスを示す例については、「完全なバージョン 4 署名プロセスの例 (Python) 」を参照してください。

注記

いずれかの AWS SDK (SDK for Java、.NET、Python、Ruby、または JavaScript を含む) を使用する場合は、署名キーの取得ステップと認証情報のリクエストへの追加ステップを手動で実行する必要がありません。SDK がその作業を実行します。HTTP または HTTPS リクエストを直接作成する場合は、リクエストに手動で署名する必要があります。

Java を使用して署名キーを取得

Copy
static byte[] HmacSHA256(String data, byte[] key) throws Exception { String algorithm="HmacSHA256"; Mac mac = Mac.getInstance(algorithm); mac.init(new SecretKeySpec(key, algorithm)); return mac.doFinal(data.getBytes("UTF8")); } static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) throws Exception { byte[] kSecret = ("AWS4" + key).getBytes("UTF8"); byte[] kDate = HmacSHA256(dateStamp, kSecret); byte[] kRegion = HmacSHA256(regionName, kDate); byte[] kService = HmacSHA256(serviceName, kRegion); byte[] kSigning = HmacSHA256("aws4_request", kService); return kSigning; }

.NET (C#) を使用して署名キーを取得

Copy
static byte[] HmacSHA256(String data, byte[] key) { String algorithm = "HmacSHA256"; KeyedHashAlgorithm kha = KeyedHashAlgorithm.Create(algorithm); kha.Key = key; return kha.ComputeHash(Encoding.UTF8.GetBytes(data)); } static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) { byte[] kSecret = Encoding.UTF8.GetBytes(("AWS4" + key).ToCharArray()); byte[] kDate = HmacSHA256(dateStamp, kSecret); byte[] kRegion = HmacSHA256(regionName, kDate); byte[] kService = HmacSHA256(serviceName, kRegion); byte[] kSigning = HmacSHA256("aws4_request", kService); return kSigning; }

Python を使用して署名キーを取得

Copy
def sign(key, msg): return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest() def getSignatureKey(key, dateStamp, regionName, serviceName): kDate = sign(("AWS4" + key).encode("utf-8"), dateStamp) kRegion = sign(kDate, regionName) kService = sign(kRegion, serviceName) kSigning = sign(kService, "aws4_request") return kSigning

Ruby を使用して署名キーを取得

Copy
def getSignatureKey key, dateStamp, regionName, serviceName kDate = OpenSSL::HMAC.digest('sha256', "AWS4" + key, dateStamp) kRegion = OpenSSL::HMAC.digest('sha256', kDate, regionName) kService = OpenSSL::HMAC.digest('sha256', kRegion, serviceName) kSigning = OpenSSL::HMAC.digest('sha256', kService, "aws4_request") kSigning end

JavaScript を使用して署名キーを取得

次の例では、Crypto-JS ライブラリを使用します。詳細については、https://www.npmjs.com/package/crypto-jsと、https://code.google.com/archive/p/crypto-js/を参照してください。

Copy
var crypto = require("crypto-js"); function getSignatureKey(Crypto, key, dateStamp, regionName, serviceName) { var kDate = Crypto.HmacSHA256(dateStamp, "AWS4" + key); var kRegion = Crypto.HmacSHA256(regionName, kDate); var kService = Crypto.HmacSHA256(serviceName, kRegion); var kSigning = Crypto.HmacSHA256("aws4_request", kService); return kSigning; }

他の言語を使用して署名キーを取得

異なるプログラミング言語でこのロジックを実装する必要がある場合は、このセクションの値と照らしてキー取得アルゴリズムの中間ステップをテストすることをお勧めします。次の Ruby の例では、アルゴリズムの各ステップの後に hexEncode 関数を使用して結果を表示します。

Copy
def hexEncode bindata result="" data=bindata.unpack("C*") data.each {|b| result+= "%02x" % b} result end

次のテストを入力すると

Copy
key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY' dateStamp = '20120215' regionName = 'us-east-1' serviceName = 'iam'

プログラムは、getSignatureKey の値用に次の値を生成します。これらはバイナリデータの 16 進エンコード表現ですが、キー自体と中間値はバイナリ形式となることに注意してください。

Copy
kSecret = '41575334774a616c725855746e46454d492f4b374d44454e472b62507852666943594558414d504c454b4559' kDate = '969fbb94feb542b71ede6f87fe4d5fa29c789342b0f407474670f0c2489e0a0d' kRegion = '69daa0209cd9c5ff5c8ced464a696fd4252e981430b10e3d3fd8e2f197d7a70c' kService = 'f72cfd46f26bc4643f06a11eabb6c0ba18780c19a8da0c31ace671265e3c87fa' kSigning = 'f4780e2d9f65fa895f9c67b32ce1baf0b0d8a43505a000a1a9e090d414db404d'

一般的なコーディングのエラー

タスクを簡素化できるよう、次の一般的なコーディングエラーは回避してください。

ヒント

raw HTTP リクエストを表示するツールを使用して、AWS に送信する HTTP リクエストを確認してください。これは、コード上では見つけにくい問題を特定するのに役立ちます。

  • 余分な改行文字を含めないでください。また、必要な場所で改行文字を忘れないようにしてください。

  • YYYYMMDD ではなくタイムスタンプを使用するなど、認証情報スコープで正しくない日付の書式を使用しないでください。

  • 正規ヘッダーのヘッダーと署名付きヘッダーが同じであることを確認します。

  • 中間キーを計算するときのキーとデータ (メッセージ) を取り違えないでください。前のステップの計算の結果は、データはなくキーです。パラメータを適切な順番で配置できるよう、暗号プリミティブのドキュメントをよく確認します。

  • 最初のステップのキーの先頭への文字列「AWS4」の追加を忘れないでください。for ループまたはイテレーターを使用してキーの取得を実装する場合、「AWS4」の文字列を含むように、最初のイテレーションの特殊なケースを記述するのを忘れないでください。

可能性のあるエラーの詳細については、AWS 署名バージョン 4 に関連するエラーのトラブルシューティング を参照してください。