Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Memecahkan masalah penandatanganan Tanda Tangan Versi 4 untuk AWS Permintaan API
penting
Kecuali Anda menggunakan AWS SDK atau CLI, Anda harus menulis kode untuk menghitung tanda tangan yang memberikan informasi otentikasi dalam permintaan Anda. Perhitungan tanda tangan SIGv4 dapat menjadi tugas yang kompleks, dan kami sarankan Anda menggunakan AWS SDK atau CLI bila memungkinkan.
Saat Anda mengembangkan kode yang membuat permintaan yang ditandatangani, Anda mungkin menerima HTTP 403 SignatureDoesNotMatch dari Layanan AWS. Kesalahan ini berarti bahwa nilai tanda tangan dalam permintaan HTTP Anda AWS tidak cocok dengan tanda tangan yang di Layanan AWS hitung. Kes Unauthorized alahan HTTP 401 kembali ketika izin tidak mengizinkan pemanggil untuk membuat permintaan.
Permintaan API mungkin mengembalikan kesalahan jika:
-
Permintaan API tidak ditandatangani dan permintaan API menggunakan otentikasi IAM.
-
KredenSIAL IAM yang digunakan untuk menandatangani permintaan salah atau tidak memiliki izin untuk memanggil API.
-
Tanda tangan permintaan API yang ditandatangani tidak cocok dengan tanda tangan yang dihitung AWS layanan.
-
Header permintaan API salah.
catatan
Perbarui protokol penandatanganan Anda dari Sig AWS nature versi 2 (SIGv2) ke Sig AWS nature versi 4 (SIGv4) sebelum menjelajahi solusi kesalahan lainnya. Layanan, seperti Amazon S3, dan Wilayah tidak lagi mendukung penandatanganan SIGv2.
Kemungkinan penyebab
Kesalahan kredensi
Pastikan permintaan API ditandatangani dengan SIGv4. Jika permintaan API tidak ditandatangani, maka Anda mungkin menerima kesalahan:Missing Authentication Token. Tambahkan tanda tangan yang hilang dan kirim ulang permintaan.
Pastikan kredentif otentikasi untuk kunci akses dan kunci rahasia sudah benar. Jika kunci akses salah, maka Anda mungkin menerima kesalahan:Unauthorized. Pastikan entitas yang digunakan untuk menandatangani permintaan diberi wewenang untuk membuat permintaan. Lihat perinciannya di Memecahkan masalah pesan kesalahan akses ditolak.
Permintaan kanonik dan kesalahan string penandatanganan
Jika Anda salah menghitung permintaan kanonik di Buat hash permintaan kanonik atauBuat string untuk ditandatangani, langkah verifikasi tanda tangan yang dilakukan oleh layanan gagal dengan pesan kesalahan:
The request signature we calculated does not match the signature you provided
Ketika AWS layanan menerima permintaan yang ditandatangani, ia menghitung ulang tanda tangan. Jika ada perbedaan dalam nilai, maka tanda tangan tidak cocok. Bandingkan permintaan kanonik dan string dengan permintaan yang ditandatangani dengan nilai dalam pesan kesalahan. Ubah proses penandatanganan jika ada perbedaan.
catatan
Anda juga dapat memverifikasi bahwa Anda tidak mengirim permintaan melalui proxy yang mengubah header atau permintaan.
contoh Contoh permintaan kanonik
GET -------- HTTP method / -------- Path. For API stage endpoint, it should be /{stage-name}/{resource-path} -------- Query string key-value pair. Leave it blank if the request doesn't have a query string. content-type:application/json -------- Header key-value pair. One header per line. host:0123456789.execute-api.us-east-1.amazonaws.com -------- Host and x-amz-date are required headers for all signed requests. x-amz-date:20220806T024003Z content-type;host;x-amz-date -------- A list of signed headers d167e99c53f15b0c105101d468ae35a3dc9187839ca081095e340f3649a04501 -------- Hash of the payload
Untuk memverifikasi bahwa kunci rahasia cocok dengan ID kunci akses, Anda dapat mengujinya dengan implementasi kerja yang diketahui. Misalnya, gunakan AWS SDK atau AWS CLI untuk membuat permintaan ke AWS.
Header permintaan API
Ketika header otorisasi kosong, kunci kredensi atau tanda tangan hilang atau salah, header tidak dimulai dengan nama algoritma, atau pasangan nilai kunci tidak menyertakan tanda sama, Anda menerima salah satu kesalahan berikut:
-
Header otorisasi tidak boleh kosong.
-
Header otorisasi memerlukan parameter 'Credential'.
-
Header otorisasi membutuhkan parameter 'Tanda tangan'.
-
Tanda tangan berisi pasangan key=value yang tidak valid (tanda sama hilang) di header Otorisasi.
Pastikan bahwa header otorisasi SIGv4 yang Anda tambahkan menyer Hitung tanda tangan takan kunci kredensia yang benar, dan juga menyertakan tanggal permintaan menggunakan Tanggal HTTP atau header. x-amz-date
Jika Anda menerima IncompleteSignatureException kesalahan dan konstruksi tanda tangan benar, Anda dapat memverifikasi bahwa header otorisasi tidak dimodifikasi saat transit ke Layanan AWS dengan menghitung SHA-256 hash dan pengkodean B64 dari header otorisasi dalam permintaan sisi klien Anda.
-
Dapatkan header otorisasi yang Anda kirim dalam permintaan. Header otorisasi Anda tampak mirip dengan contoh berikut:
Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, SignedHeaders=host;range;x-amz-date, Signature=example-generated-signature -
Hitung SHA-256 hash dari header otorisasi.
hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader -
Enkode header otorisasi hash ke format Base64.
base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader -
Bandingkan string hash dan dikodekan yang baru saja Anda hitung dengan string yang Anda terima dalam pesan kesalahan Anda. Pesan kesalahan Anda harus mirip dengan contoh berikut:
com.amazon.coral.service#IncompleteSignatureException: The signature contains an in-valid key=value pair (missing equal-sign) in Authorization header (hashed with SHA-256 and encoded with Base64): '9c574f83b4b950926da4a99c2b43418b3db8d97d571b5e18dd0e4f3c3ed1ed2c'.
-
Jika dua hash berbeda, maka beberapa bagian dari header otorisasi berubah saat transit. Perubahan ini bisa disebabkan oleh penangan jaringan atau klien Anda yang melampirkan header yang ditandatangani atau mengubah header otorisasi dengan cara tertentu.
-
Jika dua hash cocok, header otorisasi yang Anda kirim dalam permintaan cocok dengan apa yang AWS diterima. Tinjau pesan kesalahan yang Anda terima untuk menentukan apakah masalah tersebut disebabkan oleh kredentif atau tanda tangan yang salah. Kesalahan ini tercakup di bagian lain di halaman ini.
Kesalahan ruang lingkup kredensi
Cakupan kredensi yang Anda buat Buat string untuk ditandatangani membatasi tanda tangan ke tanggal, Wilayah, dan layanan tertentu. String ini memiliki format berikut:
YYYYMMDD/region/service/aws4_request
catatan
Jika Anda menggunakan Sigv4a, Wilayah tidak termasuk dalam cakupan kredensi.
Date
Jika cakupan kredensi tidak menentukan tanggal yang sama dengan x-amz-date header, langkah verifikasi tanda tangan gagal dengan pesan kesalahan berikut:
Date in Credential scope does not match YYYYMMDD from ISO-8601 version of date from HTTP
Jika permintaan menentukan waktu di masa mendatang, langkah verifikasi tanda tangan gagal dengan pesan kesalahan berikut:
Signature not yet current:dateis still later thandate
Jika permintaan telah kedaluwarsa, langkah verifikasi tanda tangan gagal dengan pesan kesalahan berikut:
Signature expired:dateis now earlier thandate
Region
Jika cakupan kredensi tidak menentukan Wilayah yang sama dengan permintaan, langkah verifikasi tanda tangan gagal dengan pesan kesalahan berikut:
Credential should be scoped to a valid Region, not region-code
Layanan
Jika cakupan kredensi tidak menentukan layanan yang sama dengan host header, langkah verifikasi tanda tangan gagal dengan pesan kesalahan berikut:
Credential should be scoped to correct service: 'service'
String penghentian
Jika cakupan kredensi tidak berakhir denganaws4_request, langkah verifikasi tanda tangan gagal dengan pesan kesalahan berikut:
Credential should be scoped with a valid terminator: 'aws4_request'
Kesalahan penandatanganan kunci
Kesalahan yang disebabkan oleh derivasi kunci penandatanganan yang salah atau penggunaan kriptografi yang tidak tepat lebih sulit untuk dipecahkan. Setelah memverifikasi bahwa string kanonik dan string yang akan ditandatangani sudah benar, Anda juga dapat memeriksa salah satu masalah berikut:
-
Kunci akses rahasia tidak cocok dengan ID kunci akses yang Anda tentukan.
-
Ada masalah dengan kode derivasi kunci Anda.
Untuk memverifikasi bahwa kunci rahasia cocok dengan ID kunci akses, Anda dapat mengujinya dengan implementasi kerja yang diketahui. Misalnya, gunakan AWS SDK atau AWS CLI untuk membuat permintaan ke AWS. Sebagai contoh, lihat Minta contoh tanda tangan