Amazonは一貫してPHPまたはCFとは異なるハッシュを生成するため、永続的な「SignatureDoesNotMatch」エラーが発生します。
ドキュメントによると、 [RESTヘッダーなしの]GETリクエストは次のように署名されています。
Signature = URL-Encode( Base64( HMAC-SHA1( SecretAccessKey, UTF-8-Encoding-Of( StringToSign ) ) ) );
StringToSign = HTTP-VERB + "\n" +
Content-MD5 + "\n" +
Content-Type + "\n" +
Expires + "\n" +
CanonicalizedAmzHeaders +
CanonicalizedResource;
サンプルデータ:
- SecretAccessKey:wJalrXUtnFEMI / K7MDENG / bPxRfiCYEXAMPLEKEY
- Content-MD5およびContent-Type:(オプション-スキップ)
- CanonicalizedAmzHeaders :(ヘッダーなし-スキップ)
- リソース:johnsmith.s3.amazonaws.com/photos/puppy.jpg
- CanonicalizedResource:/johnsmith/photos/puppy.jpg
2つの例が提供されています。
- 有効期限1175139620 ; 署名:rucSbH0yNEcP9oM2XNlouVI3BH4%3D
- 有効期限1141889120 ; 署名:vjbyPxybdZaNmGa%2ByT272YEAiv4%3D
これを再作成するには(ここからCFHMAC ):
// PHP
$expires = 1175139620;
$SecretAccessKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY";
$StringToSign = "GET\n\n\n$expires\n/johnsmith/photos/puppy.jpg";
$signature = urlencode( base64_encode( hash_hmac('sha1', utf8_encode($StringToSign), $SecretAccessKey, true)));
// ColdFusion
<cfset LF = chr(10)>
<cfset expires = 1141889120>
<cfset SecretAccessKey = "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY">
<cfset StringToSign = "GET#LF##LF##LF##expires##LF#/johnsmith/photos/puppy.jpg">
<cfset signature = URLEncodedFormat( CFHMAC(StringToSign, SecretAccessKey))>
両方の言語によって返される$signatureが次のとおりであることを除いて:
- 有効期限1175139620 ; 署名:NpgCjnDzrM%2BWFzoENXmpNDUsSn8%3D
- 有効期限1141889120 ; 署名:fScKGHCDI0NY5E7CYp9Vc8VKMbY%3D
私たちは他の人が言及しているこれらの落とし穴に注意してきました:
- hash_macには3番目の引数rawがあり、これはtrueに設定する必要があります。
- S3擬似コードのstringToSignとキーの順序を逆にする必要があります。
- stringToSign全体が1行にある必要があります(余分な改行文字が作成されないようにするため)。
編集:リーの答えに基づいてCFコードの改行を更新しました。これで、CFはPHPと一致します。
私は明らかに何か間違ったことをしていますが、何がわからないのです。
[Amazon S3はCSSと呼ばれるだろうと聞いたことがあります-「複雑なストレージサービス」ですが、その名前はすでに使われています!]
助けてください!