

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

# Memecahkan masalah penandatanganan Signature Version 4 untuk permintaan API AWS
<a name="reference_sigv-troubleshooting"></a>

**penting**  
Kecuali Anda menggunakan AWS SDKs atau CLI, 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 atau AWS SDKs 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 Layanan AWS dihitung. `Unauthorized`Kesalahan 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 autentikasi IAM.
+ Kredensi IAM yang digunakan untuk menandatangani permintaan tidak benar atau tidak memiliki izin untuk memanggil API.
+ Tanda tangan permintaan API yang ditandatangani tidak cocok dengan tanda tangan yang dihitung oleh AWS layanan.
+ Header permintaan API 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.

**Topics**
+ [Kesalahan kredensi](#signature-v4-troubleshooting-credential)
+ [Permintaan kanonik dan kesalahan string penandatanganan](#signature-v4-troubleshooting-canonical-errors)
+ [Kesalahan ruang lingkup kredensi](#signature-v4-troubleshooting-credential-scope)
+ [Kesalahan penandatanganan kunci](#signature-v4-troubleshooting-key-signing)

## Kesalahan kredensi
<a name="signature-v4-troubleshooting-credential"></a>

Pastikan bahwa permintaan API ditandatangani dengan SiGv4. Jika permintaan API tidak ditandatangani, maka Anda mungkin menerima kesalahan:`Missing Authentication Token`. [Tambahkan tanda tangan yang hilang](https://docs.aws.amazon.com/IAM/latest/UserGuide/create-signed-request.html#add-signature-to-request) 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. Lihat perinciannya di [Memecahkan masalah akses ditolak pesan kesalahan](troubleshoot_access-denied.md). 

## Permintaan kanonik dan kesalahan string penandatanganan
<a name="signature-v4-troubleshooting-canonical-errors"></a>

Jika Anda salah menghitung permintaan kanonik di [Buat hash dari permintaan kanonik](reference_sigv-create-signed-request.md#create-canonical-request-hash) atau[Buat string untuk ditandatangani](reference_sigv-create-signed-request.md#create-string-to-sign), 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 Anda 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.

**Example 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

### Header permintaan API
<a name="signature-v4-troubleshooting-credential-header"></a>

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](reference_sigv-create-signed-request.md#calculate-signature) menyertakan kunci kredensi yang benar, dan juga menyertakan tanggal permintaan menggunakan Tanggal HTTP 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 hash SHA-256 dan pengkodean B64 dari header otorisasi dalam permintaan sisi klien Anda.

1. Dapatkan [header otorisasi](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv-authentication-methods.html) 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
   ```

1. Hitung hash SHA-256 dari header otorisasi.

   ```
   hashSHA256(rawAuthorizationHeader) = hashedAuthorizationHeader
   ```

1. Mengkodekan header otorisasi yang di-hash ke format Base64. 

   ```
   base64(hashedAuthorizationHeader) = encodedHashedAuthorizationHeader
   ```

1. 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 dua 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 ruang lingkup kredensi
<a name="signature-v4-troubleshooting-credential-scope"></a>

Cakupan kredensi yang Anda buat [Buat string untuk ditandatangani](reference_sigv-create-signed-request.md#create-string-to-sign) 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 galat 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
```

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

```
Credential should be scoped to correct service: 'service'
```

**String penghentian**  
Jika cakupan kredensi tidak berakhiraws4\$1request, langkah verifikasi tanda tangan gagal dengan pesan galat berikut:

```
Credential should be scoped with a valid terminator: 'aws4_request'
```

## Kesalahan penandatanganan kunci
<a name="signature-v4-troubleshooting-key-signing"></a>

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](reference_sigv-examples.md)