All Products
Search
Document Center

API Gateway:Plug-in tanda tangan backend

Last Updated:Jun 28, 2025

Tanda tangan backend (sebelumnya dikenal sebagai kunci tanda tangan) adalah pasangan kunci-rahasia yang Anda buat dan terbitkan ke API Gateway. Pasangan ini berfungsi seperti akun-kata sandi. Setelah plug-in tanda tangan backend diikat ke API, API Gateway menggunakan pasangan kunci-rahasia untuk menandatangani permintaan yang ditujukan ke layanan backend Anda. Layanan backend juga melakukan enkripsi simetris pada permintaan yang diterima. API Gateway lulus autentikasi jika tanda tangan di API Gateway sesuai dengan yang ada di layanan backend.

1. Ikhtisar

Tanda tangan backend (sebelumnya dikenal sebagai kunci tanda tangan) adalah pasangan kunci-rahasia yang Anda buat dan terbitkan ke API Gateway. API Gateway menggunakan pasangan kunci-rahasia untuk menandatangani permintaan yang ditujukan untuk layanan backend Anda. Layanan backend Anda juga melakukan enkripsi simetris pada permintaan yang diterima. API Gateway lulus autentikasi jika tanda tangan di API Gateway konsisten dengan yang ada di layanan backend. Jika layanan backend Anda diakses melalui virtual private cloud (VPC), Anda tidak perlu menggunakan tanda tangan backend karena saluran transmisi aman.

Fitur kunci tanda tangan asli telah diintegrasikan ke dalam sistem plug-in. Antarmuka kunci tanda tangan asli dan antarmuka UI konsol tetap digunakan. Fitur kunci tanda tangan asli dan plug-in tanda tangan backend memiliki tipe plug-in yang sama dan tunduk pada batasan pengikatan dari tipe tersebut.

Saat Anda membuat atau memodifikasi kunci di antarmuka kunci tanda tangan asli atau konsol, modifikasi data disinkronkan ke sistem plug-in. Namun, modifikasi yang Anda buat di sistem plug-in tidak dapat disinkronkan ke antarmuka kunci tanda tangan asli atau konsol.

2. Pengikatan plug-in

Setelah mengikat pasangan kunci-rahasia ke API, API Gateway menambahkan pasangan tersebut ke semua permintaan terkait yang dikirim ke layanan backend Anda. Layanan backend melakukan perhitungan simetris untuk mengurai informasi tanda tangan dan mengotentikasi API Gateway.

Jika Anda ingin mengganti pasangan tersebut, Anda dapat memodifikasi kunci dan rahasia di plug-in tanda tangan backend yang diikat ke API. Modifikasi tersebut berlaku segera.

3. Konfigurasi plug-in

Anda dapat mengonfigurasi plug-in Anda dalam format JSON atau YAML. Kedua format memiliki skema yang sama. Anda dapat menggunakan alat konversi untuk mengubah format konfigurasi. Kode berikut adalah template konfigurasi untuk YAML.

---
type: APIGW_BACKEND
key: SampleKey
secret: SampleSecret
                        

4. Pembacaan tanda tangan

Tanda tangan disimpan di header X-Ca-Proxy-Signature dari permintaan.

5. Perhitungan tanda tangan backend

Untuk demo dalam JAVA untuk perhitungan tanda tangan, kunjungi https://github.com/aliyun/api-gateway-demo-sign-backend-java.

