Buat AWS API permintaan yang ditandatangani - 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.

Buat AWS API permintaan yang ditandatangani

penting

Jika Anda menggunakan alat AWS SDK (lihat Contoh Kode dan Pustaka) atau AWS Command Line Interface (AWS CLI) untuk mengirim API permintaan AWS, Anda dapat melewati bagian ini karena SDK dan CLI klien mengautentikasi permintaan Anda dengan menggunakan kunci akses yang Anda berikan. Kecuali Anda memiliki alasan yang baik untuk tidak melakukannya, kami sarankan Anda selalu menggunakan SDK atauCLI.

Di Wilayah yang mendukung beberapa versi tanda tangan, menandatangani permintaan secara manual berarti Anda harus menentukan versi tanda tangan 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 permintaan yang ditandatangani. AWS API

  1. Membuat permintaan kanonik berdasarkan detail permintaan.

  2. Menghitung tanda tangan menggunakan AWS kredensional Anda.

  3. 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 API permintaan, lihat Minta contoh tanda tangan

Diagram berikut menggambarkan proses penandatanganan SigV4, termasuk berbagai komponen string yang Anda buat untuk ditandatangani.

Gambar bagian permintaan kanonik, string untuk ditandatangani, kunci penandatanganan, dan tanda tangan.

Tabel berikut menjelaskan fungsi yang ditunjukkan dalam diagram. Anda perlu menerapkan kode untuk fungsi-fungsi ini. Untuk informasi selengkapnya, lihat contoh kode di AWS SDKs.

Fungsi Deskripsi

Lowercase()

Ubah string menjadi huruf kecil.

Hex()

Pengkodean basis 16 huruf kecil.

SHA256Hash()

Secure Hash Algorithm (SHA) fungsi hash kriptografi.

HMAC-SHA256()

Menghitung HMAC dengan menggunakan SHA256 algoritma dengan kunci penandatanganan yang disediakan. Ini adalah tanda tangan terakhir.

Trim()

Hapus spasi putih di depan atau belakang.

UriEncode()

URImengkodekan setiap byte. UriEncode() harus menegakkan aturan berikut:

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

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

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

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

  • Encode karakter garis miring maju, '/', 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 di dasarnyaRFCs. 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 di GitHub situs web.

catatan

Saat menandatangani permintaan, Anda dapat menggunakan AWS Signature Version 4 atau AWS Signature Version 4A. Perbedaan utama antara keduanya ditentukan oleh bagaimana tanda tangan dihitung. Dengan AWS Signature Version 4A, tanda tangan tidak menyertakan informasi khusus Wilayah dan dihitung menggunakan algoritme. AWS 4-ECDSA-P256-SHA256

Menandatangani permintaan dengan kredensyal keamanan sementara

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

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 AWS API permintaan

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.

Turunkan kunci penandatanganan

Lakukan serangkaian operasi hash kunci (HMAC) pada tanggal permintaan, Wilayah, dan layanan, dengan kunci akses AWS rahasia Anda sebagai kunci untuk operasi hashing awal.

Hitung tanda tangan

Lakukan operasi hash berkunci (HMAC) pada string untuk menandatangani menggunakan kunci penandatanganan turunan sebagai kunci hash.

Tambahkan tanda tangan ke permintaan

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

Buat permintaan kanonik

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 — HTTP Metode, sepertiGET,, PUTHEAD, danDELETE.

  • CanonicalUri — Versi URI -encoded dari komponen jalur absolutURI, 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 (/). URIDalam contoh berikut,/amzn-s3-demo-bucket/myphoto.jpg, adalah jalur absolut dan Anda tidak menyandikan / di jalur absolut:

    http://s3.amazonaws.com/amzn-s3-demo-bucket/myphoto.jpg
  • CanonicalQueryString — Parameter string URI kueri yang dikodekan. 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 URI contoh 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, berikut ini URI 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:

    • HTTPhostsundulan.

    • 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.

    catatan

    x-amz-content-sha256Header 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 x-amz-* header apa pun dalam tanda tangan. 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 semua header dalam perhitungan tanda tangan.

  • 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 HTTP permintaan sebagai input 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

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

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. Untuk SHA -256, algoritmanya adalahAWS4-HMAC-SHA256.

  • RequestDateTime — Tanggal dan waktu yang digunakan dalam lingkup kredensi. Nilai ini adalah UTC waktu saat ini dalam format ISO 8601 (misalnya,20130524T000000Z).

  • CredentialScope — Cakupan kredensi, yang membatasi tanda tangan yang dihasilkan ke Wilayah dan layanan yang ditentukan. String memiliki format berikut: YYYYMMDD/region/service/aws4_permintaan.

  • HashedCanonicalRequest — Hash dari permintaan kanonik, dihitung pada langkah sebelumnya.

Berikut ini adalah contoh string untuk menandatangani.

"AWS4-HMAC-SHA256" + "\n" + timeStampISO8601Format + "\n" + <Scope> + "\n" + Hex(SHA256Hash(<CanonicalRequest>))

Turunkan kunci penandatanganan

Untuk mendapatkan kunci penandatanganan, 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-SHA256adalah 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 Wilayah (misalnya,us-east-1).

    Untuk daftar string Region, lihat Titik Akhir Regional 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
  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)
  2. Panggil fungsi hash dengan hasil panggilan sebelumnya sebagai kunci dan string Wilayah sebagai data.

    DateRegionKey = hash(kDate, Region)
  3. Panggil fungsi hash dengan hasil panggilan sebelumnya sebagai kunci dan string layanan sebagai data.

    Kode layanan ditentukan oleh layanan. Anda dapat menggunakan produk dalam AWS Harga CLI untuk mengembalikan kode layanan untuk suatu layanan.

    DateRegionServiceKey = hash(kRegion, Service)
  4. Panggil fungsi hash dengan hasil panggilan sebelumnya sebagai kunci dan “aws4_request” sebagai data.

    SigningKey = hash(kService, "aws4_request")

Hitung tanda tangan

Setelah Anda mendapatkan kunci penandatanganan, hitung tanda tangan dengan melakukan operasi hash kunci pada string yang akan ditandatangani. Gunakan kunci penandatanganan turunan sebagai kunci hash untuk operasi ini.

Untuk menghitung tanda tangan
  1. Panggil fungsi hash dengan hasil panggilan sebelumnya sebagai kunci dan string untuk ditandatangani sebagai data. Hasilnya adalah tanda tangan sebagai nilai biner.

    signature = hash(SigningKey, string-to-sign)
  2. Mengkonversi tanda tangan dari biner ke representasi heksadesimal, dalam karakter huruf kecil.

Tambahkan tanda tangan ke permintaan

Tambahkan tanda tangan yang dihitung ke permintaan Anda.

contoh Contoh: Header otorisasi

Contoh berikut menunjukkan Authorization header untuk DescribeInstances tindakan. 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
contoh Contoh: Permintaan dengan parameter otentikasi dalam string kueri

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

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