View a markdown version of this page

Otentikasi Permintaan: Menggunakan Parameter Kueri (AWS Versi Tanda Tangan 4) - Amazon Simple Storage Service

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

Otentikasi Permintaan: Menggunakan Parameter Kueri (AWS Versi Tanda Tangan 4)

Seperti dijelaskan dalam ikhtisar otentikasi (lihatMetode Autentikasi), Anda dapat memberikan informasi otentikasi menggunakan parameter string kueri. Menggunakan parameter kueri untuk mengotentikasi permintaan berguna ketika Anda ingin mengungkapkan permintaan sepenuhnya dalam URL. Metode ini juga disebut sebagai penandatanganan URL.

Skenario kasus penggunaan untuk URL yang ditandatangani sebelumnya adalah Anda dapat memberikan akses sementara ke sumber daya Amazon S3 Anda. Misalnya, Anda dapat menyematkan URL yang telah ditandatangani sebelumnya di situs web Anda atau menggunakannya di klien baris perintah (seperti Curl) untuk mengunduh objek.

catatan

Anda juga dapat menggunakan AWS CLI untuk membuat URL yang ditandatangani sebelumnya. Untuk informasi selengkapnya, lihat presign dalam AWS CLI Referensi Perintah.

Berikut ini adalah contoh URL yang ditandatangani sebelumnya.

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

Dalam contoh URL, perhatikan hal berikut:

  • Umpan baris ditambahkan untuk keterbacaan.

  • X-Amz-CredentialNilai dalam URL menunjukkan karakter “/” hanya untuk keterbacaan. Dalam praktiknya, 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 di URL yang menyediakan informasi otentikasi.

Nama Parameter String Kueri Nilai Contoh
X-Amz-Algorithm

Mengidentifikasi versi T AWS anda Tangan dan algoritma yang Anda gunakan untuk menghitung tanda tangan.

Untuk AWS Signature Version 4, Anda menetapkan nilai parameter ini keAWS4-HMAC-SHA256. String ini mengidentifikasi AWS Signature Version 4 (AWS 4) dan HMAC-SHA256 algoritma (HMAC-SHA256).

X-Amz-Credential

Selain ID kunci akses Anda, parameter ini juga menyediakan ruang lingkup (Wilayah AWS dan layanan) yang tanda tangannya valid. Nilai ini harus sesuai dengan cakupan yang Anda gunakan dalam perhitungan tanda tangan, dibahas di bagian berikut. Bentuk umum untuk nilai parameter ini adalah sebagai berikut:

<your-access-key-id>/<date>/<Wilayah AWS>/<AWS-service>/aws4_request

Contoh:

AKIAIOSFODNN7EXAMPLE/20130721/us-east-1/s3/aws4_request

Untuk Amazon S3, AWS-service string adalahs3. Untuk daftar AWS-region string S3, lihat Wil ayah dan Titik Akhir di Referensi Umum AWS.

X-Amz-Date

Format tanggal dan waktu harus mengikuti standar ISO 8601, dan harus diformat dengan format "yyyyMMddT HHmmss Z”. Misalnya jika tanggal dan waktu adalah "08/01/2016 15:32:41.982-700" maka pertama-tama harus dikonversi ke UTC (Waktu Universal Terkoordinasi) dan kemudian dikirimkan sebagai “20160801T223241Z”.

X-Amz-Expires

Menyediakan periode waktu, dalam detik, di mana URL yang telah ditandatangani sebelumnya 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 ditandatangani dapat berlaku 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:

  • hostHeader HTTP.

  • Setiap x-amz-* header yang Anda rencanakan untuk ditambahkan ke permintaan.

catatan

Untuk keamanan tambahan, Anda harus menandatangani semua header permintaan yang Anda rencanakan untuk disertakan dalam permintaan Anda.

X-Amz-Signature

Menyediakan tanda tangan untuk mengotentikasi permintaan Anda. Tanda tangan ini harus sesuai dengan tanda tangan yang dihitung Amazon S3; jika tidak, Amazon S3 menolak permintaan tersebut. Sebagai contoh, 733255ef022bec3f2a8701cd61d4b371f3f28c9f193a1f02279211d48d5193d7.

Perhitungan tanda tangan dijelaskan di bagian berikut.

X-Amz-Security-Token

Parameter kredensi opsional jika menggunakan kredenSIAL yang bersumber dari layanan STS.

Menghitung Tanda Tangan

Diagram berikut menggambarkan proses perhitungan tanda tangan.

AWS Proses penandatanganan Signature Versi 4 dengan permintaan kanonik, string untuk ditandatangani, dan langkah-langkah pembuatan tanda tangan.

