Memecahkan masalah Tanda Tangan Versi 4 penandatanganan untuk permintaan AWS API - AWS Identity and Access Management

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memecahkan masalah Tanda Tangan Versi 4 penandatanganan untuk permintaan AWS API

penting

Kecuali Anda menggunakan AWS SDKs atauCLI, Anda harus menulis kode untuk menghitung tanda tangan yang memberikan informasi otentikasi dalam permintaan Anda. Perhitungan tanda tangan SiGv4 dapat menjadi usaha yang rumit, dan kami menyarankan Anda menggunakan AWS SDKs 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 HTTP permintaan Anda AWS tidak cocok dengan tanda tangan yang Layanan AWS dihitung. HTTPUnauthorizedKesalahan 401 kembali ketika izin tidak mengizinkan pemanggil untuk membuat permintaan.

APIpermintaan mungkin mengembalikan kesalahan jika:

  • APIPermintaan tidak ditandatangani dan API permintaan menggunakan IAM otentikasi.

  • IAMKredensi yang digunakan untuk menandatangani permintaan tidak benar atau tidak memiliki izin untuk memanggil. API

  • Tanda tangan API permintaan yang ditandatangani tidak cocok dengan tanda tangan yang dihitung oleh AWS layanan.

  • Header API permintaan tidak benar.

catatan

Perbarui protokol penandatanganan Anda dari AWS Signature versi 2 (SigV2) ke AWS Signature versi 4 (SigV4) sebelum menjelajahi solusi kesalahan lainnya. Layanan, seperti Amazon S3, dan Wilayah tidak lagi mendukung penandatanganan SigV2.

Kesalahan kredensi

Pastikan bahwa API permintaan ditandatangani dengan SiGv4. Jika API permintaan tidak ditandatangani, maka Anda mungkin menerima kesalahan:Missing Authentication Token. Tambahkan tanda tangan yang hilang dan kirim ulang permintaan.

Verifikasi bahwa kredensi 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 berwenang untuk membuat permintaan. Untuk detailnya, lihat Memecahkan masalah akses ditolak pesan kesalahan.

Permintaan kanonik dan kesalahan string penandatanganan

Jika Anda salah menghitung permintaan kanonik di Buat hash dari 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, itu menghitung ulang tanda tangan. Jika ada perbedaan nilai, maka tanda tangan tidak cocok. Bandingkan permintaan dan string kanonik 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 AWS.

APIpermintaan header

Ketika header otorisasi kosong, kunci kredensi atau tanda tangan hilang atau salah, header tidak dimulai dengan nama algoritme, atau pasangan nilai kunci tidak menyertakan tanda sama dengan, Anda menerima salah satu kesalahan berikut:

  • Header otorisasi tidak boleh kosong.

  • Header otorisasi membutuhkan parameter 'Kredensial'.

  • Header otorisasi membutuhkan parameter 'Tanda tangan'.

  • Tanda tangan berisi pasangan key=value yang tidak valid (tidak ada tanda sama) di header Otorisasi.

Pastikan bahwa header otorisasi SigV4 yang Anda tambahkan Hitung tanda tangan menyertakan kunci kredensi yang benar, dan juga menyertakan tanggal permintaan menggunakan HTTP Tanggal atau header. x-amz-date

Jika Anda menerima IncompleteSignatureException kesalahan dan konstruksi tanda tangan sudah benar, Anda dapat memverifikasi bahwa header otorisasi tidak dimodifikasi dalam perjalanan ke Layanan AWS dengan menghitung SHA -256 hash dan pengkodean B64 dari header otorisasi dalam permintaan sisi klien Anda.

  1. 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
  2. Hitung hash SHA -256 dari header otorisasi.

    hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader
  3. Encode header otorisasi hash ke format Base64.

    base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader
  4. Bandingkan string yang di-hash dan dikodekan yang baru saja Anda hitung terhadap 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 kedua 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 kedua hash cocok, header otorisasi yang Anda kirim dalam permintaan cocok dengan apa yang AWS diterima. Tinjau pesan galat yang Anda terima untuk menentukan apakah masalahnya adalah hasil dari kredensi atau tanda tangan yang salah. Kesalahan ini tercakup di bagian lain di halaman ini.

Kesalahan cakupan 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.

Tanggal

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 galat berikut:

Signature not yet current: date is still later than date

Jika permintaan telah kedaluwarsa, langkah verifikasi tanda tangan gagal dengan pesan galat berikut:

Signature expired: date is now earlier than date
Wilayah

Jika cakupan kredensi tidak menentukan Wilayah yang sama dengan permintaan, langkah verifikasi tanda tangan gagal dengan pesan galat 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 dengan aws4_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 Anda 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 AWS. Sebagai contoh, lihat Minta contoh tanda tangan