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
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
-
Membuat permintaan kanonik berdasarkan detail permintaan.
-
Menghitung tanda tangan menggunakan AWS kredensional Anda.
-
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.
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 |
---|---|
|
Ubah string menjadi huruf kecil. |
|
Pengkodean basis 16 huruf kecil. |
|
Secure Hash Algorithm (SHA) fungsi hash kriptografi. |
|
Menghitung HMAC dengan menggunakan SHA256 algoritma dengan kunci penandatanganan yang disediakan. Ini adalah tanda tangan terakhir. |
|
Hapus spasi putih di depan atau belakang. |
|
URImengkodekan setiap byte. UriEncode() harus menegakkan aturan berikut:
pentingUriEncode 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 |
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
,,PUT
HEAD
, 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 mengidentifikasiACL
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:
-
HTTP
host
sundulan. -
Jika
Content-Type
header ada dalam permintaan, Anda harus menambahkannya keCanonicalHeaders
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 memasukkanx-amz-security-token
dalam permintaan Anda. Anda harus menambahkan header ini dalam daftarCanonicalHeaders
.
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
x-amz-*
header apa pun dalam tanda tangan. Anda dapat secara opsional menyertakan header standar lainnya dalam tanda tangan, seperti tipe konten.
Trim()
FungsiLowercase()
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, nilaiSignedHeaders
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 nilaix-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-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 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
-
Concatenate
"AWS4"
dan kunci akses rahasia. Panggil fungsi hash dengan string gabungan sebagai kunci dan string tanggal sebagai data.DateKey = hash("AWS4" + Key, Date)
-
Panggil fungsi hash dengan hasil panggilan sebelumnya sebagai kunci dan string Wilayah sebagai data.
DateRegionKey = hash(kDate, Region)
-
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)
-
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
-
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
) -
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