OSS mengembalikan error SignatureDoesNotMatch ketika signature dalam permintaan Anda tidak sesuai dengan yang dihitung oleh server. Badan respons error mencakup bidang diagnostik yang secara tepat mengidentifikasi lokasi ketidaksesuaian tersebut.
Contoh respons error:
StringToSign = VERB + "\n"
+ Content-MD5 + "\n" /* hash MD5 dari badan permintaan; biarkan kosong jika tidak ada badan */
+ Content-Type + "\n" /* jenis MIME; biarkan kosong jika tidak diatur */
+ Date + "\n" /* nilai header Date HTTP */
+ CanonicalizedOSSHeaders /* header x-oss-* yang diurutkan */
+ CanonicalizedResource /* Bucket + jalur + subsumber daya */
Signature = base64(hmac-sha1(AccessKeySecret, StringToSign))| Bidang | Deskripsi |
|---|---|
SignatureProvided | String signature yang dikirim oleh client Anda |
StringToSign | String yang digunakan server untuk menghitung signature yang diharapkan |
StringToSignBytes | Nilai byte heksadesimal dari StringToSign — berguna untuk mendiagnosis masalah pengkodean (encoding) |
RequestId | Pengidentifikasi unik permintaan yang dapat Anda berikan saat menghubungi Alibaba Cloud Support |
Pemecahan Masalah
Lakukan langkah-langkah berikut secara berurutan. Hentikan pada langkah yang berhasil mengatasi error.
Langkah 1: Verifikasi ID AccessKey dan rahasia AccessKey Anda
Login ke ossbrowser menggunakan ID AccessKey dan rahasia AccessKey yang digunakan aplikasi Anda. Jika login gagal, kredensial tersebut tidak valid atau telah dicabut—perbarui (rotate) dan perbarui aplikasi Anda.
Langkah 2: Verifikasi metode penandatanganan
OSS mendukung dua metode penandatanganan. Pastikan kode Anda menerapkan algoritma yang benar untuk metode yang Anda gunakan.
Metode 1: Sertakan signature dalam header Authorization
Untuk detailnya, lihat Include signatures in the Authorization header.
StringToSign = VERB + "\n"
+ Content-MD5 + "\n" /* Hash MD5 dari badan permintaan; kosongkan jika tidak ada badan */
+ Content-Type + "\n" /* Jenis MIME; kosongkan jika tidak diatur */
+ Date + "\n" /* Nilai header HTTP Date */
+ CanonicalizedOSSHeaders /* Header x-oss-* yang diurutkan */
+ CanonicalizedResource /* Bucket + path + subresource */
Signature = base64(hmac-sha1(AccessKeySecret, StringToSign))Metode 2: Tambahkan signature ke URL
Untuk detailnya, lihat Add signatures to URLs.
StringToSign = VERB + "\n"
+ CONTENT-MD5 + "\n" /* Biasanya kosong untuk URL yang ditandatangani sebelumnya */
+ CONTENT-TYPE + "\n" /* Biasanya kosong untuk URL yang ditandatangani sebelumnya */
+ EXPIRES + "\n" /* Timestamp Unix saat URL kedaluwarsa */
+ CanonicalizedOSSHeaders /* Header x-oss-* yang diurutkan */
+ CanonicalizedResource /* Bucket + path + subresource */
Signature = urlencode(base64(hmac-sha1(AccessKeySecret, StringToSign)))Catatan: Untuk menghindari implementasi manual algoritma signature, gunakan OSS SDK. SDK menangani perhitungan signature secara otomatis.
Langkah 3: Bandingkan nilai StringToSign
Server menyertakan StringToSign yang dihitungnya dalam respons error. Bandingkan dengan StringToSign yang dihasilkan client Anda.
Contoh permintaan:
PUT /bucket/abc?acl
Date: Wed, 24 May 2023 02:12:30 GMT
Authorization: OSS qn6q**************:77Dv****************
x-oss-abc: mymetaStringToSign yang dihasilkan:
PUT\n /* Metode HTTP */
\n /* Content-MD5 (kosong — tidak ada badan) */
\n /* Content-Type (kosong — tidak diatur) */
Wed, 24 May 2023 02:12:30 GMT\n /* Date */
x-oss-abc:mymeta\n /* CanonicalizedOSSHeaders */
/bucket/abc?acl /* CanonicalizedResource */Periksa setiap bidang secara berurutan:
| Bidang | Yang harus diperiksa |
|---|---|
| Metode HTTP | Sesuai dengan kata kerja HTTP permintaan (PUT, GET, dll.) |
| Content-MD5 | Kosong kecuali Anda mengatur header Content-MD5 dalam permintaan |
| Content-Type | Kosong kecuali Anda mengatur header Content-Type dalam permintaan |
| Date | Sesuai persis dengan nilai header Date, termasuk spasi putih |
| CanonicalizedOSSHeaders | Semua header x-oss-* disertakan, diubah ke huruf kecil, dipangkas, dan diurutkan secara alfabetis |
| CanonicalizedResource | Nama bucket, path objek, dan subresource semuanya ada dan diformat dengan benar |
Jika StringToSign dalam respons error berbeda dari yang dihasilkan client Anda, perbedaan tersebut menunjukkan bidang mana yang perlu diperbaiki.
Tips: Gunakan StringToSignBytes dari respons error untuk mendeteksi karakter tak terlihat atau masalah pengkodean. Tempelkan urutan heksadesimal tersebut ke decoder dan bandingkan byte per byte dengan output client Anda.