Anda harus menandatangani semua permintaan API untuk memastikan keamanan. Alibaba Cloud menggunakan tanda tangan permintaan untuk memverifikasi identitas pemanggil API. Oleh karena itu, setiap permintaan API harus mencakup informasi tanda tangan, baik dikirim melalui HTTP maupun HTTPS.
Ikhtisar
Anda harus menambahkan tanda tangan ke permintaan API Message Queue for Apache RocketMQ dalam format berikut:
https://Endpoint/?SignatureVersion=1.0&SignatureMethod=HMAC-SHA1&Signature=CT9X0VtwR86fNWSnsc6v8YGOjuE%3D&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf- Endpoint: ApsaraMQ for MQTT alamat akses layanan [******] adalah onsmqtt.[regionId].aliyuncs.com.[regionId], lihat Endpoint.
- SignatureMethod: Metode enkripsi string tanda tangan. Atur nilainya menjadi HMAC-SHA1.
- SignatureVersion: Versi algoritma enkripsi tanda tangan. Atur nilainya menjadi 1.0.
- SignatureNonce: Nomor acak unik yang digunakan untuk mencegah serangan replay. Gunakan nomor acak berbeda untuk setiap permintaan. Direkomendasikan menggunakan pengenal unik universal (UUID).
- Signature: Tanda tangan yang dihasilkan setelah permintaan dienkripsi secara simetris menggunakan Rahasia AccessKey.
Signature = Base64( HMAC-SHA1( AccessSecret, UTF-8-Encoding-Of(
StringToSign)) )1 Susun dan enkode string-to-sign
- Buat string kueri kanonis dengan mengatur parameter permintaan.
- Atur parameter permintaan (termasuk semua parameter umum dan operasi tertentu, kecuali Signature) dalam urutan abjad. Catatan Saat menggunakan metode GET untuk mengirimkan permintaan, parameter ini membentuk bidang parameter URI permintaan. Mereka ditempatkan setelah tanda tanya (?) dalam URI permintaan dan dihubungkan oleh ampersand (&).
- Enkode nama dan nilai setiap parameter permintaan. Nama dan nilai harus di-enkode URL menggunakan set karakter UTF-8. Untuk detail lebih lanjut tentang aturan enkode, lihat tabel berikut.
Karakter Aturan enkode A hingga Z, a hingga z, 0 hingga 9, tanda hubung (-), garis bawah (_), titik (.), dan tilde (~) Karakter-karakter ini tidak perlu di-enkode Karakter lainnya Karakter-karakter ini harus di-enkode persen dalam format %XY.XYmewakili kode ASCII dari karakter dalam notasi heksadesimal. Sebagai contoh, tanda kutip ganda (") di-enkode sebagai%22.Karakter UTF-8 yang diperluas Karakter-karakter ini di-enkode dalam format %XY%ZA….Karakter spasi Spasi harus di-enkode sebagai %20. Jangan enkode spasi sebagai tanda tambah (+).Metode enkode ini berbeda dari algoritma enkode MIMEapplication/x-www-form-urlencoded(seperti kelasjava.net.URLEncoderyang disediakan oleh pustaka standar Java). Anda dapat meng-enkode spasi berdasarkan aturan enkode untuk pustaka standar, lalu mengganti tanda tambah (+) dalam string yang di-enkode dengan%20, tanda bintang (*) dengan%2A, dan%7Edengan tilde (~). Untuk melakukan ini, Anda dapat menggunakan metodepercentEncodeberikut:private static final String ENCODING = "UTF-8"; private static String percentEncode(String value) throws UnsupportedEncodingException { return value != null ? URLEncoder.encode(value, ENCODING).replace("+", "%20").replace("*", "%2A").replace("%7E", "~") : null; } - Hubungkan nama parameter yang di-enkode dan nilainya menggunakan tanda sama dengan (=).
- Urutkan pasangan nama parameter dan nilai sesuai dengan urutan yang ditentukan dalam langkah 1.1.1 dan hubungkan pasangan tersebut menggunakan ampersand (&) untuk menghasilkan string kueri kanonis.
- Atur parameter permintaan (termasuk semua parameter umum dan operasi tertentu, kecuali Signature) dalam urutan abjad.
- Buat string-to-sign dari string kueri kanonis yang di-enkode. Langkah-langkah untuk membuat string-to-sign adalah sebagai berikut:
StringToSign= HTTPMethod + “&” + percentEncode(“/”) + ”&” + percentEncode(CanonicalizedQueryString)Dalam aturan sebelumnya,
- HTTPMethod: Metode HTTP yang digunakan untuk membuat permintaan, seperti GET.
- percentEncode(“/”): Enkode garis miring (/) sebagai %2F berdasarkan aturan enkode URL yang dijelaskan dalam langkah 1.1.2.
- percentEncode(CanonicalizedQueryString): String ini adalah hasil dari aturan enkode URL yang dijelaskan dalam langkah i.
Langkah 2: Hitung string tanda tangan
- Hitung nilai HMAC dari string-to-sign sesuai definisi dalam RFC2104. Catatan Kunci yang digunakan untuk menghitung tanda tangan adalah Rahasia AccessKey Anda diikuti oleh ampersand (&). Algoritma SHA1 digunakan untuk perhitungan ini.
- Enkode nilai HMAC dalam Base64 untuk mendapatkan string tanda tangan.
- Tambahkan string tanda tangan ke permintaan sebagai parameter Signature. Catatan Saat menambahkan string tanda tangan ke permintaan sebagai parameter Signature, parameter tersebut harus di-enkode URL seperti parameter lainnya berdasarkan aturan yang didefinisikan dalam RFC3986.
Contoh
Contoh ini menunjukkan cara menandatangani permintaan API untuk memanggil operasi DescribeRegions. Asumsikan bahwa nilai parameter AccessKeyId adalah testid dan nilai parameter AccessKeySecret adalah testsecret. URL permintaan yang akan ditandatangani adalah sebagai berikut:
http://ecs.aliyuncs.com/?Timestamp=2016-02-23T12%3A46:24Z&Format=XML&AccessKeyId=testid&Action=DescribeRegions&SignatureMethod=HMAC-SHA1&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&Version=2014-05-26&SignatureVersion=1.0String tanda tangan yang dihitung menggunakan testsecret& adalah sebagai berikut:
OLeaidS1JvxuMvnyHOwuJ+uX5qY=Tambahkan string tanda tangan ke permintaan sebagai parameter Signature. URL permintaan yang ditandatangani adalah sebagai berikut:
http://ecs.aliyuncs.com/?SignatureVersion=1.0&Action=DescribeRegions&Format=XML&SignatureNonce=3ee8c1b8-83d3-44af-a94f-4e0ad82fd6cf&Version=2014-05-26&AccessKeyId=testid&Signature=OLeaidS1JvxuMvnyHOwuJ+uX5qY=&SignatureMethod=HMAC-SHA1&Timestamp=2016-02-23T12%3A46%3A24Z