OSS は、リクエストに含まれる署名とサーバーが計算した署名が一致しない場合、SignatureDoesNotMatch エラーを返します。エラー応答ボディには、不一致が発生した箇所を特定する診断用フィールドが含まれています。
エラー応答の例:
StringToSign = VERB + "\n"
+ Content-MD5 + "\n" /* リクエストボディの MD5 ハッシュ。ボディがない場合は空白のままにします */
+ Content-Type + "\n" /* MIME タイプ。設定されていない場合は空白のままにします */
+ Date + "\n" /* HTTP Date ヘッダーの値 */
+ CanonicalizedOSSHeaders /* 並べ替えられた x-oss-* ヘッダー */
+ CanonicalizedResource /* バケット + パス + サブリソース */
Signature = base64(hmac-sha1(AccessKeySecret, StringToSign))| フィールド | 説明 |
|---|---|
SignatureProvided | クライアントが送信した署名文字列 |
StringToSign | サーバーが期待される署名を計算するために使用した文字列 |
StringToSignBytes | StringToSign の 16 進数バイト値 — エンコーディング関連の問題を診断する際に有用 |
RequestId | Alibaba Cloud サポートへお問い合わせの際にお伝えいただく一意のリクエスト識別子 |
トラブルシューティング
以下の手順を順に実行してください。エラーが解消された時点で、以降の手順は実施する必要はありません。
ステップ 1:AccessKey ID および AccessKey Secret の検証
アプリケーションで使用している AccessKey ID と AccessKey Secret を使用して ossbrowser にログインします。 ログインに失敗した場合、認証情報が無効になっているか、取り消されています。認証情報を回転させ、アプリケーションを更新してください。
ステップ 2:署名アルゴリズムの検証
OSS では、2 種類の署名アルゴリズムがサポートされています。ご使用の方法に対応した正しいアルゴリズムがコードに実装されていることを確認してください。
方法 1:Authorization ヘッダーに署名を含める
詳細については、「Authorization ヘッダーに署名を含める」をご参照ください。
StringToSign = VERB + "\n"
+ Content-MD5 + "\n" /* リクエストボディの MD5 ハッシュ;ボディがない場合は空欄 */
+ Content-Type + "\n" /* MIME タイプ;未設定の場合は空欄 */
+ Date + "\n" /* HTTP Date ヘッダーの値 */
+ CanonicalizedOSSHeaders /* ソート済みの x-oss-* ヘッダー */
+ CanonicalizedResource /* バケット名 + パス + サブリソース */
Signature = base64(hmac-sha1(AccessKeySecret, StringToSign))方法 2:URL に署名を追加する
詳細については、「URL に署名を追加する」をご参照ください。
StringToSign = VERB + "\n"
+ CONTENT-MD5 + "\n" /* 事前署名付き URL の場合、通常は空欄 */
+ CONTENT-TYPE + "\n" /* 事前署名付き URL の場合、通常は空欄 */
+ EXPIRES + "\n" /* URL の有効期限を示す UNIX タイムスタンプ */
+ CanonicalizedOSSHeaders /* ソート済みの x-oss-* ヘッダー */
+ CanonicalizedResource /* バケット名 + パス + サブリソース */
Signature = urlencode(base64(hmac-sha1(AccessKeySecret, StringToSign)))注意: 署名アルゴリズムを手動で実装するのを避けるために、OSS SDK を使用してください。SDK は署名の計算を自動的に処理します。
ステップ 3:StringToSign 値の比較
サーバーは、エラー応答に自身が計算した StringToSign を含めます。これをクライアント側で生成した StringToSign と比較してください。
リクエストの例:
PUT /bucket/abc?acl
Date: Wed, 24 May 2023 02:12:30 GMT
Authorization: OSS qn6q**************:77Dv****************
x-oss-abc: mymeta生成される StringToSign:
PUT\n /* HTTP メソッド */
\n /* Content-MD5(空欄 — ボディなし) */
\n /* Content-Type(空欄 — 未設定) */
Wed, 24 May 2023 02:12:30 GMT\n /* Date */
x-oss-abc:mymeta\n /* CanonicalizedOSSHeaders */
/bucket/abc?acl /* CanonicalizedResource */各フィールドを順に確認してください:
| フィールド | 確認事項 |
|---|---|
| HTTP メソッド | リクエストの HTTP 動詞(PUT、GET など)と一致すること |
| Content-MD5 | リクエストで Content-MD5 ヘッダーが設定されていない限り、空欄であること |
| Content-Type | リクエストで Content-Type ヘッダーが設定されていない限り、空欄であること |
| Date | Date ヘッダーの値と完全に一致すること(空白文字を含む) |
| CanonicalizedOSSHeaders | すべての x-oss-* ヘッダーが小文字化・トリミングされ、アルファベット順にソートされて含まれていること |
| CanonicalizedResource | バケット名、オブジェクトパス、サブリソースがすべて存在し、正しいフォーマットで記述されていること |
エラー応答に含まれる StringToSign とクライアント側で生成した値が異なる場合、その差異から修正すべきフィールドを特定できます。
ヒント:StringToSignBytes を使用すると、非表示文字やエンコーディングの問題を検出できます。16 進数シーケンスをデコーダーに貼り付け、クライアントの出力とバイト単位で比較してください。