Tabel berikut menjelaskan fungsi yang ditunjukkan dalam diagram. Anda perlu menerapkan kode untuk fungsi-fungsi ini.

Fungsi Deskripsi
Lowercase() Ubah string menjadi huruf kecil.
Hex() Pengkodean huruf kecil 16.
SHA256Hash() Fungsi hash kriptografi Secure Hash Algorithm (SHA).
HMAC-SHA256() Menghitung HMAC dengan menggunakan algoritma SHA256 dengan kunci penandatanganan yang disediakan. Ini adalah tanda tangan terakhir.
Trim() Hapus spasi kosong di depan atau di belakang.
UriEncode()

URI mengkodekan setiap byte. UriEncode() harus menegakkan aturan berikut:

  • URI mengkodekan setiap byte kecuali karakter tanpa syarat: 'A'-'Z', 'a'-'z', '0'-'9', '-', ' . ',' _ ', dan '~'.

  • Karakter spasi adalah karakter yang dicadangkan dan harus dikodekan sebagai “%20" (dan bukan sebagai “+”).

  • Setiap byte yang dikodekan URI dibentuk oleh '%' dan nilai heksadesimal dua digit byte.

  • Huruf dalam nilai heksadesimal harus huruf besar, misalnya “%1A”.

  • Enkode karakter garis miring ke depan, '/', di mana-mana kecuali dalam nama kunci objek. Misalnya, jika nama kunci objek adalahphotos/Jan/sample.jpg, garis miring ke depan dalam nama kunci tidak dikodekan.

penting

UriEncode Fungsi standar yang disediakan oleh platform pengembangan Anda mungkin tidak berfungsi karena perbedaan dalam implementasi dan ambiguitas terkait dalam RFC yang mendasarinya. Kami menyarankan Anda menulis UriEncode fungsi kustom Anda sendiri untuk memastikan bahwa pengkodean Anda akan berfungsi.

Berikut ini adalah contoh fungsi UriEncode () di Java.

