Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Menandatangani dan mengautentikasi permintaan REST
Topik
- Menggunakan kredensial keamanan sementara
- Header autentikasi
- Kanonikalisasi permintaan untuk penandatanganan
- Membuat CanonicalizedResource elemen
- Membuat CanonicalizedAmzHeaders elemen
- Posisi versus elemen HTTP header StringToSign bernama
- Ketentuan stempel waktu
- Contoh-contoh autentikasi
- RESTmeminta masalah penandatanganan
- Alternatif autentikasi permintaan string kueri
catatan
Topik ini menjelaskan tentang autentikasi permintaan dengan menggunakan Tanda Tangan Versi 2. Amazon S3 kini mendukung Tanda Tangan Versi 4 terbaru. Versi tanda tangan terbaru ini didukung di semua wilayah dan setiap wilayah baru setelah 30 Januari 2014 hanya akan mendukung Tanda Tangan Versi 4. Untuk informasi selengkapnya, buka Authenticating Requests (AWS Signature Version 4) di Amazon Simple Storage Service API Reference.
Autentikasi adalah proses pembuktian identitas Anda pada sistem. Identitas adalah faktor penting dalam keputusan kontrol akses Amazon S3. Permintaan diizinkan atau ditolak sebagian berdasarkan identitas pemohon. Sebagai contoh, hak untuk membuat bucket disediakan untuk pengembang yang terdaftar dan (secara default) hak untuk membuat objek di dalam bucket disediakan untuk pemilik bucket yang bersangkutan. Sebagai pengembang, Anda akan membuat permintaan yang menginvokasi hak istimewa ini, jadi Anda perlu membuktikan identitas pada sistem dengan melakukan autentikasi atas permintaan Anda. Dalam bagian ini, akan ditunjukkan caranya.
catatan
Konten di bagian ini tidak berlaku untuk HTTPPOST. Untuk informasi selengkapnya, lihat Unggahan berbasis browser menggunakan POST (versi AWS tanda tangan 2).
Amazon S3 REST API menggunakan HTTP skema kustom berdasarkan keyed- HMAC (Kode Otentikasi Pesan Hash) untuk otentikasi. Untuk mengautentikasi permintaan, pertama-tama Anda perlu menggabungkan elemen-elemen yang dipilih dari permintaan tersebut untuk membentuk string. Anda kemudian menggunakan kunci akses AWS rahasia Anda untuk menghitung HMAC string itu. Secara informal, kami menyebut proses ini “menandatangani permintaan,” dan kami menyebut output dari HMAC algoritma tanda tangan, karena mensimulasikan properti keamanan dari tanda tangan nyata. Terakhir, Anda perlu menambahkan tanda tangan ini sebagai parameter permintaan dengan menggunakan sintaks yang dijelaskan dalam bagian ini.
Ketika sistem menerima permintaan yang diautentikasi, ia mengambil kunci akses AWS rahasia yang Anda klaim memiliki dan menggunakannya dengan cara yang sama untuk menghitung tanda tangan untuk pesan yang diterimanya. Kemudian, sistem akan membandingkan tanda tangan yang dihitung dengan tanda tangan yang diberikan oleh pemohon. Jika kedua tanda tangan cocok, sistem menyimpulkan bahwa pemohon harus memiliki akses ke kunci akses AWS rahasia dan oleh karena itu bertindak dengan otoritas kepala sekolah kepada siapa kunci itu dikeluarkan. Jika kedua tanda tangan tidak cocok, permintaan akan dibatalkan dan sistem merespons dengan mengirimkan pesan kesalahan.
contoh Permintaan Amazon REST S3 yang diautentikasi
GET /photos/puppy.jpg HTTP/1.1 Host: awsexamplebucket1.us-west-1.s3.amazonaws.com Date: Tue, 27 Mar 2007 19:36:42 +0000
Authorization: AWS AKIAIOSFODNN7EXAMPLE: qgk2+6Sv9/oM7G3qLEjTH1a1l1g=
Menggunakan kredensial keamanan sementara
Jika Anda menandatangani permintaan menggunakan kredensial keamanan sementara (lihat Membuat permintaan), Anda harus menyertakan token keamanan yang sesuai dalam permintaan dengan menambahkan header x-amz-security-token
.
Saat Anda memperoleh kredensil keamanan sementara menggunakan AWS Security Token Service
API, respons tersebut mencakup kredensil keamanan sementara dan token sesi. Anda memberikan nilai token sesi dalam header x-amz-security-token
saat Anda mengirim permintaan ke Amazon S3. Untuk informasi tentang yang AWS Security Token Service API disediakan olehIAM, buka Tindakan dalam Panduan AWS Security Token Service API Referensi.
Header autentikasi
Amazon S3 REST API menggunakan HTTP Authorization
header standar untuk meneruskan informasi otentikasi. (Nama header standar tidak disarankan karena memuat informasi autentikasi, bukan otorisasi.) Berdasarkan skema autentikasi Amazon S3, header Otorisasi memiliki bentuk berikut ini:
Authorization: AWS
AWSAccessKeyId
:Signature
Pengembang diberikan ID kunci AWS akses dan kunci akses AWS rahasia saat mereka mendaftar. Untuk autentikasi permintaan, elemen AWSAccessKeyId
mengidentifikasi ID kunci akses yang digunakan untuk menghitung tanda tangan dan secara tidak langsung, juga mengidentifikasi pengembang yang mengajukan permintaan.
Signature
Elemennya adalah RFC 2104 HMAC - SHA1 elemen yang dipilih dari permintaan, sehingga Signature
bagian dari header Otorisasi akan bervariasi dari permintaan ke permintaan. Jika tanda tangan permintaan yang dihitung oleh sistem cocok dengan yang Signature
disertakan dengan permintaan, pemohon akan menunjukkan kepemilikan kunci akses AWS rahasia. Permintaan tersebut kemudian akan diproses menggunakan identitas tersebut dan dengan otoritas dari pengembang yang diberikan kunci tersebut.
Berikut ini adalah pseudogrammar yang mengilustrasikan konstruksi header permintaan Authorization
. (Dalam contoh tersebut, \n
berarti titik kode Unicode U+000A
, umumnya disebut sebagai baris baru).
Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature; Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of(YourSecretAccessKey), UTF-8-Encoding-Of( StringToSign ) ) ); StringToSign = HTTP-Verb + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Date + "\n" + CanonicalizedAmzHeaders + CanonicalizedResource; CanonicalizedResource = [ "/" + Bucket ] + <HTTP-Request-URI, from the protocol name up to the query string> + [ subresource, if present. For example "?acl", "?location", or "?logging"]; CanonicalizedAmzHeaders = <described below>
HMAC- SHA1 adalah algoritma yang didefinisikan oleh RFC2104 - Keyed-HashingYourSecretAccessKey
) sebagai kunci, dan pengkodean UTF -8 sebagai pesan. StringToSign
Output dari HMAC - SHA1 juga string byte, yang disebut intisari. Parameter permintaan Signature
dibangun berdasarkan Base64 yang mengkodekan digest ini.
Kanonikalisasi permintaan untuk penandatanganan
Ingatlah bahwa ketika sistem menerima permintaan yang diautentikasi, sistem tersebut membandingkan tanda tangan permintaan yang dikomputasi dengan tanda tangan yang disertakan dalam permintaan di StringToSign
. Oleh karena itu, Anda harus melakukan komputasi tanda tangan dengan menggunakan metode yang sama seperti yang digunakan oleh Amazon S3. Kami menyebut proses permohonan dalam bentuk yang telah disetujui untuk penandatanganan sebagai kanonikalisasi.
Membuat CanonicalizedResource elemen
CanonicalizedResource
mewakili sumber daya Amazon S3 yang ditarget oleh permintaan. Bangun untuk REST permintaan sebagai berikut:
1 |
Mulai dengan string kosong ( |
2 |
Jika permintaan menentukan bucket menggunakan header Host (gaya HTTP host virtual), tambahkan nama bucket yang didahului dengan (misalnya, “/bucketname” Untuk permintaan gaya host virtual "https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg “, Untuk permintaan gaya jalur, "https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg “, |
3 |
Tambahkan bagian jalur dari HTTP Request- yang tidak diterjemahkanURI, up-to tetapi tidak termasuk string kueri. Untuk permintaan gaya host virtual "https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg “, itu Untuk permintaan gaya jalur, "https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg “, Untuk permintaan yang tidak membahas bucket, seperti GETService, tambahkan “/”. |
4 |
Jika permintaan membahas sub-sumber daya, seperti Subresource yang harus disertakan saat membuat CanonicalizedResource Elemen adalah acl, lifecycle, location, logging, notification, policy,,, uploadpartNumber, versioning requestPaymentuploadId, versionversionId, dan website. Jika permintaan menentukan parameter string kueri yang menimpa nilai header respons (lihat Dapatkan Objek), tambahkan parameter string kueri dan nilainya. Saat menandatangani, Anda tidak melakukan encoding atas nilai-nilai ini; namun, saat membuat permintaan, Anda harus melakukan encoding atas nilai-nilai parameter ini. Parameter string kueri dalam GET permintaan meliputi Parameter string |
Elemen CanonicalizedResource yang berasal dari HTTP Permintaan- URI harus ditandatangani secara harfiah seperti yang muncul dalam HTTP permintaan, termasuk karakter meta URL -Encoding.
CanonicalizedResource
Mungkin berbeda dari HTTP Permintaan-URI. Khususnya, jika permintaan Anda menggunakan HTTP Host
header untuk menentukan bucket, bucket tidak akan muncul di HTTP Request-URI. Namun, CanonicalizedResource
harus tetap menyertakan bucket. Parameter string kueri mungkin juga muncul di Permintaan- URI tetapi tidak disertakan dalamCanonicalizedResource
. Untuk informasi selengkapnya, lihat Bucket dengan hosting virtual.
Membuat CanonicalizedAmzHeaders elemen
Untuk membuat CanonicalizedAmzHeaders bagian dariStringToSign
, pilih semua header HTTP permintaan yang dimulai dengan 'x-amz-' (menggunakan perbandingan case-insensitive), dan gunakan proses berikut.
1 | Ubah setiap nama HTTP header menjadi huruf kecil. Misalnya, 'X-Amz-Date ' menjadi 'x-amz-date '. |
2 | Urutkan pengumpulan header secara leksikografis berdasarkan nama header. |
3 | Gabungkan bidang header dengan nama yang sama menjadi satu pasangan “header-name:comma-separated-value-list” seperti yang ditentukan oleh RFC 2616, bagian 4.2, tanpa spasi di antara nilai. Misalnya, dua metadata header 'x-amz-meta-username: fred ' dan 'x-amz-meta-username: barney ' akan digabungkan ke dalam header tunggal 'x-amz-meta-username:
fred,barney '. |
4 | “Buka” header panjang yang menjangkau beberapa baris (seperti yang diizinkan oleh RFC 2616, bagian 4.2) dengan mengganti ruang lipat (termasuk baris baru) dengan satu spasi. |
5 | Hapus setiap spasi di sekitar titik dua yang terdapat dalam header. Contohnya, header 'x-amz-meta-username: fred,barney ' akan menjadi 'x-amz-meta-username:fred,barney ' |
6 | Terakhir, tambahkan karakter baris baru (U+000A ) untuk setiap header kanonikalisasi dalam daftar hasil. Membangun CanonicalizedResource elemen dengan menggabungkan semua header dalam daftar ini menjadi string tunggal. |
Posisi versus elemen HTTP header StringToSign bernama
Beberapa elemen header pertama StringToSign
(Content-Type, Date, dan Content-MD5) bersifat posisional. StringToSign
tidak termasuk nama-nama header ini, hanya nilainya dari permintaan. Sebaliknya, elemen 'x-amz-
' diberi nama. Baik nama header dan nilai header akan muncul di StringToSign
.
Jika header posisi yang dipanggil dalam definisi tidak StringToSign
ada dalam permintaan Anda (misalnya, Content-Type
atau Content-MD5
opsional untuk PUT permintaan dan tidak berarti untuk GET permintaan), gantikan string kosong (“”) untuk posisi itu.
Ketentuan stempel waktu
Stempel waktu yang valid (menggunakan HTTP Date
header atau x-amz-date
alternatif) wajib untuk permintaan yang diautentikasi. Selain itu, stempel waktu klien yang disertakan dengan permintaan yang diautentikasi harus dalam waktu 15 menit dari waktu sistem Amazon S3 saat permintaan tersebut diterima. Jika tidak, permintaan akan gagal dengan kode kesalahan RequestTimeTooSkewed
. Tujuan dari pembatasan ini adalah untuk membatasi kemungkinan bahwa permintaan yang diintersepsi dapat diputar ulang oleh pihak lawan. Untuk perlindungan yang lebih kuat terhadap penyadapan, gunakan HTTPS transport untuk permintaan yang diautentikasi.
catatan
Batasan validasi pada tanggal permintaan hanya berlaku untuk permintaan yang diautentikasi yang tidak menggunakan autentikasi string kueri. Untuk informasi selengkapnya, lihat Alternatif autentikasi permintaan string kueri.
Beberapa pustaka HTTP klien tidak mengekspos kemampuan untuk mengatur Date
header untuk permintaan. Jika Anda mengalami masalah saat menyertakan nilai header 'Tanggal' di header kanonikalisasi, Anda dapat mengatur stempel waktu untuk permintaan tersebut dengan menggunakan header 'x-amz-date
'. Nilai x-amz-date
header harus dalam salah satu format RFC 2616 (http://www.ietf.org/rfc/rfc2616.txtx-amz-date
terdapat dalam permintaan, maka sistem akan mengabaikan header Date
saat melakukan komputasi tanda tangan permintaan. Oleh karena itu, jika Anda menyertakan header x-amz-date
, gunakan string kosong untuk Date
saat membangun StringToSign
. Lihat contohnya di bagian berikut.
Contoh-contoh autentikasi
Contoh-contoh dalam bagian ini menggunakan kredensial (nonkerja) dalam tabel berikut.
Parameter | Nilai |
---|---|
AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE |
AWSSecretAccessKey | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
Dalam contoh StringToSign
, format tidak signifikan, dan \n
berarti titik kode Unicode U+000A
yang biasanya disebut sebagai baris baru. Selain itu, contoh tersebut menggunakan “+0000” untuk menentukan zona waktu. Anda dapat menggunakan "GMT" untuk menentukan zona waktu sebagai gantinya, tetapi tanda tangan yang ditunjukkan dalam contoh akan berbeda.
Objek GET
Contoh ini mendapatkan objek dari bucket awsexamplebucket1.
Permintaan | StringToSign |
---|---|
|
|
Perhatikan bahwa CanonicalizedResource menyertakan nama bucket, tetapi HTTP Request- URI tidak. (Bucket ditentukan berdasarkan header Host.)
catatan
Skrip Python berikut ini menghitung tanda tangan sebelumnya, menggunakan parameter yang disediakan. Anda dapat menggunakan skrip ini untuk membuat tanda tangan Anda sendiri, mengganti kunci dan StringToSign yang sesuai.
import base64 import hmac from hashlib import sha1 access_key = '
AKIAIOSFODNN7EXAMPLE
'.encode("UTF-8") secret_key = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
'.encode("UTF-8") string_to_sign = 'GET\n\n\nTue, 27 Mar 2007 19:36:42 +0000\n/awsexamplebucket1/photos/puppy.jpg
'.encode("UTF-8") signature = base64.b64encode( hmac.new( secret_key, string_to_sign, sha1 ).digest() ).strip() print(f"AWS {access_key.decode()}:{signature.decode()}")
Objek PUT
Contoh ini menempatkan sebuah objek ke dalam bucket awsexamplebucket1.
Permintaan | StringToSign |
---|---|
|
|
Perhatikan header Content-Type dalam permintaan dan di. StringToSign Perhatikan juga bahwa Konten- MD5 dibiarkan kosong di StringToSign, karena tidak ada dalam permintaan.
Daftar
Contoh ini mencantumkan konten dari bucket awsexamplebucket1.
Permintaan | StringToSign |
---|---|
|
|
Perhatikan garis miring pada CanonicalizedResource dan tidak adanya parameter string kueri.
Mengambil
Contoh ini mengambil sub-sumber daya kebijakan kontrol akses untuk bucket 'awsexamplebucket1'.
Permintaan | StringToSign |
---|---|
|
|
Perhatikan bagaimana parameter string kueri subresource disertakan dalam. CanonicalizedResource
Hapus
Contoh ini menghapus objek dari bucket 'awsexamplebucket1' menggunakan alternatif gaya penulisan path dan Tanggal.
Permintaan | StringToSign |
---|---|
|
|
Perhatikan bagaimana kami menggunakan metode 'x-amz-date' alternatif untuk menentukan tanggal (karena pustaka klien kami mencegah kami mengatur tanggal, katakanlah). Dalam hal ini, x-amz-date
lebih diutamakan dari header Date
. Oleh karena itu, entri tanggal pada tanda tangan harus berisi nilai header x-amz-date
.
Unggah
Contoh ini mengunggah objek ke bucket CNAME gaya virtual yang dihosting dengan metadata.
Permintaan | StringToSign |
---|---|
|
|
Perhatikan bagaimana header 'x-amz-' diurutkan, dipotong spasi ekstranya, dan diubah menjadi huruf kecil. Perhatikan juga bahwa beberapa header yang memiliki nama yang sama telah digabungkan menggunakan koma untuk memisahkan nilai.
Perhatikan bagaimana hanya header Content-Type
dan Content-MD5
HTTP entitas yang muncul di. StringToSign
Header entitas Content-*
lainnya tidak muncul.
Sekali lagi, perhatikan bahwa CanonicalizedResource
menyertakan nama bucket, tetapi HTTP Request- URI tidak. (Bucket ditentukan berdasarkan header Host.)
Tuliskan semua bucket saya
Permintaan | StringToSign |
---|---|
|
|
Kunci Unicode
Permintaan | StringToSign |
---|---|
|
|
catatan
Unsur-unsur StringToSign
yang berasal dari Permintaan- diambil URI secara harfiah, termasuk URL -Encoding dan kapitalisasi.
RESTmeminta masalah penandatanganan
Ketika otentikasi REST permintaan gagal, sistem merespons permintaan dengan dokumen XML kesalahan. Informasi yang terdapat dalam dokumen kesalahan ini ditujukan untuk membantu pengembang melakukan diagnosis masalah. Secara khusus, elemen StringToSign
dari dokumen kesalahan SignatureDoesNotMatch
memberi tahu Anda dengan tepat kanonikalisasi permintaan yang digunakan oleh sistem.
Beberapa toolkit diam-diam memasukkan header yang tidak Anda ketahui sebelumnya, seperti menambahkan header selama a. Content-Type
PUT Dalam sebagian besar kasus ini, nilai header yang dimasukkan tetap konstan, sehingga Anda dapat menemukan header yang hilang dengan menggunakan alat seperti Ethereal atau tcpmon.
Alternatif autentikasi permintaan string kueri
Anda dapat mengautentikasi jenis permintaan tertentu dengan meneruskan informasi yang diperlukan sebagai parameter string kueri alih-alih menggunakan header. Authorization
HTTP Ini berguna untuk mengaktifkan akses peramban pihak ketiga langsung ke data Amazon S3 pribadi Anda tanpa mengajukan permintaan melalui proxy. Idenya adalah untuk membuat permintaan “presigned” dan menyandikannya sebagai URL yang dapat diambil oleh browser pengguna akhir. Selain itu, Anda dapat membatasi sebuah permintaan yang telah ditandatangani sebelumnya dengan menentukan waktu kedaluwarsa.
Untuk informasi selengkapnya tentang penggunaan parameter kueri untuk mengautentikasi permintaan, lihat Mengautentikasi Permintaan: Menggunakan Parameter Kueri (Versi AWS Tanda Tangan 4) di Referensi Layanan API Penyimpanan Sederhana Amazon. Untuk contoh menggunakan AWS SDKs to generating presignedURLs, lihatBerbagi objek dengan presigned URLs.
Membuat tanda tangan
Berikut ini adalah contoh query string diautentikasi Amazon REST S3 permintaan.
GET /photos/puppy.jpg ?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D HTTP/1.1 Host: awsexamplebucket1.s3.us-west-1.amazonaws.com Date: Mon, 26 Mar 2007 19:37:58 +0000
Metode otentikasi permintaan string kueri tidak memerlukan HTTP header khusus. Sebaliknya, elemen autentikasi yang diperlukan akan ditentukan sebagai parameter string kueri:
Nama parameter string kueri | Nilai contoh | Deskripsi |
---|---|---|
AWSAccessKeyId |
AKIAIOSFODNN7EXAMPLE |
ID kunci AWS akses Anda. Menentukan kunci akses AWS rahasia yang digunakan untuk menandatangani permintaan dan, secara tidak langsung, identitas pengembang yang membuat permintaan. |
Expires |
1141889120 |
Waktu ketika tanda tangan berakhir, ditentukan sebagai jumlah detik sejak zaman (00:00:00 UTC pada 1 Januari 1970). Permintaan yang diterima setelah waktu ini (berdasarkan waktu server) akan ditolak. |
Signature |
vjbyPxybdZaNmGa%2ByT272YEAiv4%3D |
URLPengkodean pengkodean Base64 dari - dari. HMAC SHA1 StringToSign |
Metode autentikasi permintaan string kueri sedikit berbeda dari metode biasa tetapi hanya dalam bentuk format dari parameter permintaan Signature
dan elemen StringToSign
. Berikut ini adalah pseudo-grammar yang mengilustrasikan metode autentikasi permintaan string kueri.
Signature = URL-Encode( Base64( HMAC-SHA1( YourSecretAccessKey, UTF-8-Encoding-Of( StringToSign ) ) ) ); StringToSign = HTTP-VERB + "\n" + Content-MD5 + "\n" + Content-Type + "\n" + Expires + "\n" + CanonicalizedAmzHeaders + CanonicalizedResource;
YourSecretAccessKey
adalah ID kunci akses AWS rahasia yang diberikan Amazon kepada Anda saat Anda mendaftar untuk menjadi pengembang Layanan Web Amazon. Perhatikan bagaimana URL -Encoded untuk membuatnya cocok untuk penempatan dalam string query. Signature
Perhatikan juga bahwa diStringToSign
, elemen HTTP Date
posisi telah diganti denganExpires
. CanonicalizedAmzHeaders
dan CanonicalizedResource
sama.
catatan
Dalam metode autentikasi string kueri, Anda tidak menggunakan Date
atau x-amz-date request
saat menghitung string yang akan ditandatangani.
Autentikasi permintaan string kueri
Permintaan | StringToSign |
---|---|
|
|
Kami berasumsi bahwa ketika browser membuat GET permintaan, browser tidak akan menyediakan header Content- MD5 atau Content-Type, juga tidak akan menyetel header x-amz-, sehingga bagian-bagian tersebut dibiarkan kosong. StringToSign
Menggunakan pengodean Base64
HMACtanda tangan permintaan harus dikodekan Base64. Pengkodean Base64 mengubah tanda tangan menjadi ASCII string sederhana yang dapat dilampirkan ke permintaan. Karakter yang dapat muncul dalam string tanda tangan seperti plus (+), garis miring maju (/), dan sama dengan (=) harus dikodekan jika digunakan dalam file. URI Misalnya, jika kode autentikasi menyertakan tanda tambah (+), konversikan kode tersebut sebagai %2B dalam permintaan. Konversikan kode garis miring menjadi %2F dan sama dengan menjadi %3D.
Untuk contoh pengodean Base64, lihat Amazon S3 Contoh-contoh autentikasi.