Dalam Object Storage Service (OSS), metode paling umum untuk memberikan informasi otentikasi adalah melalui header Authorization HTTP. Kecuali untuk permintaan POST dan permintaan yang ditandatangani menggunakan parameter kueri, semua operasi OSS menggunakan header Authorization untuk otentikasi. Topik ini menjelaskan cara menggunakan algoritma tanda tangan V1 untuk menyertakan tanda tangan di header Authorization.
Kami merekomendasikan penggunaan algoritma tanda tangan V4, yang menawarkan keamanan lebih baik. Untuk informasi lebih lanjut, lihat Sertakan tanda tangan V4 di header Authorization (direkomendasikan).
Gunakan SDK OSS untuk mengimplementasikan tanda tangan V1 secara otomatis
SDK OSS mendukung implementasi otomatis tanda tangan V1. Saat menggunakan SDK OSS, Anda tidak perlu menambahkan tanda tangan ke permintaan. Untuk detail implementasi tanda tangan pada bahasa pemrograman tertentu, lihat kode contoh SDK OSS untuk bahasa tersebut. Tabel berikut menyediakan referensi ke kode contoh yang digunakan untuk menandatangani permintaan dengan SDK OSS dalam berbagai bahasa pemrograman.
SDK | Kode contoh |
Java | |
PHP | |
Node.js | |
Browser.js | |
Python | |
.Net | |
Android | |
Go | |
iOS | |
C++ | |
C | |
Ruby |
Perhitungan header Authorization
Metode perhitungan
Authorization = "OSS " + AccessKeyId + ":" + Signature
Signature = base64(hmac-sha1(AccessKeySecret,
VERB + "\n"
+ Content-MD5 + "\n"
+ Content-Type + "\n"
+ Date + "\n"
+ CanonicalizedOSSHeaders
+ CanonicalizedResource))Parameter
Parameter | Tipe | Wajib | Contoh | Deskripsi |
AccessKeyId | String | Ya | LTAI**************** | Pasangan AccessKey dari akun yang ingin Anda gunakan untuk mengakses sumber daya OSS. Pasangan AccessKey terdiri dari ID AccessKey dan rahasia AccessKey.
|
AccessKeySecret | String | Ya | yourAccessKeySecret | |
x-oss-security-token | String | Tidak | CAIS******************************** | Token keamanan yang dikeluarkan oleh STS. Parameter ini diperlukan hanya jika Anda menggunakan STS untuk membangun tanda tangan untuk Header Authorization. Untuk informasi lebih lanjut tentang cara memperoleh token keamanan, lihat AssumeRole. |
VERB | Enumerasi | Ya | PUT | Metode permintaan HTTP, seperti PUT, GET, POST, HEAD, DELETE, atau OPTIONS. |
\n | String | Tidak | \n | Baris baru. |
Content-MD5 | String | Tidak | eB5e******************** | Hash MD5 dari konten yang diminta. Konten pesan (tanpa header) dihitung untuk mendapatkan hash MD5, yang merupakan angka 128-bit. Angka ini dikodekan dalam Base64 untuk menghasilkan nilai Content-MD5. Untuk informasi lebih lanjut, kunjungi RFC 2616 Content-MD5. Header permintaan dapat digunakan untuk memeriksa validitas pesan. Konten pesan valid jika konten pesan yang diterima sama dengan konten yang dikirim. Parameter ini dapat dibiarkan kosong. Untuk informasi lebih lanjut tentang cara menghitung nilai Content-MD5, lihat Perhitungan Content-MD5. |
Content-Type | String | Tidak | application/octet-stream | Jenis konten permintaan. Parameter ini dapat dibiarkan kosong. Catatan Jika Anda tidak menentukan Content-Type saat menghitung tanda tangan, Anda tidak perlu menentukan parameter ini nanti saat mengunggah objek menggunakan tanda tangan. |
Date | String | Ya | Sun, 22 Nov 2015 08:16:38 GMT | Waktu ketika operasi dilakukan. Nilai parameter ini harus dalam UTC. Parameter ini tidak boleh dibiarkan kosong. Nilai parameter ini dihitung dari header Date atau header x-oss-date dari permintaan. Saat kedua header ada pada saat yang sama, x-oss-date memiliki prioritas. Penting Jika selisih antara waktu yang ditentukan oleh header Date dalam permintaan dan waktu di server saat permintaan diterima lebih besar dari 15 menit, OSS akan menolak permintaan dan mengembalikan kode status HTTP 403. |
CanonicalizedOSSHeaders | String | Tidak | x-oss-meta-a:a\nx-oss-meta-b:b\nx-oss-meta-c:c\n | Header HTTP yang diawali dengan
Untuk informasi lebih lanjut tentang cara membuat CanonicalizedOSSHeaders, lihat bagian Pembuatan CanonicalizedOSSHeaders dari topik ini. |
CanonicalizedResource | String | Ya | examplebucket | Sumber daya OSS yang ingin Anda akses. Parameter ini tidak boleh dibiarkan kosong. Untuk informasi lebih lanjut tentang cara membuat CanonicalizedResource, lihat bagian Pembuatan CanonicalizedResource dari topik ini. |
Contoh
Contoh 1 (termasuk semua parameter)
Permintaan
Rumus
String tanda tangan
PUT /nelson HTTP/1.0 Content-MD5: eB5e******************** Content-Type: text/html Date: Wed, 28 Dec 2022 10:27:41 GMT Host: examplebucket.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabra
Signature = base64(hmac-sha1(AccessKeySecret,VERB + "\n" + Content-MD5 + "\n"+ Content-Type + "\n" + Date + "\n" + CanonicalizedOSSHeaders+ CanonicalizedResource))
PUT\n eB5e********************\n text/html\n Wed, 28 Dec 2022 10:27:41 GMT\n x-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/examplebucket/nelson
Jika ID AccessKey adalah LTAI**************** dan rahasia AccessKey adalah yourAccessKeySecret, Anda dapat menjalankan kode Python berikut untuk menghitung tanda tangan.
import hmac import hashlib import base64 h = hmac.new("yourAccessKeySecret".encode('utf-8'), "PUT\nODBGOERFMDMzQTczRUY3NUE3NzA5QzdFNUYzMDQxNEM\ntext/html\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/oss-example/nelson".encode('utf-8'), hashlib.sha1) signature = base64.encodebytes(h.digest()) print(signature)Tanda tangan yang dihitung adalah
J9Nl3b+xdEKNQGWFhhZpjSLm****. Contoh berikut menunjukkan permintaan akhir yang mencakup header Authorization:PUT /nelson HTTP/1.0 Authorization:OSS LTAI****************:J9Nl************************ Content-Md5: eB5e******************** Content-Type: text/html Date: Wed, 28 Dec 2022 10:27:41 GMT Host: oss-example.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabraContoh 2 (tidak termasuk parameter opsional Content-MD5 dan Content-Type)
Permintaan
Rumus
String tanda tangan
PUT /nelson HTTP/1.0 Date: Wed, 28 Dec 2022 09:56:32 GMT Host: examplebucket.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabra
Signature = base64(hmac-sha1(AccessKeySecret,VERB + "\n" + "\n"+ "\n" + Date + "\n" + CanonicalizedOSSHeaders+ CanonicalizedResource))
PUT\n\n\nWed, 28 Dec 2022 09:56:32 GMT\n x-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/examplebucket/nelson
Jika ID AccessKey adalah LTAI**************** dan rahasia AccessKey adalah KZo1**************************, Anda dapat menjalankan kode Python berikut untuk menghitung tanda tangan:
import hmac import hashlib import base64 h = hmac.new("KZo1**************************".encode('utf-8'), "PUT\n\n\nWed, 28 Dec 2022 09:56:32 GMT\nx-oss-meta-magic:abracadabra\nx-oss-meta-author:alice\n/oss-example/nelson".encode('utf-8'), hashlib.sha1) signature = base64.encodebytes(h.digest()) print(signature)Tanda tangan yang dihitung adalah
Mhb1************************. Contoh berikut menunjukkan permintaan akhir yang mencakup header Authorization:PUT /nelson HTTP/1.0 Authorization:OSS LTAI****************:Mhb1************************ Date: Wed, 28 Dec 2022 09:56:32 GMT Host: oss-example.oss-cn-hangzhou.aliyuncs.com x-oss-meta-author: alice x-oss-meta-magic: abracadabra
Informasi tambahan
Jika ID AccessKey yang diimpor tidak ada atau tidak aktif, respons akan mengembalikan 403 Forbidden dengan kode kesalahan InvalidAccessKeyId. Jika ID AccessKey yang diimpor aktif tetapi OSS mendeteksi kesalahan tanda tangan dalam permintaan, respons akan mengembalikan 403 Forbidden dengan string tanda tangan yang benar untuk memverifikasi enkripsi. Anda dapat memeriksa apakah string tanda tangan benar berdasarkan respons.
Contoh respons:
<?xml version="1.0" ?> <Error> <Code> SignatureDoesNotMatch </Code> <Message> Tanda tangan permintaan yang kami hitung tidak sesuai dengan tanda tangan yang Anda berikan. Periksa kunci dan metode penandatanganan Anda. </Message> <StringToSignBytes> 47 45 54 0a 0a 0a 57 65 64 2c 20 31 31 20 4d 61 79 20 32 30 31 31 20 30 37 3a 35 39 3a 32 35 20 47 4d 54 0a 2f 75 73 72 65 61 6c 74 65 73 74 3f 61 63 6c </StringToSignBytes> <RequestId> 1E446260FF9B**** </RequestId> <HostId> oss-cn-hangzhou.aliyuncs.*** </HostId> <SignatureProvided> y5H7yzPsA/tP4+0tH1HHvPEwUv8= </SignatureProvided> <StringToSign> GET Wed, 11 May 2011 07:59:25 GMT /examplebucket?acl </StringToSign> <OSSAccessKeyId> AKIAIVAKMSMOY7VO**** </OSSAccessKeyId> </Error>Jika format nilai Authorization dalam permintaan tidak valid, respons akan mengembalikan 400 Bad Request dengan kode kesalahan InvalidArgument.
Tanggal dan waktu dalam semua permintaan OSS harus dalam UTC sesuai spesifikasi HTTP/1.1. Format tanggal adalah sebagai berikut:
date1 = 2DIGIT SP month SP 4DIGIT; day month year (contohnya, 02 Jun 1982)CatatanDalam format tanggal di atas,
dayharus menggunakan dua digit. Oleh karena itu,Jun 2,2 Jun 1982, dan2-Jun-1982semuanya merupakan format tanggal yang tidak valid.Jika header Date tidak ditentukan atau dalam format yang tidak valid dalam permintaan yang ditandatangani, respons akan mengembalikan 403 Forbidden dengan kode kesalahan AccessDenied.
Jika selisih antara waktu yang ditentukan oleh header Date dalam permintaan dan waktu server saat permintaan diterima melebihi 15 menit, respons akan mengembalikan 403 Forbidden dengan kode kesalahan RequestTimeTooSkewed.
Pembuatan CanonicalizedOSSHeaders
Semua header HTTP yang diawali dengan x-oss- disebut CanonicalizedOSSHeaders. Anda dapat melakukan langkah-langkah berikut untuk membuat CanonicalizedOSSHeaders:
Ubah nama semua header permintaan HTTP yang diawali dengan
x-oss-menjadi huruf kecil. Contohnya, ubahX-OSS-Meta-Name: TaoBaomenjadix-oss-meta-name: TaoBao.Jika permintaan dikirim menggunakan kredensial akses sementara yang diperoleh dari STS, tambahkan nilai security-token yang diperoleh ke string tanda tangan dalam format
x-oss-security-token:security-token.CatatanUntuk informasi lebih lanjut tentang cara mengonfigurasi STS, lihat Gunakan kredensial akses sementara yang disediakan oleh STS untuk mengakses OSS. Anda dapat memanggil operasi AssumeRole atau menggunakan SDK STS untuk berbagai bahasa pemrograman untuk mendapatkan kredensial akses sementara. Kredensial akses sementara mencakup token keamanan dan pasangan AccessKey sementara. Pasangan AccessKey terdiri dari ID AccessKey dan rahasia AccessKey.
Urutkan semua header permintaan HTTP secara alfabetis.
Hapus semua spasi di setiap sisi pembatas antara setiap header dan nilai headernya. Contohnya, ubah
x-oss-meta-name: TaoBaomenjadix-oss-meta-name:TaoBao.Pisahkan semua header dengan pembatas
\nuntuk membuat CanonicalizedOSSHeaders.
Pembuatan CanonicalizedResource
Sumber daya OSS yang diperlukan dalam permintaan disebut CanonicalizedResource. Anda dapat melakukan operasi berikut untuk membangun CanonicalizedResource:
Jika sumber daya mencakup bucket dan objek, atur CanonicalizedResource ke /BucketName/ObjectName.
Jika sumber daya mencakup bucket, atur CanonicalizedResource ke /BucketName/.
Jika sumber daya tidak mencakup bucket atau objek, atur CanonicalizedResource ke garis miring maju (/).
Jika sumber daya mencakup subresource, urutkan semua subresource secara alfabetis dan pisahkan dengan ampersand (
&). Tambahkan tanda tanya (?) dan string subresource di akhir string CanonicalizedResource. CanonicalizedResource yang dibuat dalam format berikut:/BucketName/ObjectName?acl&uploadId=UploadId.OSS mendukung jenis subresource berikut:
Pengidentifikasi sumber daya, seperti acl, uploads, location, cors, logging, website, referer, lifecycle, delete, append, tagging, objectMeta, uploadId, partNumber, security-token, position, img, style, styleName, replication, replicationProgress, replicationLocation, cname, bucketInfo, comp, qos, live, status, vod, startTime, endTime, symlink, x-oss-process, callback, dan callback-var. Untuk informasi lebih lanjut, lihat PutBucket dan PutObject.
PentingPengidentifikasi sumber daya bersifat peka huruf besar-kecil.
Header respons, seperti response-content-language, response-expires, response-cache-control, response-content-disposition, dan response-content-encoding. Untuk informasi lebih lanjut, lihat GetObject.
Mode implementasi pemrosesan gambar (IMG), seperti
x-oss-process. Untuk informasi lebih lanjut, lihat Ikhtisar.Bidang kontrol akses yang dimulai dengan
x-oss-ac-*, seperti x-oss-ac-source-ip, x-oss-ac-subnet-mask, x-oss-ac-vpc-id, dan x-oss-ac-forward-allow. Untuk informasi lebih lanjut, lihat Buat URL yang ditandatangani menggunakan tanda tangan V1.CatatanSetelah menggunakan CanonicalizedResource yang berisi x-oss-ac-source-ip untuk menghasilkan tanda tangan, hapus x-oss-ac-source-ip dari parameter kueri dalam permintaan untuk mencegah kebocoran alamat IP.
Aturan perhitungan tanda tangan
String tanda tangan yang digunakan untuk menghitung tanda tangan harus dikodekan dalam
UTF-8. String tanda tangan yang berisi karakter Cina harus dikodekan dalamUTF-8. String tanda tangan yang telah dikodekan digunakan bersama dengan parameterAccessKeySecretuntuk menghitung string tanda tangan akhir.Metode HMAC-SHA1 yang ditentukan dalam RFC 2104 digunakan untuk menghitung tanda tangan. Dalam metode ini, Key menunjukkan rahasia AccessKey.
Content-TypedanContent-MD5dapat tidak ditentukan dalam permintaan. Namun, jika OSS perlu memverifikasi tanda tangan permintaan dan nilai kedua header tersebut kosong, ganti nilai kosong dengan baris baru (\n).Header HTTP non-standar yang diawali dengan
x-oss-harus ditambahkan ke string tanda tangan. Header HTTP non-standar lainnya diabaikan oleh OSS. Misalnya, header x-oss-meta-magic dalam contoh tanda tangan berikut harus disertakan dalam string tanda tangan.CatatanHeader yang diawali dengan
x-oss-dalam string tanda tangan harus mematuhi konvensi berikut:Nama header harus dalam huruf kecil.
Header harus diurutkan secara alfabetis.
Tidak ada spasi sebelum atau sesudah titik dua (:) yang memisahkan setiap nama header dan nilainya.
Setiap header diikuti oleh baris baru (\n). Jika tidak ada header yang ditentukan, biarkan CanonicalizedOSSHeaders kosong.
Perhitungan Content-MD5
Dalam contoh berikut, string "123456789" digunakan untuk menunjukkan cara menghitung nilai Content-MD5 dari konten permintaan.
Perhitungan yang Benar
Hitung hash MD5 dari string, yang merupakan larik biner 128-bit.
Kodekan larik biner (bukan string 32-bit) dalam Base64.
Kode Python berikut memberikan contoh cara menghitung nilai Content-MD5:
>>> import base64,hashlib >>> hash = hashlib.md5() >>> hash.update("0123456789") // Jika Anda menggunakan Python 3, ubah baris ini menjadi hash.update(b"0123456789"). >>> base64.b64encode(hash.digest()) 'eB5e********************'Panggil hash.digest() untuk menghitung larik biner 128-bit.
>>> hash.digest() 'x\x1e^$]i\xb5f\x97\x9b\x86\xe2\x8d#\xf2\xc7'Perhitungan yang Salah
CatatanOperasi salah umum adalah mengkodekan string MD5 32-bit yang dihitung dalam Base64 untuk mendapatkan nilai Content-MD5.
# Panggil hash.hexdigest() untuk mendapatkan string teks biasa 32-bit. >>> hash.hexdigest() '781e5e245d69b566979b86e28d23f2c7' # Contoh kode berikut memberikan hasil pengkodean hash MD5 yang salah dalam Base64: >>> base64.b64encode(hash.hexdigest()) 'NzgxZTVlMjQ1ZDY5YjU2Njk3OWI4NmUyOGQyM2YyYzc='