本文主要介紹OSS簽名錯誤的常見情境以及排查方法。
簽名錯誤判錯資訊
<?xml version="1.0" encoding="UTF-8"?>
<Error>
<Code>SignatureDoesNotMatch</Code>
<Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>
<RequestId>646DCB189AE2D1333018****</RequestId>
<HostId>bucket.oss-cn-hangzhou.aliyuncs.com</HostId>
<OSSAccessKeyId>LTAI5tMw7e8zyBazfpSS****</OSSAccessKeyId>
<SignatureProvided>tPN3MChhuKk2XixolQLonoJW****</SignatureProvided>
<StringToSign>PUT\n\n\nTue, 23 May 2023 15:24:55 GMT\n/bucket/?acl</StringToSign>
<StringToSignBytes>50 55 54 0A 0A 0A 54 75 65 2C 20 32 33 20 4D 61 79 20 32 30 32 33 20 31 35 3A 32 34 3A 35 35 20 47 4D 54 0A 2F 64 69 6E 61 72 79 2F 3F 61 63 6C </StringToSignBytes>
<EC>0002-00000040</EC>
</Error>
使用API介面或者SDK訪問OSS時,用戶端需要攜帶簽名資訊以供OSS服務端進行身份認證。如果伺服器返回如上所示的響應,說明您在請求中提供的簽名與服務端計算的不一致,導致請求被拒絕。
簽名錯誤排查方法
如果您的請求出現簽名報錯,您可以按照以下步驟進行排查。
確認簽名所用的AccessKey ID與AccessKey Secret是否填寫正確。
您可以使用AccessKey ID與AccessKey Secret登入ossbrowser來驗證正確性。具體步驟,請參見安裝並登入ossbrowser。
檢查簽名演算法是否正確。
OSS提供兩種攜帶簽名的請求方式,分別為在Header中包含簽名和在URL中包含簽名。關於這兩種簽名方式的演算法說明如下:
在Header中包含簽名
StringToSign = VERB + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedOSSHeaders + CanonicalizedResource Signature = base64(hmac-sha1(AccessKeySecret, StringToSign)
在URL中包含簽名
StringToSign = VERB + "\n" + CONTENT-MD5 + "\n" + CONTENT-TYPE + "\n" + EXPIRES + "\n" + CanonicalizedOSSHeaders + CanonicalizedResource Signature = urlencode(base64(hmac-sha1(AccessKeySecret, StringToSign)))
如果業務情境允許,推薦您使用SDK訪問OSS,免去手動計算簽名的過程。具體步驟,請參見使用阿里雲SDK發起請求概述。
比對響應體中的
StringToSign
欄位與您發起請求的內容是否存在差異。StringToSign
欄位表示待簽字串,即簽名演算法中需要使用AccessKey Secret進行加密的內容。請求樣本如下:
PUT /bucket/abc?acl Date: Wed, 24 May 2023 02:12:30 GMT Authorization: OSS qn6qrrqxo2oawuk53otf****:77Dvh5wQgIjWjwO/KyRt8dOP**** x-oss-abc: mymeta
以上請求計算得到的待簽字串應為:
PUT\n\n\nWed, 24 May 2023 02:12:30 GMT\nx-oss-abc:mymeta\n/bucket/abc?acl