Item berikut menjelaskan proses lengkap perhitungan tanda tangan:

  1. API Gateway mengekstraksi data dari permintaan HTTP yang dikirim ke layanan backend dan menggabungkan data menjadi string tanda tangan. Contoh berikut menunjukkan format string tanda tangan yang dihasilkan:

    HTTPMethod
    Content-MD5
    Headers
    PathAndParameters

    Dalam contoh sebelumnya, keempat bidang membentuk seluruh string tanda tangan dan dipisahkan dengan \n. Jika bidang Headers dibiarkan kosong, \n tidak diperlukan. Jika bidang lain dibiarkan kosong, \n harus tetap dipertahankan. Tanda tangan bersifat peka huruf besar-kecil. Ekstraksi data untuk setiap bidang mengikuti aturan berikut:

    • HTTPMethod: metode HTTP yang digunakan untuk mengirim permintaan, seperti POST. Nilai bidang ini dalam huruf besar.

    • Content-MD5: nilai Content-MD5 yang diperoleh dari header yang sesuai dalam permintaan yang dikirim oleh klien. Jika klien tidak melewati header Content-MD5, nilai Content-MD5 dibiarkan kosong dalam string tanda tangan. Klien hanya menghitung dan mentransmisikan header Content-MD5 ketika permintaan memiliki body dan body tersebut bukan formulir. Kode berikut menunjukkan cara nilai Content-MD5 dihitung dalam JAVA:

    String content-MD5 = Base64.encodeBase64(MD5(bodyStream.getbytes("UTF-8")));

    • Headers: kunci dan nilai semua header yang terlibat dalam perhitungan tanda tangan. Kunci dibaca dari header permintaan dan dalam format X-Ca-Proxy-Signature-Headers. Beberapa kunci dipisahkan dengan koma (,). Kunci yang terlibat dalam perhitungan tanda tangan diurutkan secara alfabetis, diubah menjadi huruf kecil, dan kemudian digabungkan berdasarkan aturan berikut:

    String headers = HeaderKey1.toLowerCase() + ":" + HeaderValue1 +"\n"+
     HeaderKey2.toLowerCase() + ":" + HeaderValue2 +"\n"+
     ... +
    HeaderKeyN.toLowerCase() + ":" + HeaderValueN + "\n"

    • PathAndParameters

    Bidang ini berisi semua parameter di bagian Path, Query, dan Form. Jika parameter Query atau Form ada, tanda tanya (?) ditambahkan. Kunci parameter Query dan Form kemudian diurutkan secara alfabetis dan digabungkan berdasarkan aturan berikut. Jika tidak ada parameter Query atau Form, PathAndParameters diatur ke Path.

    String PathAndParameters =
     Path +
     "?" +
     Key1 + "=" + Value1 
    + "&" + Key2 + "=" + Value2 +
     ... 
    "&" + KeyN + "=" + ValueN

    Note: Parameter Query atau Form mungkin memiliki beberapa nilai. Jika demikian, hanya nilai pertama yang digunakan untuk perhitungan tanda tangan. Selama parameter dilewatkan, tanda sama dengan (=) harus dipertahankan selama perhitungan tanpa memandang situasi. Sebagai contoh, jika format dua parameter Query adalah "path?a=&b", mereka harus ditulis sebagai "path?a=&b=" dalam tanda tangan.

  2. Kemudian tanda tangan dihitung. Potongan kode berikut memberikan contoh.

Mac hmacSha256 = Mac.getInstance("HmacSHA256");
byte[] keyBytes = secret.getBytes("UTF-8");  //Nilai rahasia adalah rahasia dalam kunci tanda tangan yang diikat ke API.
hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
String sign = new String(Base64.encodeBase64(Sha256.doFinal(stringToSign.getBytes("UTF-8")),"UTF-8"));

Pertama, array Byte diperoleh setelah StringToSign di-dekode UTF-8. Array Byte kemudian dienkripsi dan di-enkode Base64 untuk menghasilkan tanda tangan akhir.

6. Mode Debug

Untuk mengakses dan men-debug tanda tangan backend secara efisien, Anda dapat mengaktifkan mode Debug. Prosedur debugging adalah dengan menambahkan X-Ca-Request-Mode = debug sebagai header permintaan yang dikirim ke API Gateway.

Layanan backend kemudian dapat membaca header X-Ca-Proxy-Signature-String-To-Sign di header HTTP. Baris baru diganti dengan tanda pagar (#) di header HTTP karena header HTTP tidak mengizinkan baris baru.

Catatan: X-Ca-Proxy-Signature-String-To-Sign tidak terlibat dalam perhitungan tanda tangan backend.

7. Verifikasi timestamp

Jika layanan backend Anda perlu memverifikasi timestamp permintaan, Anda dapat mengatur CaRequestHandleTime ke Waktu Rata-rata Greenwich (GMT) ketika API Gateway menerima permintaan dalam definisi API.