public static String UriEncode(CharSequence input, boolean encodeSlash) { StringBuilder result = new StringBuilder(); for (int i = 0; i < input.length(); i++) { char ch = input.charAt(i); if ((ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9') || ch == '_' || ch == '-' || ch == '~' || ch == '.') { result.append(ch); } else if (ch == '/') { result.append(encodeSlash ? "%2F" : ch); } else { result.append(toHexUTF8(ch)); } } return result.toString(); }

Untuk informasi selengkapnya tentang proses penandatanganan (detail pembuatan permintaan kanonik, string untuk ditandatangani, dan perhitungan tanda tangan), lihatPerhitungan Tanda Tangan untuk Header Otorisasi: Mentransfer Payload dalam Satu Potongan (AWS Versi Tanda Tangan 4). Prosesnya umumnya sama kecuali bahwa pembuatan CanonicalRequest dalam URL yang telah ditandatangani berbeda sebagai berikut:

  • Anda tidak menyertakan hash payload di Canonical Request, karena ketika Anda membuat URL yang telah ditandatangani sebelumnya, Anda tidak mengetahui konten payload karena URL digunakan untuk mengunggah payload sewenang-wenang. Sebagai gantinya, Anda menggunakan string konstanUNSIGNED-PAYLOAD.

  • Canonical Query String harus menyertakan semua parameter kueri dari tabel sebelumnya kecuali untukX-Amz-Signature.

  • Untuk S3, Anda harus menyertakan parameter ku X-Amz-Security-Token eri di URL jika menggunakan kredenSIAL yang bersumber dari layanan STS.

  • Header kanonik harus menyertakan header HTTPhost. Jika Anda berencana untuk menyertakan salah satu x-amz-* header, header ini juga harus ditambahkan untuk perhitungan tanda tangan. Anda dapat secara opsional menambahkan semua header lain yang Anda rencanakan untuk disertakan dalam permintaan Anda. Untuk keamanan tambahan, Anda harus menandatangani header sebanyak mungkin. Jika Anda menambahkan header yang ditandatangani yang juga merupakan parameter kueri yang ditandatangani, dan nilainya berbeda, Anda akan menerima InvalidRequest kesalahan karena input bertentangan.

Sebuah contoh

Misalkan Anda memiliki objek test.txt di examplebucket ember Anda. Anda ingin berbagi objek ini dengan orang lain untuk jangka waktu 24 jam (86400 detik) dengan membuat URL yang telah ditandatangani sebelumnya.

https://examplebucket.s3.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Signature=<signature-value>

Langkah-langkah berikut menggambarkan terlebih dahulu perhitungan tanda tangan dan kemudian konstruksi URL yang telah ditandatangani sebelumnya. Contoh membuat asumsi tambahan berikut:

  • Stempel waktu permintaan adalah. Fri, 24 May 2013 00:00:00 GMT

  • Bucket berada di wilayah AS Timur (Virginia Utara), dan kreden Scope si serta Signing Key perhitungan digunakan us-east-1 sebagai penentu wilayah. Untuk informasi selengkapnya, lihat Wilayah dan Titik Ak hir di Referensi Umum AWS.

Anda dapat menggunakan contoh ini sebagai kasus uji untuk memverifikasi tanda tangan yang dihitung kode Anda; namun, Anda harus menggunakan nama bucket yang sama, kunci objek, stempel waktu, dan kredenSIAL contoh berikut:

Parameter Nilai
AWSAccessKeyId AKIAIOSFODNN7EXAMPLE
AWSSecretAccessKey wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
  1. StringToSign
    1. CanonicalRequest

      GET /test.txt X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host host:examplebucket.s3.amazonaws.com host UNSIGNED-PAYLOAD

    2. StringToSign

      AWS4-HMAC-SHA256 20130524T000000Z 20130524/us-east-1/s3/aws4_request 3bfa292879f6447bbcda7001decf97f4a54dc650c8942174ae0a9121cf58ad04

  2. SigningKey

    signing key = HMAC-SHA256(HMAC-SHA256(HMAC-SHA256(HMAC-SHA256("AWS4" + "<YourSecretAccessKey>","20130524"),"us-east-1"),"s3"),"aws4_request")

  3. Tanda tangan

    aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404

    Sekarang Anda memiliki semua informasi untuk membangun URL yang telah ditandatangani sebelumnya. URL yang dihasilkan untuk contoh ini ditampilkan sebagai berikut (Anda dapat menggunakan ini untuk membandingkan URL yang telah ditandatangani sebelumnya):

    https://examplebucket.s3.amazonaws.com/test.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20130524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=aeeed9bbccd4d02ee5c0109b86d86835f995330da4c265957d157751f604d404

Contoh 2

Berikut ini adalah contoh (tidak terkait dengan contoh sebelumnya) yang menunjukkan URL yang ditandatangani sebelumnya dengan X-Amz-Security-Token parameter.

https://examplebucket.s3.us-east-1.amazonaws.com/test.txt ?X-Amz-Algorithm=AWS4-HMAC-SHA256 &X-Amz-Credential=AKIAIOSFODNN7EXAMPLE%2F20130524%2Fus-east-1%2Fs3%2Faws4_request &X-Amz-Date=20200524T000000Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host &X-Amz-Security-Token=IQoJb3JpZ2luX2VjEMv%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJGMEQCIBSUbVdj9YGs2g0HkHsOHFdkwOozjARSKHL987NhhOC8AiBPepRU1obMvIbGU0T%2BWphFPgK%2Fqpxaf5Snvm5M57XFkCqlAgjz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2F8BEAAaDDQ3MjM4NTU0NDY2MCIM83pULBe5%2F%2BNm1GZBKvkBVslSaJVgwSef7SsoZCJlfJ56weYl3QCwEGr2F4BmCZZyFpmWEYzWnhNK1AnHMj5nkfKlKBx30XAT5PZGVrmq4Vkn9ewlXQy1Iu3QJRi9Tdod8Ef9%2FyajTaUGh76%2BF5u5a4O115jwultOQiKomVwO318CO4l8lv%2F3HhMOkpdanMXn%2B4PY8lvM8RgnzSu90jOUpGXEOAo%2F6G8OqlMim3%2BZmaQmasn4VYRvESEd7O72QGZ3%2BvDnDVnss0lSYjlv8PP7IujnvhZRnj0WoeOyMe1lL0wTG%2Fa9usH5hE52w%2FYUJccOn0OaZuyROuVsRV4Q70sbWQhUvYUt%2B0tUMKzm8vsFOp4BaNZFqobbjtb36Y92v%2Bx5kY6i0s8QE886jJtUWMP5ldMziClGx3p0mN5dzsYlM3GyiJ%2FO1mWkPQDwg3mtSpOA9oeeuAMPTA7qMqy9RNuTKBDSx9EW27wvPzBum3SJhEfxv48euadKgrIX3Z79ruQFSQOc9LUrDjR%2B4SoWAJqK%2BGX8Q3vPSjsLxhqhEMWd6U4TXcM7ku3gxMbzqfT8NDg%3D &X-Amz-Signature=<signature-value>