

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

# AWS Signature Versi 4 untuk permintaan API
<a name="reference_sigv"></a>

**penting**  
Jika Anda menggunakan alat AWS SDK (lihat [Contoh Kode dan Pustaka](https://aws.amazon.com/developer/)) atau AWS Command Line Interface (AWS CLI) untuk mengirim permintaan API AWS, Anda dapat melewati proses tanda tangan, karena klien SDK dan CLI mengautentikasi permintaan Anda dengan menggunakan kunci akses yang Anda berikan. Kecuali Anda memiliki alasan bagus untuk tidak melakukannya, kami sarankan Anda selalu menggunakan SDK atau CLI.  
Di Wilayah yang mendukung beberapa versi tanda tangan, menandatangani permintaan secara manual berarti Anda harus menentukan versi tanda tangan yang akan digunakan. Saat Anda menyediakan permintaan ke Titik Akses Multi-Wilayah, SDKs dan CLI secara otomatis beralih menggunakan Signature Version 4A tanpa konfigurasi tambahan.

Informasi otentikasi yang Anda kirim dalam permintaan harus menyertakan tanda tangan. AWS Sigv4 (SigV4) adalah protokol AWS penandatanganan untuk menambahkan informasi otentikasi ke AWS permintaan API.

Anda tidak menggunakan kunci akses rahasia untuk menandatangani permintaan API. Sebagai gantinya, Anda menggunakan proses penandatanganan SiGv4. Permintaan penandatanganan melibatkan:

1. Membuat permintaan kanonik berdasarkan detail permintaan.

1. Menghitung tanda tangan menggunakan AWS kredensi Anda.

1. Menambahkan tanda tangan ini ke permintaan sebagai header Otorisasi.

AWS kemudian mereplikasi proses ini dan memverifikasi tanda tangan, memberikan atau menolak akses yang sesuai.

SigV4 simetris mengharuskan Anda untuk mendapatkan kunci yang dicakup ke satu AWS layanan, di satu AWS wilayah, pada hari tertentu. Ini membuat kunci dan tanda tangan yang dihitung berbeda untuk setiap wilayah, artinya Anda harus mengetahui wilayah yang ditakdirkan untuk tanda tangan tersebut.

Asymmetric Signature Version 4 (Sigv4a) adalah ekstensi yang mendukung penandatanganan dengan algoritma baru, dan menghasilkan tanda tangan individual yang dapat diverifikasi di lebih dari satu wilayah. AWS Dengan Sigv4a, Anda dapat menandatangani permintaan untuk beberapa wilayah, dengan perutean dan failover yang mulus antar wilayah. Saat Anda menggunakan AWS SDK atau AWS CLI untuk memanggil fungsionalitas yang memerlukan penandatanganan multi-wilayah, jenis tanda tangan secara otomatis diubah untuk menggunakan Sigv4a. Lihat perinciannya di [Cara kerja AWS Sigv4a](#how-sigv4a-works).

## Bagaimana AWS SiGv4 bekerja
<a name="how-aws-signing-works"></a>

Langkah-langkah berikut menjelaskan proses umum komputasi tanda tangan dengan SiGv4:

1. **String yang akan ditandatangani** tergantung pada jenis permintaan. Misalnya, saat Anda menggunakan header Otorisasi HTTP atau parameter kueri untuk otentikasi, Anda menggunakan kombinasi elemen permintaan untuk membuat string yang akan ditandatangani. Untuk permintaan HTTP POST, `POST` kebijakan dalam permintaan adalah string yang Anda tandatangani.

1. **Kunci penandatanganan** adalah serangkaian perhitungan, dengan hasil dari setiap langkah dimasukkan ke langkah berikutnya. Langkah terakhir adalah kunci penandatanganan.

1. Ketika AWS layanan menerima permintaan yang diautentikasi, ia membuat ulang **tanda tangan** menggunakan informasi otentikasi yang terkandung dalam permintaan. Jika tanda tangan cocok, layanan memproses permintaan. Kalau tidak, itu menolak permintaan.

Untuk informasi selengkapnya, lihat [Elemen tanda tangan permintaan AWS API](reference_sigv-signing-elements.md).

## Cara kerja AWS Sigv4a
<a name="how-sigv4a-works"></a>

Sigv4a menggunakan tanda tangan asimetris berdasarkan kriptografi kunci publik-pribadi. Sigv4a melewati proses derivasi kredensial cakupan yang serupa dengan SigV4, kecuali Sigv4a menggunakan kunci yang sama untuk menandatangani semua permintaan tanpa perlu mendapatkan kunci penandatanganan yang berbeda berdasarkan tanggal, layanan, dan wilayah. Keypair [Elliptic Curve Digital Signature Algorithm](https://csrc.nist.gov/glossary/term/ecdsa) (ECDSA) dapat diturunkan dari kunci akses rahasia yang ada. AWS 

Sistem ini menggunakan kriptografi asimetris untuk memverifikasi tanda tangan multi-wilayah, sehingga AWS hanya perlu menyimpan kunci publik Anda. Kunci publik bukan rahasia dan tidak dapat digunakan untuk menandatangani permintaan. Tanda tangan asimetris diperlukan untuk permintaan API multi-wilayah, seperti dengan Titik Akses Multi-Wilayah Amazon S3.

Langkah-langkah berikut menjelaskan proses umum komputasi tanda tangan dengan Sigv4a:

1. **String yang akan ditandatangani** tergantung pada jenis permintaan. Misalnya, saat Anda menggunakan header Otorisasi HTTP atau parameter kueri untuk otentikasi, Anda menggunakan kombinasi elemen permintaan untuk membuat string yang akan ditandatangani. Untuk permintaan HTTP POST, `POST` kebijakan dalam permintaan adalah string yang Anda tandatangani.

1. **Kunci penandatanganan** berasal dari kunci akses AWS rahasia melalui serangkaian perhitungan, dengan hasil dari setiap langkah dimasukkan ke langkah berikutnya. Langkah terakhir menghasilkan keypair.

1. Ketika AWS layanan menerima permintaan yang ditandatangani dengan Sigv4a, AWS verifikasi tanda tangan hanya menggunakan separuh publik dari keypair. Jika tanda tangan valid, permintaan diautentikasi dan layanan memproses permintaan. Permintaan dengan tanda tangan yang tidak valid ditolak.

[Untuk informasi selengkapnya tentang Sigv4a untuk permintaan API Multi-wilayah, lihat proyek sigv4 di. a-signing-examples](https://github.com/aws-samples/sigv4a-signing-examples) GitHub

## Kapan menandatangani permintaan
<a name="when-do-you-need-to-sign"></a>

Saat Anda menulis kode kustom yang mengirimkan permintaan API AWS, Anda harus menyertakan kode yang menandatangani permintaan. Anda dapat menulis kode khusus karena:
+ Anda bekerja dengan bahasa pemrograman yang tidak ada SDK AWS .
+ Anda memerlukan kontrol penuh atas bagaimana permintaan dikirim AWS.

Sementara permintaan API mengautentikasi akses dengan AWS SigV4, AWS SDKs dan AWS CLI mengautentikasi permintaan Anda dengan menggunakan kunci akses yang Anda berikan. Untuk informasi selengkapnya tentang autentikasi dengan AWS SDKs dan AWS CLI, lihat[Sumber daya tambahan](#reference_aws-signing-resources).

## Mengapa permintaan ditandatangani
<a name="why-requests-are-signed"></a>

Proses penandatanganan membantu mengamankan permintaan dengan cara berikut:
+ **Verifikasi identitas pemohon**

  Permintaan yang diautentikasi memerlukan tanda tangan yang Anda buat dengan menggunakan kunci akses Anda (ID kunci akses, kunci akses rahasia). Jika Anda menggunakan kredenal keamanan sementara, perhitungan tanda tangan juga memerlukan token keamanan. Untuk informasi selengkapnya, lihat akses [terprogram kredensial AWS keamanan](security-creds-programmatic-access.md).
+ **Lindungi data dalam perjalanan**

  Untuk mencegah gangguan pada permintaan saat sedang transit, beberapa elemen permintaan digunakan untuk menghitung hash (intisari) permintaan, dan nilai hash yang dihasilkan disertakan sebagai bagian dari permintaan. Ketika Layanan AWS menerima permintaan, ia menggunakan informasi yang sama untuk menghitung hash dan mencocokkannya dengan nilai hash dalam permintaan Anda. Jika nilainya tidak cocok, AWS tolak permintaan tersebut.
+ **Lindungi dari potensi serangan replay**

  Dalam kebanyakan kasus, permintaan harus mencapai AWS dalam waktu lima menit dari cap waktu dalam permintaan. Kalau tidak, AWS menolak permintaan itu.

AWS SiGv4 dapat diekspresikan dalam header Otorisasi HTTP atau sebagai string kueri di URL. Untuk informasi selengkapnya, lihat [Metode otentikasi](reference_sigv-authentication-methods.md).

## Sumber daya tambahan
<a name="reference_aws-signing-resources"></a>
+ Untuk informasi selengkapnya tentang proses penandatanganan SiGv4 untuk berbagai layanan, lihat. [Minta contoh tanda tangan](reference_sigv-examples.md)
+ *Untuk mengonfigurasi kredensional untuk akses terprogram untuk AWS CLI, lihat [Otentikasi dan akses kredenal](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-authentication.html) di Panduan Pengguna Antarmuka Baris Perintah.AWS *
+  AWS SDKs Termasuk kode sumber GitHub untuk menandatangani permintaan AWS API. Untuk contoh kode, lihat[Contoh proyek dalam AWS repositori sampel](reference_sigv-examples.md#signature-v4-examples-sdk).
  + AWS SDK untuk .NET — [AWS4Signer.cs](https://github.com/aws/aws-sdk-net/blob/master/sdk/src/Core/Amazon.Runtime/Internal/Auth/AWS4Signer.cs)
  + AWS SDK untuk C\$1\$1 — [AWSAuthV4Signer.cpp](https://github.com/aws/aws-sdk-cpp/blob/main/src/aws-cpp-sdk-core/source/auth/signer/AWSAuthV4Signer.cpp)
  + AWS SDK untuk Go — [sigv4.go](https://github.com/aws/smithy-go/blob/a4c9efcda6aa54c75d1a130d1320a2709eebf51d/aws-http-auth/sigv4/sigv4.go)
  + AWS SDK untuk Java — [BaseAws4Signer.java](https://github.com/aws/aws-sdk-java-v2/blob/master/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/BaseAws4Signer.java)
  + AWS SDK untuk JavaScript — [tanda tangan-v4](https://github.com/smithy-lang/smithy-typescript/tree/main/packages/signature-v4)
  + AWS SDK untuk PHP — [SignatureV4.php](https://github.com/aws/aws-sdk-php/blob/master/src/Signature/SignatureV4.php)
  + AWS SDK for Python (Boto) - [signers.py](https://github.com/boto/botocore/blob/develop/botocore/signers.py)
  + AWS SDK untuk Ruby — [penandatangan.rb](https://github.com/aws/aws-sdk-ruby/blob/version-3/gems/aws-sigv4/lib/aws-sigv4/signer.rb)

# Elemen tanda tangan permintaan AWS API
<a name="reference_sigv-signing-elements"></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 AWS tanda tangan di Signature Version 4 dapat menjadi usaha yang rumit, dan kami menyarankan Anda menggunakan AWS SDKs atau CLI bila memungkinkan.

Setiap HTTP/HTTPS permintaan yang menggunakan penandatanganan Signature Version 4 harus berisi elemen-elemen ini.

**Topics**
+ [

## Spesifikasi titik akhir
](#endpoint-specification)
+ [

## Tindakan
](#action)
+ [

## Parameter tindakan
](#parameters)
+ [

## Date
](#date)
+ [

## Informasi otentikasi
](#authentication)

## Spesifikasi titik akhir
<a name="endpoint-specification"></a>

Menentukan nama DNS dari titik akhir yang Anda kirim permintaan. Nama ini biasanya berisi kode layanan dan Wilayah. Misalnya, titik akhir untuk Amazon DynamoDB di Wilayah `us-east-1` adalah. `dynamodb.us-east-1.amazonaws.com`

Untuk permintaan HTTP/1.1, Anda harus menyertakan header. `Host` Untuk permintaan HTTP/2, Anda dapat menyertakan `:authority` header atau header. `Host` Hanya gunakan header `:authority` untuk kepatuhan dengan spesifikasi HTTP/2. Tidak semua layanan mendukung permintaan HTTP/2.

Untuk titik akhir yang didukung oleh setiap layanan, lihat [Titik akhir layanan dan kuota](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html) di. *Referensi Umum AWS*

## Tindakan
<a name="action"></a>

Menentukan tindakan API untuk layanan. Misalnya, tindakan DynamoDB `CreateTable` atau tindakan Amazon EC2. `DescribeInstances`

Untuk tindakan yang didukung oleh setiap layanan, lihat [Referensi Otorisasi Layanan](https://docs.aws.amazon.com//service-authorization/latest/reference/reference.html).

## Parameter tindakan
<a name="parameters"></a>

Menentukan parameter untuk tindakan yang ditentukan dalam permintaan. Setiap tindakan AWS API memiliki serangkaian parameter wajib dan opsional. Versi API biasanya merupakan parameter yang diperlukan.

Untuk parameter yang didukung oleh tindakan API, lihat Referensi API untuk layanan.

## Date
<a name="date"></a>

Menentukan tanggal dan waktu permintaan. Menyertakan tanggal dan waktu dalam permintaan membantu mencegah pihak ketiga mencegat permintaan Anda dan mengirimkannya kembali nanti. Tanggal yang Anda tentukan dalam lingkup kredensi harus sesuai dengan tanggal permintaan Anda.

**Cap waktu harus dalam UTC dan menggunakan format ISO 8601 berikut: YYYYMMDD T HHMMSS Z.** Misalnya, `20220830T123600Z`. Jangan sertakan milidetik dalam stempel waktu.

Anda dapat menggunakan `date` atau `x-amz-date` header, atau menyertakan `x-amz-date` sebagai parameter kueri. Jika kita tidak dapat menemukan `x-amz-date` header, maka kita mencari `date` header.

## Informasi otentikasi
<a name="authentication"></a>

Setiap permintaan yang Anda kirim harus menyertakan informasi berikut. AWS menggunakan informasi ini untuk memastikan validitas dan keaslian permintaan.
+ Algoritma — Algoritma yang Anda gunakan sebagai bagian dari proses penandatanganan. 
  + SiGv4 — Gunakan `AWS4-HMAC-SHA256` untuk menentukan Signature Version 4 dengan algoritma `HMAC-SHA256` hash. 
  + Sigv4a — Gunakan `AWS4-ECDSA-P256-SHA256` untuk menentukan algoritma hash. `ECDSA-P256-SHA-256`
+ Credential — String yang dibentuk dengan menggabungkan ID kunci akses dan komponen cakupan kredensialmu.
  + SigV4 - Cakupan kredenal mencakup ID kunci akses Anda, tanggal dalam format *YYYYMMDD*, kode Wilayah, kode layanan, dan string `aws4_request` penghentian, dipisahkan oleh garis miring (/). Kode Region, kode layanan, dan string terminasi harus menggunakan karakter huruf kecil.

    ```
    AKIAIOSFODNN7EXAMPLE/YYYYMMDD/region/service/aws4_request
    ```
  + Sigv4a — Cakupan kredenal mencakup tanggal dalam format YYYYMMDD, nama layanan, dan string `aws4_request` terminasi, dipisahkan oleh garis miring (/). Perhatikan bahwa cakupan kredensi tidak menyertakan wilayah karena wilayah tersebut tercakup dalam header `X-Amz-Region-Set` terpisah.

    ```
    AKIAIOSFODNN7EXAMPLE/YYYYMMDD/service/aws4_request
    ```
+ Header yang ditandatangani - Header HTTP untuk disertakan dalam tanda tangan, dipisahkan oleh titik koma (;). Misalnya, `host;x-amz-date`.

  Untuk Sigv4a, Anda harus menyertakan header kumpulan wilayah yang menentukan kumpulan wilayah tempat permintaan akan valid. Header `X-Amz-Region-Set` ditentukan sebagai daftar nilai yang dipisahkan koma. Contoh berikut menunjukkan header wilayah yang memungkinkan permintaan dibuat di wilayah us-east-1 dan us-west-1.

  ```
  X-Amz-Region-Set=us-east-1,us-west-1
  ```

  Anda dapat menggunakan wildcard (\$1) di wilayah untuk menentukan beberapa wilayah. Dalam contoh berikut, header memungkinkan permintaan dibuat di us-west-1 dan us-west-2.

  ```
  X-Amz-Region-Set=us-west-*
  ```
+ Signature — String yang dikodekan heksadesimal yang mewakili tanda tangan yang dihitung. Anda harus menghitung tanda tangan menggunakan algoritme yang Anda tentukan di parameter `Algorithm`. 

Untuk informasi selengkapnya, lihat [Metode otentikasi](reference_sigv-authentication-methods.md)

# Metode otentikasi
<a name="reference_sigv-authentication-methods"></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 AWS tanda tangan di Signature Version 4 dapat menjadi usaha yang rumit, dan kami menyarankan Anda menggunakan AWS SDKs atau CLI bila memungkinkan.

Anda dapat mengekspresikan informasi otentikasi dengan menggunakan salah satu metode berikut.

## Header otorisasi HTTP
<a name="aws-signing-authentication-methods-http"></a>

`Authorization`Header HTTP adalah metode yang paling umum untuk mengautentikasi permintaan. Semua operasi REST API (kecuali untuk unggahan berbasis browser menggunakan `POST` permintaan) memerlukan header ini.

Contoh berikut menunjukkan nilai `Authorization` header untuk SigV4 dan Sigv4a. Jeda baris ditambahkan ke contoh ini untuk keterbacaan. Dalam kode Anda, header harus berupa string kontinu. Tidak ada koma antara algoritma dan Credential, tetapi elemen lainnya harus dipisahkan dengan koma.

**Example SiGv4**  

```
Authorization: AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20130524/us-east-1/s3/aws4_request, 
SignedHeaders=host;range;x-amz-date, 
Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024
```

**Example Sigv4a**  

```
Authorization: AWS4-ECDSA-P256-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20130524/s3/aws4_request, 
SignedHeaders=host;range;x-amz-date;x-amz-region-set,
Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024
```

Tabel berikut menjelaskan berbagai komponen nilai header Otorisasi pada contoh sebelumnya:


| Komponen | Deskripsi | 
| --- | --- | 
|  Otorisasi  | Algoritma yang digunakan untuk menghitung tanda tangan. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/reference_sigv-authentication-methods.html)  | 
|  Kredensi  |  ID kunci akses Anda dan informasi ruang lingkup. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/reference_sigv-authentication-methods.html) <date>Nilai ditentukan menggunakan format YYYYMMDD. <aws-service>nilainya adalah S3 saat mengirim permintaan ke Amazon S3.  | 
|  SignedHeaders  |   Daftar header permintaan yang dipisahkan titik koma yang Anda gunakan untuk menghitung Tanda Tangan. Daftar ini hanya mencakup nama header, dan nama header harus dalam huruf kecil. Misalnya: `host;range;x-amz-date` Untuk Sigv4a, Anda harus menyertakan header kumpulan wilayah yang menentukan kumpulan wilayah tempat permintaan akan valid. Header X-Amz-Region-Set ditentukan sebagai daftar nilai yang dipisahkan koma.  | 
|  Tanda tangan  |  Tanda tangan 256-bit dinyatakan sebagai 64 karakter heksadesimal huruf kecil. Sebagai contoh: `fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024` Perhatikan bahwa perhitungan tanda tangan bervariasi tergantung pada opsi yang Anda pilih untuk mentransfer muatan.  | 

## Parameter string kueri
<a name="aws-signing-authentication-methods-query"></a>

Anda dapat menggunakan string kueri untuk mengekspresikan permintaan sepenuhnya dalam URL. Dalam hal ini, Anda menggunakan parameter kueri untuk memberikan informasi permintaan, termasuk informasi otentikasi. Karena tanda tangan permintaan adalah bagian dari URL, jenis URL ini sering disebut sebagai URL presigned. Anda dapat menggunakan prasesigned URLs to embed link yang dapat diklik dalam HTML, yang dapat berlaku hingga tujuh hari. Untuk informasi selengkapnya, lihat [Mengautentikasi Permintaan: Menggunakan Parameter Kueri (Versi AWS Tanda Tangan 4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html) di *Referensi API Amazon S3*.

Contoh berikut menunjukkan presigned URLs untuk SigV4 dan Sigv4a. Jeda baris ditambahkan ke contoh ini untuk keterbacaan:

**Example SiGv4**  

```
https://s3.amazonaws.com/amzn-s3-demo-bucket/test.txt ?
X-Amz-Algorithm=AWS4-HMAC-SHA256 &
X-Amz-Credential=<your-access-key-id>/20130721/<region>/s3/aws4_request &
X-Amz-Date=20130721T201207Z &
X-Amz-Expires=86400 &
X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>
```

**Example Sigv4a**  

```
http://s3.amazonaws.com/amzn-s3-demo-bucket/test.txt ?
X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256 &
X-Amz-Credential=<your-access-key-id>/20240721/s3/aws4_request &
X-amz-Region-Set=<regionset> &
X-Amz-Date=20240721T201207Z &
X-Amz-Expires=86400 &
X-Amz-SignedHeaders=host;x-amz-region-set &
X-Amz-Signature=<signature-value>
```

**catatan**  
`X-Amz-Credential`Nilai dalam URL menunjukkan karakter “/” hanya untuk keterbacaan. Dalam prakteknya, itu harus dikodekan sebagai% 2F. Contoh:  
`&X-Amz-Credential=<your-access-key-id>%2F20130721%2Fus-east-1%2Fs3%2Faws4_request`

Tabel berikut menjelaskan parameter kueri dalam URL yang menyediakan informasi otentikasi.


| Nama parameter string kueri | Deskripsi | 
| --- | --- | 
|  X-Amz-Algorithm  |  Versi AWS tanda tangan dan algoritma yang Anda gunakan untuk menghitung tanda tangan. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/reference_sigv-authentication-methods.html)  | 
|  X-Amz-Credential  |  Selain ID kunci akses Anda, parameter ini juga menyediakan ruang lingkup yang tanda tangannya valid. Nilai ini harus sesuai dengan cakupan yang Anda gunakan dalam perhitungan tanda tangan, yang dibahas di bagian berikut. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/reference_sigv-authentication-methods.html) Untuk daftar string AWS regional, lihat [Titik Akhir Regional](https://docs.aws.amazon.com//general/latest/gr/rande.html#regional-endpoints) di Referensi *AWS Umum*.  | 
|  Set Wilayah X-Amz  |  Kumpulan wilayah tempat permintaan akan valid. Header x-amz-region-set ditentukan sebagai daftar nilai yang dipisahkan koma.  | 
|  X-Amz-Date  |  Format tanggal dan waktu harus mengikuti standar ISO 8601, dan harus diformat dengan format. `yyyyMMddTHHmmssZ` Misalnya jika tanggal dan waktu adalah “08/01/2016 15:32:41.982-700" maka pertama-tama harus dikonversi ke UTC (Coordinated Universal Time) dan kemudian diserahkan sebagai “20160801T223241Z”.  | 
|  X-Amz-Kedaluwarsa  |  Menyediakan periode waktu, dalam hitungan detik, di mana URL presigned yang dihasilkan valid. Misalnya, 86400 (24 jam). Nilai ini adalah bilangan bulat. Nilai minimum yang dapat Anda tetapkan adalah 1, dan maksimum adalah 604800 (tujuh hari) .URL yang telah ditentukan sebelumnya dapat berlaku selama maksimal tujuh hari karena kunci penandatanganan yang Anda gunakan dalam perhitungan tanda tangan berlaku hingga tujuh hari.  | 
|  X-Amz- SignedHeaders  |  Daftar header yang Anda gunakan untuk menghitung tanda tangan. Header berikut diperlukan dalam perhitungan tanda tangan: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/reference_sigv-authentication-methods.html) Untuk keamanan tambahan, Anda harus menandatangani semua header permintaan yang Anda rencanakan untuk disertakan dalam permintaan Anda.  | 
|  X-Amz-Signature  |  Memberikan tanda tangan untuk mengautentikasi permintaan Anda. Tanda tangan ini harus sesuai dengan tanda tangan yang dihitung oleh layanan; jika tidak, layanan menolak permintaan tersebut. Sebagai contoh, `733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7`. Perhitungan tanda tangan dijelaskan di bagian berikut.  | 
|  X-Amz-Security-Token  |  Parameter kredensi opsional jika menggunakan kredensional yang bersumber dari layanan STS.  | 

# Membuat permintaan AWS API yang ditandatangani
<a name="reference_sigv-create-signed-request"></a>

**penting**  
Jika Anda menggunakan alat AWS SDK (lihat [Contoh Kode dan Pustaka](https://aws.amazon.com/developer/)) atau AWS Command Line Interface (AWS CLI) untuk mengirim permintaan API AWS, Anda dapat melewati bagian ini karena klien SDK dan CLI mengautentikasi permintaan Anda dengan menggunakan kunci akses yang Anda berikan. Kecuali Anda memiliki alasan bagus untuk tidak melakukannya, kami sarankan Anda selalu menggunakan SDK atau CLI.  
Di Wilayah yang mendukung beberapa versi tanda tangan, menandatangani permintaan secara manual berarti Anda harus menentukan versi tanda tangan mana yang digunakan. Saat Anda menyediakan permintaan ke Titik Akses Multi-Wilayah, SDKs dan CLI secara otomatis beralih menggunakan Signature Version 4A tanpa konfigurasi tambahan.

Anda dapat menggunakan protokol penandatanganan AWS SigV4 untuk membuat permintaan yang ditandatangani untuk permintaan AWS API.

1. Membuat permintaan kanonik berdasarkan detail permintaan.

1. Menghitung tanda tangan menggunakan AWS kredensional Anda.

1. Menambahkan tanda tangan ini ke permintaan sebagai header Otorisasi.

AWS kemudian mereplikasi proses ini dan memverifikasi tanda tangan, memberikan atau menolak akses yang sesuai.

Untuk melihat bagaimana Anda dapat menggunakan AWS SigV4 untuk menandatangani permintaan API, lihat. [Minta contoh tanda tangan](reference_sigv-examples.md)

Tabel berikut menjelaskan fungsi yang digunakan dalam proses pembuatan permintaan yang ditandatangani. Anda perlu menerapkan kode untuk fungsi-fungsi ini. Untuk informasi selengkapnya, lihat [contoh kode di AWS SDKs](reference_sigv.md#reference_aws-signing-resources).


| Fungsi | Deskripsi | 
| --- | --- | 
|  `Lowercase()`  |  Ubah string menjadi huruf kecil.  | 
|  `Hex()`  |  Pengkodean basis 16 huruf kecil.  | 
|  `SHA256Hash()`  |  Fungsi hash kriptografi Secure Hash Algorithm (SHA).  | 
|  `HMAC-SHA256()`  |  Menghitung HMAC dengan menggunakan SHA256 algoritma dengan kunci penandatanganan yang disediakan. Ini adalah tanda tangan terakhir saat Anda menandatangani dengan SiGv4.  | 
|  `ECDSA-Sign`  |  Tanda tangan Elliptic Curve Digital Signature Algorithm (ECDSA) dihitung dengan menggunakan tanda tangan asimetris berdasarkan kriptografi kunci publik-pribadi.   | 
|  `KDF(K, Label, Context, L)`  |  [Sebuah NIST SP800 -108 KDF dalam Mode Counter menggunakan fungsi PRF HMAC- SHA256 seperti yang didefinisikan dalam NIST SP 800-108r1.](https://doi.org/10.6028/NIST.SP.800-108r1-upd1)  | 
|  `Oct2Int(byte[ ])`  |  Fungsi oktet ke bilangan bulat seperti yang dijelaskan dalam ANSI X9.62.  | 
|  `Trim()`  |  Hapus spasi putih di depan atau belakang.  | 
|  `UriEncode()`  |  URI menyandikan setiap byte. UriEncode() harus menegakkan aturan berikut: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/IAM/latest/UserGuide/reference_sigv-create-signed-request.html)   UriEncode Fungsi standar yang disediakan oleh platform pengembangan Anda mungkin tidak berfungsi karena perbedaan dalam implementasi dan ambiguitas terkait yang mendasarinya RFCs. Kami menyarankan Anda menulis UriEncode fungsi kustom Anda sendiri untuk memastikan bahwa pengkodean Anda akan berfungsi.  Untuk melihat contoh UriEncode fungsi di Java, lihat [Java Utilities](https://github.com/aws/aws-sdk-java/blob/master/aws-java-sdk-core/src/main/java/com/amazonaws/util/SdkHttpUtils.java#L66) di GitHub situs web.  | 

**catatan**  
Saat menandatangani permintaan, Anda dapat menggunakan AWS SigV4 atau AWS Sigv4a. Perbedaan utama antara keduanya ditentukan oleh bagaimana tanda tangan dihitung. Dengan Sigv4a, kumpulan wilayah disertakan dalam string yang akan ditandatangani, tetapi bukan bagian dari langkah derivasi kredensyal.

## Menandatangani permintaan dengan kredensi keamanan sementara
<a name="temporary-security-credentials"></a>

Alih-alih menggunakan kredensyal jangka panjang untuk menandatangani permintaan, Anda dapat menggunakan kredensyal keamanan sementara yang disediakan oleh (). AWS Security Token Service AWS STS

Saat Anda menggunakan kredensyal keamanan sementara, Anda harus menambahkan `X-Amz-Security-Token` ke header Otorisasi atau memasukkannya ke dalam string kueri untuk menahan token sesi. Beberapa layanan mengharuskan Anda `X-Amz-Security-Token` menambahkan permintaan kanonik. Layanan lain hanya mengharuskan Anda menambahkan `X-Amz-Security-Token` di akhir, setelah Anda menghitung tanda tangan. Periksa dokumentasi Layanan AWS untuk masing-masing persyaratan tertentu.

## Ringkasan langkah-langkah penandatanganan
<a name="create-signed-request-steps"></a>

**Buat permintaan kanonik**  
Atur konten permintaan Anda (host, action, header, dll.) Ke dalam format kanonik standar. Permintaan kanonik adalah salah satu input yang digunakan untuk membuat string untuk ditandatangani. Untuk detail tentang membuat permintaan kanonik, lihat. [Elemen tanda tangan permintaan AWS API](reference_sigv-signing-elements.md)

**Buat hash dari permintaan kanonik**  
Hash permintaan kanonik menggunakan algoritma yang sama yang Anda gunakan untuk membuat hash dari payload. Hash dari permintaan kanonik adalah string karakter heksadesimal huruf kecil.

**Buat string untuk ditandatangani**  
Buat string untuk ditandatangani dengan permintaan kanonik dan informasi tambahan seperti algoritma, tanggal permintaan, cakupan kredensi, dan hash dari permintaan kanonik.

**Dapatkan kunci penandatanganan**  
Gunakan kunci akses rahasia untuk mendapatkan kunci yang digunakan untuk menandatangani permintaan.

**Hitung tanda tangan**  
Lakukan operasi hash kunci pada string untuk menandatangani menggunakan kunci penandatanganan turunan sebagai kunci hash.

**Tambahkan tanda tangan ke permintaan**  
Tambahkan tanda tangan yang dihitung ke header HTTP atau ke string kueri permintaan.

## Buat permintaan kanonik
<a name="create-canonical-request"></a>

Untuk membuat permintaan kanonik, gabungkan string berikut, dipisahkan oleh karakter baris baru. Ini membantu memastikan bahwa tanda tangan yang Anda hitung dapat cocok dengan tanda tangan yang AWS menghitung.

```
<HTTPMethod>\n
<CanonicalURI>\n
<CanonicalQueryString>\n
<CanonicalHeaders>\n
<SignedHeaders>\n
<HashedPayload>
```
+ *HTTPMethod*— Metode HTTP, seperti`GET`,`PUT`,`HEAD`, dan`DELETE`.
+ *CanonicalUri*— Versi URI yang dikodekan URI dari URI komponen jalur absolut, dimulai dengan `/` yang mengikuti nama domain dan hingga akhir string atau ke karakter tanda tanya (`?`) jika Anda memiliki parameter string kueri. Jika jalur absolut kosong, gunakan karakter garis miring maju (`/`). URI dalam contoh berikut,`/amzn-s3-demo-bucket/myphoto.jpg`, adalah jalur absolut dan Anda tidak menyandikan jalur absolut: `/`

  ```
  http://s3.amazonaws.com/amzn-s3-demo-bucket/myphoto.jpg
  ```
+ *CanonicalQueryString*— Parameter string kueri yang dikodekan URI. Anda uri-encode setiap nama dan nilai satu per satu. Anda juga harus mengurutkan parameter dalam string kueri kanonik menurut abjad dengan nama kunci. Penyortiran terjadi setelah pengkodean. String query dalam contoh URI berikut adalah:

  ```
  http://s3.amazonaws.com/amzn-s3-demo-bucket?prefix=somePrefix&marker=someMarker&max-keys=2
  ```

  String kueri kanonik adalah sebagai berikut (jeda baris ditambahkan ke contoh ini untuk keterbacaan):

  ```
  UriEncode("marker")+"="+UriEncode("someMarker")+"&"+
  UriEncode("max-keys")+"="+UriEncode("20") + "&" +
  UriEncode("prefix")+"="+UriEncode("somePrefix")
  ```

  Ketika permintaan menargetkan subresource, nilai parameter query yang sesuai akan menjadi string kosong (`""`). Misalnya, URI berikut mengidentifikasi `ACL` subresource pada bucket: `amzn-s3-demo-bucket`

   

  ```
  http://s3.amazonaws.com/amzn-s3-demo-bucket?acl
  ```

  Dalam hal ini, CanonicalQueryString akan menjadi:

   

  ```
  UriEncode("acl") + "=" + ""
  ```

  Jika URI tidak menyertakan a`?`, tidak ada string kueri dalam permintaan, dan Anda mengatur string kueri kanonik ke string kosong ()`""`. Anda masih perlu menyertakan karakter baris baru (`"\n"`).
+ *CanonicalHeaders*— Daftar header permintaan dengan nilainya. Nama header individu dan pasangan nilai dipisahkan oleh karakter baris baru (`"\n"`). Berikut ini adalah contoh dari CanonicalHeader:

  ```
  Lowercase(<HeaderName1>)+":"+Trim(<value>)+"\n"
  Lowercase(<HeaderName2>)+":"+Trim(<value>)+"\n"
  ...
  Lowercase(<HeaderNameN>)+":"+Trim(<value>)+"\n"
  ```

  CanonicalHeaders daftar harus mencakup yang berikut:
  + `host`Header HTTP.
  + Jika `Content-Type` header ada dalam permintaan, Anda harus menambahkannya ke *CanonicalHeaders* daftar. 
  + Setiap `x-amz-*` header yang Anda rencanakan untuk disertakan dalam permintaan Anda juga harus ditambahkan. Misalnya, jika Anda menggunakan kredensyal keamanan sementara, Anda harus memasukkan `x-amz-security-token` dalam permintaan Anda. Anda harus menambahkan header ini dalam daftar*CanonicalHeaders*.
  + Untuk Sigv4a, Anda harus menyertakan header kumpulan wilayah yang menentukan kumpulan wilayah tempat permintaan akan valid. Header `X-Amz-Region-Set` ditentukan sebagai daftar nilai yang dipisahkan koma. Contoh berikut menunjukkan header wilayah yang memungkinkan permintaan dibuat di wilayah us-east-1 dan us-west-1.

    `X-Amz-Region-Set=us-east-1,us-west-1 `

    Anda dapat menggunakan wildcard (\$1) di wilayah untuk menentukan beberapa wilayah. Dalam contoh berikut, header memungkinkan permintaan dibuat di us-west-1 dan us-west-2.

    `X-Amz-Region-Set=us-west-*`
**catatan**  
`x-amz-content-sha256`Header diperlukan untuk permintaan Amazon S3 AWS . Ini menyediakan hash dari payload permintaan. Jika tidak ada payload, Anda harus memberikan hash dari string kosong.

  Setiap nama header harus:
  + gunakan karakter huruf kecil.
  + muncul dalam urutan abjad.
  + diikuti oleh titik dua (`:`).

  Untuk nilai, Anda harus:
  + potong ruang depan atau belakang.
  + mengubah ruang berurutan menjadi satu ruang.
  + pisahkan nilai untuk header multi-nilai menggunakan koma.
  + Anda harus menyertakan header host (HTTP/1.1) atau:authority header (HTTP/2), dan header apa pun dalam tanda tangan. `x-amz-*` Anda dapat secara opsional menyertakan header standar lainnya dalam tanda tangan, seperti tipe konten.

  `Trim()`Fungsi `Lowercase()` dan yang digunakan dalam contoh ini dijelaskan di bagian sebelumnya.

  Berikut ini adalah contoh `CanonicalHeaders` string. Nama header dalam huruf kecil dan diurutkan.

   

  ```
  host:s3.amazonaws.com
  x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
  x-amz-date:20130708T220855Z
  ```

   
**catatan**  
Untuk tujuan menghitung tanda tangan otorisasi, hanya host dan `x-amz-*` header apa pun yang diperlukan; namun, untuk mencegah gangguan data, Anda harus mempertimbangkan untuk memasukkan header tambahan dalam perhitungan tanda tangan.  
Jangan sertakan hop-by-hop header yang sering diubah selama transit melintasi sistem yang kompleks. Ini mencakup semua header transpor volatil yang dimutasi oleh proxy, load balancer, dan node dalam sistem terdistribusi, termasuk,,,,,,,`connection`,, `x-amzn-trace-id` `user-agent``keep-alive`, `transfer-encoding` dan. `TE` `trailer` `upgrade` `proxy-authorization` `proxy-authenticate`
+ *SignedHeaders*— Daftar nama header permintaan huruf kecil yang diurutkan berdasarkan abjad dan dipisahkan titik koma. Header permintaan dalam daftar adalah header yang sama yang Anda sertakan dalam string. `CanonicalHeaders` Untuk contoh sebelumnya, nilai *SignedHeaders* akan menjadi sebagai berikut:

  ```
  host;x-amz-content-sha256;x-amz-date
  ```
+ *HashedPayload*— String yang dibuat menggunakan payload di badan permintaan HTTP sebagai masukan ke fungsi hash. String ini menggunakan karakter heksadesimal huruf kecil.

  ```
  Hex(SHA256Hash(<payload>>))
  ```

  Jika tidak ada payload dalam permintaan, Anda menghitung hash dari string kosong, seperti ketika Anda mengambil objek dengan menggunakan `GET` permintaan, tidak ada apa-apa dalam payload.

  ```
  Hex(SHA256Hash(""))
  ```
**catatan**  
Untuk Amazon S3, sertakan string literal `UNSIGNED-PAYLOAD` saat membuat permintaan kanonik, dan tetapkan nilai yang sama dengan nilai `x-amz-content-sha256` header saat mengirim permintaan.  
`Hex(SHA256Hash("UNSIGNED-PAYLOAD"))`

## Buat hash dari permintaan kanonik
<a name="create-canonical-request-hash"></a>

Buat hash (digest) dari permintaan kanonik menggunakan algoritma yang sama yang Anda gunakan untuk membuat hash dari payload. Hash dari permintaan kanonik adalah string karakter heksadesimal huruf kecil.

## Buat string untuk ditandatangani
<a name="create-string-to-sign"></a>

Untuk membuat string untuk ditandatangani, gabungkan string berikut, dipisahkan oleh karakter baris baru. Jangan akhiri string ini dengan karakter baris baru.

```
Algorithm \n
RequestDateTime \n
CredentialScope  \n
HashedCanonicalRequest
```
+ *Algorithm*— Algoritma yang digunakan untuk membuat hash dari permintaan kanonik.
  + SiGv4 — Gunakan `AWS4-HMAC-SHA256` untuk menentukan algoritma `HMAC-SHA256` hash. 
  + Sigv4a — Gunakan `AWS4-ECDSA-P256-SHA256` untuk menentukan algoritma hash. `ECDSA-P256-SHA-256` 
+ *RequestDateTime*— Tanggal dan waktu yang digunakan dalam lingkup kredensi. Nilai ini adalah waktu UTC saat ini dalam format ISO 8601 (misalnya,). `20130524T000000Z`
+ *CredentialScope*— Cakupan kredensi, yang membatasi tanda tangan yang dihasilkan ke Wilayah dan layanan yang ditentukan.
  + SigV4 — Kredensial mencakup ID kunci akses Anda, tanggal dalam `YYYYMMDD` format, kode Region, kode layanan, dan string `aws4_request` terminasi, dipisahkan oleh garis miring (/). Kode Region, kode layanan, dan string terminasi harus menggunakan karakter huruf kecil. String memiliki format berikut:`YYYYMMDD/region/service/aws4_request`.
  + Sigv4a - Kredensyal mencakup tanggal dalam `YYYYMMDD` format, nama layanan, dan string `aws4_request` terminasi, dipisahkan oleh garis miring (/). Perhatikan bahwa cakupan kredensi tidak menyertakan wilayah karena wilayah tersebut tercakup dalam header `X-Amz-Region-Set` terpisah. String memiliki format berikut:`YYYYMMDD/service/aws4_request`.
+ *HashedCanonicalRequest*— Hash dari permintaan kanonik, dihitung pada langkah sebelumnya.

Berikut ini adalah contoh string untuk menandatangani.

```
"<Algorithm>" + "\n" +
timeStampISO8601Format + "\n" +
<Scope> + "\n" +
Hex(<Algorithm>(<CanonicalRequest>))
```

## Dapatkan kunci penandatanganan
<a name="derive-signing-key"></a>

Untuk mendapatkan kunci penandatanganan, pilih salah satu proses berikut untuk menghitung kunci penandatanganan untuk SigV4 atau Sigv4a.

### Mendapatkan kunci penandatanganan untuk SiGv4
<a name="derive-signing-key-sigv4"></a>

Untuk mendapatkan kunci penandatanganan SigV4, lakukan suksesi operasi hash berkunci (HMAC) pada tanggal permintaan, Wilayah, dan layanan, dengan kunci akses AWS rahasia Anda sebagai kunci untuk operasi hashing awal.

Untuk setiap langkah, panggil fungsi hash dengan kunci dan data yang diperlukan. Hasil dari setiap panggilan ke fungsi hash menjadi input untuk panggilan berikutnya ke fungsi hash.

Contoh berikut menunjukkan bagaimana Anda mendapatkan yang `SigningKey` digunakan di bagian selanjutnya dari prosedur ini, menunjukkan urutan input Anda digabungkan dan di-hash. `HMAC-SHA256`adalah fungsi hash yang digunakan untuk hash data seperti yang ditunjukkan.

```
DateKey = HMAC-SHA256("AWS4"+"<SecretAccessKey>", "<YYYYMMDD>")
DateRegionKey = HMAC-SHA256(<DateKey>, "<aws-region>")
DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<aws-service>")
SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "aws4_request")
```

**Input yang dibutuhkan**
+ `Key`— String yang berisi kunci akses rahasia Anda.
+ `Date`— String yang berisi tanggal yang digunakan dalam lingkup kredensi, dalam format *YYYYMMDD*.
+ `Region`— String yang berisi kode Region (misalnya,`us-east-1`).

  Untuk daftar string Region, lihat [Titik Akhir Regional](https://docs.aws.amazon.com//general/latest/gr/rande.html#regional-endpoints) di. *Referensi Umum AWS*
+ `Service`— String yang berisi kode layanan (misalnya,`ec2`).
+ String untuk menandatangani bahwa Anda membuat pada langkah sebelumnya.

**Untuk mendapatkan kunci penandatanganan untuk SiGv4**

1. Concatenate `"AWS4"` dan kunci akses rahasia. Panggil fungsi hash dengan string gabungan sebagai kunci dan string tanggal sebagai data.

   ```
   DateKey = hash("AWS4" + Key, Date)
   ```

1. Panggil fungsi hash dengan hasil panggilan sebelumnya sebagai kunci dan string Region sebagai data.

   ```
   DateRegionKey = hash(kDate, Region)
   ```

1. Panggil fungsi hash dengan hasil panggilan sebelumnya sebagai kunci dan string layanan sebagai data.

   Kode layanan ditentukan oleh layanan. Anda dapat menggunakan [produk dapatkan](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/pricing/get-products.html) di *AWS CLI Harga* untuk mengembalikan kode layanan untuk suatu layanan.

   ```
   DateRegionServiceKey = hash(kRegion, Service)
   ```

1. Panggil fungsi hash dengan hasil panggilan sebelumnya sebagai kunci dan “aws4\$1request” sebagai data.

   ```
   SigningKey = hash(kService, "aws4_request")
   ```

### Mendapatkan kunci penandatanganan untuk Sigv4a
<a name="derive-signing-key-sigv4a"></a>

Untuk membuat kunci penandatanganan Sigv4a, gunakan proses berikut untuk mendapatkan key pair dari kunci akses rahasia. Untuk contoh implementasi derivasi ini, lihat implementasi [pustaka C99 dari AWS otentikasi](https://github.com/awslabs/aws-c-auth/blob/e8360a65e0f3337d4ac827945e00c3b55a641a5f/source/key_derivation.c#L291.) sisi klien 

```
n = [NIST P-256 elliptic curve group order]
G = [NIST P-256 elliptic curve base point]
label = "AWS4-ECDSA-P256-SHA256"

akid = [AWS access key ID as a UTF8 string]
sk = [AWS secret access Key as a UTF8 Base64 string]

input_key = "AWS4A" || sk
count = 1
while (counter != 255) {
  context = akid || counter // note: counter is one byte
  key = KDF(input_key, label, context, 256)
  c = Oct2Int(key)
  if (c > n - 2) {
    counter++
  } else {
    k = c + 1   // private key
    Q = k * G   // public key
  }
}

if (c < 255) {
  return [k, Q]
} else {
  return FAILURE
}
```

## Hitung tanda tangan
<a name="calculate-signature"></a>

Setelah Anda mendapatkan kunci penandatanganan, hitung tanda tangan untuk ditambahkan ke permintaan Anda. Prosedur ini bervariasi berdasarkan versi siganture yang Anda gunakan.

**Untuk menghitung tanda tangan untuk SigV4**

1. Panggil fungsi hash dengan hasil panggilan sebelumnya sebagai kunci dan **string untuk ditandatangani** sebagai data. Gunakan kunci penandatanganan turunan sebagai kunci hash untuk operasi ini. Hasilnya adalah tanda tangan sebagai nilai biner.

   ```
   signature = hash(SigningKey, string-to-sign)
   ```

1. Mengkonversi tanda tangan dari biner ke representasi heksadesimal, dalam karakter huruf kecil.

**Untuk menghitung tanda tangan untuk Sigv4a**

1. Menggunakan algoritma penandatanganan digital (ECDSA P-256), tandatangani **string untuk menandatangani** yang Anda buat pada langkah sebelumnya. Kunci yang digunakan untuk tanda tangan ini adalah kunci asimetris pribadi yang berasal dari kunci akses rahasia seperti yang dijelaskan di atas.

   ```
   signature = base16(ECDSA-Sign(k, string-to-sign))
   ```

1. Mengkonversi tanda tangan dari biner ke representasi heksadesimal, dalam karakter huruf kecil.

## Tambahkan tanda tangan ke permintaan
<a name="add-signature-to-request"></a>

Tambahkan tanda tangan yang dihitung ke permintaan Anda.

**Example Contoh: Header otorisasi**  
**SiGv4**  
Contoh berikut menunjukkan `Authorization` header untuk `DescribeInstances` tindakan menggunakan AWS SiGv4. Untuk keterbacaan, contoh ini diformat dengan jeda baris. Dalam kode Anda, ini harus berupa string kontinu. Tidak ada koma antara algoritme dan `Credential`. Namun, elemen lainnya harus dipisahkan dengan koma.

```
Authorization: AWS4-HMAC-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request,
SignedHeaders=host;x-amz-date,
Signature=calculated-signature
```

**Sigv4a**  
Contoh berikut menunjukkan header Otorisasi untuk `CreateBucket` tindakan menggunakan AWS Sigv4a. Untuk keterbacaan, contoh ini diformat dengan jeda baris. Dalam kode Anda, ini harus berupa string kontinu. Tidak ada koma antara algoritma dan Credential. Namun, elemen lainnya harus dipisahkan dengan koma.

```
Authorization: AWS4-ECDSA-P256-SHA256
Credential=AKIAIOSFODNN7EXAMPLE/20220830/s3/aws4_request,
SignedHeaders=host;x-amz-date;x-amz-region-set,
Signature=calculated-signature
```

**Example Contoh: Permintaan dengan parameter otentikasi dalam string kueri**  
**SiGv4**  
Contoh berikut menunjukkan kueri untuk `DescribeInstances` tindakan menggunakan AWS SiGv4 yang menyertakan informasi otentikasi. Untuk keterbacaan, contoh ini diformat dengan jeda baris dan tidak dikodekan URL. Dalam kode Anda, string kueri harus berupa string kontinu yang dikodekan URL.

```
https://ec2.amazonaws.com/?
Action=DescribeInstances&
Version=2016-11-15&
X-Amz-Algorithm=AWS4-HMAC-SHA256&
X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request&
X-Amz-Date=20220830T123600Z&
X-Amz-SignedHeaders=host;x-amz-date&
X-Amz-Signature=calculated-signature
```

**Sigv4a**  
Contoh berikut menunjukkan kueri untuk `CreateBucket` tindakan menggunakan AWS Sigv4a yang menyertakan informasi otentikasi. Untuk keterbacaan, contoh ini diformat dengan jeda baris dan tidak dikodekan URL. Dalam kode Anda, string kueri harus berupa string kontinu yang dikodekan URL.

```
https://ec2.amazonaws.com/?
Action=CreateBucket&
Version=2016-11-15&
X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&
X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20220830/s3/aws4_request&
X-Amz-Region-Set=us-west-1&
X-Amz-Date=20220830T123600Z&
X-Amz-SignedHeaders=host;x-amz-date;x-amz-region-set&
X-Amz-Signature=calculated-signature
```

# Minta contoh tanda tangan
<a name="reference_sigv-examples"></a>

Contoh permintaan AWS penandatanganan berikut menunjukkan kepada Anda bagaimana Anda dapat menggunakan SigV4 untuk menandatangani permintaan yang dikirim tanpa AWS SDK atau alat AWS baris perintah.

## Unggahan Amazon S3 berbasis browser menggunakan HTTP POST
<a name="signature-v4-examples-s3-browser"></a>

 [Permintaan Autentikasi: Unggahan Berbasis Browser](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-authentication-HTTPPOST.html) menjelaskan tanda tangan dan informasi relevan yang digunakan Amazon S3 untuk menghitung tanda tangan setelah menerima permintaan.

[Contoh: Unggahan Berbasis Browser menggunakan HTTP POST (Menggunakan AWS Tanda Tangan Versi 4)](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html) memberikan informasi lebih lanjut dengan contoh kebijakan POST dan formulir yang dapat Anda gunakan untuk mengunggah file. Contoh kebijakan dan kredenal fiktif menunjukkan alur kerja dan tanda tangan yang dihasilkan serta hash kebijakan.

## Permintaan yang diautentikasi VPC Lattice
<a name="signature-v4-examples-lattice"></a>

 [Contoh untuk permintaan terautentikasi Signature Version 4 (SigV4) memberikan](https://docs.aws.amazon.com/vpc-lattice/latest/ug/sigv4-authenticated-requests.html) contoh Python dan Java yang menunjukkan bagaimana Anda dapat melakukan penandatanganan permintaan dengan dan tanpa pencegat khusus.

## Menggunakan Signature Versi 4 dengan Amazon Translate
<a name="signature-v4-examples-translate"></a>

 [Terjemahan Langsung di Metaverse](https://aws.amazon.com/blogs/spatial/live-translations-in-the-metaverse/) menunjukkan cara membuat aplikasi yang menghasilkan solusi terjemahan mendekati waktu nyata. Solusi speech-to-speech penerjemah ini menggunakan AWS SiGv4 dalam pengkodean aliran peristiwa untuk menghasilkan transkripsi waktu nyata.

## Menggunakan Signature Versi 4 dengan Neptunus
<a name="signature-v4-examples-neptune"></a>

[Contoh: Menghubungkan ke Neptunus Menggunakan Python dengan Signature Version 4 Signature](https://docs.aws.amazon.com/neptune/latest/userguide/iam-auth-connecting-python.html) Menandatangani menunjukkan cara membuat permintaan yang ditandatangani ke Neptunus menggunakan Python. Contoh ini mencakup variasi untuk menggunakan kunci akses atau kredensi sementara.

## Menandatangani permintaan HTTP ke Amazon Glacier
<a name="signature-v4-examples-streaming-glacier"></a>

[Contoh Perhitungan Tanda Tangan untuk Streaming API](https://docs.aws.amazon.com/amazonglacier/latest/dev/amazon-glacier-signing-requests.html) memandu Anda melalui detail pembuatan tanda tangan untuk Unggah Arsip (arsip POST), salah satu dari dua streaming APIs di Amazon Glacier.

## Membuat Permintaan HTTP ke Amazon SWF
<a name="signature-v4-examples-swf"></a>

[Membuat Permintaan HTTP ke Amazon SWF](https://docs.aws.amazon.com/amazonswf/latest/developerguide/UsingJSON-swf.html#HTTPHeader) menunjukkan konten header untuk permintaan JSON ke Amazon SWF.

## Perhitungan tanda tangan untuk streaming APIs di Amazon OpenSearch Service
<a name="signature-v4-examples-open-search"></a>

[Menandatangani permintaan pencarian Amazon OpenSearch Service dengan AWS SDK for PHP Versi](https://docs.aws.amazon.com/sdk-for-php/v3/developer-guide/service_es-data-plane.html) 3 mencakup contoh cara mengirim permintaan HTTP yang ditandatangani ke OpenSearch Amazon Service.

## Contoh proyek dalam AWS repositori sampel
<a name="signature-v4-examples-sdk"></a>

Contoh proyek berikut menunjukkan cara menandatangani permintaan untuk membuat permintaan Rest API ke AWS layanan dengan bahasa umum seperti Python, Node.js, Java, C \$1, Go dan Rust. 

### Proyek Signature Version 4a
<a name="signature-v4-examples-sigv4a"></a>

Proyek [sigv4-signing-examples](https://github.com/aws-samples/sigv4-signing-examples) memberikan contoh cara menandatangani permintaan dengan SiGv4 untuk membuat permintaan Rest API dengan bahasa Layanan AWS umum seperti Python, Node.js, Java, C \$1, Go dan Rust.

a-signing-examplesProyek [sigv4](https://github.com/aws-samples/sigv4a-signing-examples) memberikan contoh untuk menandatangani permintaan API Multi-wilayah, misalnya Titik [Akses Multi-Wilayah di Amazon](https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiRegionAccessPoints.html) S3.

### Publikasikan ke AWS IoT Core
<a name="signature-v4-examples-iot-python"></a>

[Kode Python untuk dipublikasikan AWS IoT Core menggunakan HTTPs protokol](https://github.com/aws-samples/aws-iot-core-python-node-sigv4-https) memberikan panduan tentang cara mempublikasikan pesan untuk AWS IoT Core menggunakan protokol HTTPS dan otentikasi AWS SiGv4. Ini memiliki dua implementasi referensi - satu di Python dan lainnya di. NodeJs

[Aplikasi .Net Framework untuk mempublikasikan AWS IoT Core menggunakan HTTPs protokol](https://github.com/aws-samples/aws-iot-core-http-sigv4-dotnet-app) memberikan panduan tentang cara mempublikasikan pesan untuk AWS IoT Core menggunakan protokol HTTPS dan otentikasi AWS SigV4. Proyek ini juga mencakup implementasi setara inti .NET.

# 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)