Anda sedang melihat dokumentasi Apigee Edge.
Buka dokumentasi
Apigee X. info
Apa
Memverifikasi tanda tangan pada JWS yang diterima dari klien atau sistem lain. Kebijakan ini juga mengekstrak header ke dalam variabel konteks sehingga kebijakan atau kondisi berikutnya dapat memeriksa nilai tersebut untuk membuat keputusan otorisasi atau perutean. Lihat Ringkasan kebijakan JWS dan JWT untuk pengantar mendetail.
Jika JWS diverifikasi dan valid, permintaan akan diizinkan untuk dilanjutkan. Jika tanda tangan JWS tidak dapat diverifikasi atau jika JWS tidak valid karena beberapa jenis error, semua pemrosesan akan berhenti dan error akan ditampilkan dalam respons.
Untuk mempelajari bagian-bagian JWS serta cara mengenkripsi dan menandatanganinya, lihat RFC7515.
Video
Tonton video pendek untuk mempelajari cara memverifikasi tanda tangan pada JWS. Meskipun video ini secara khusus membahas cara memverifikasi JWT, banyak konsepnya yang sama dengan JWS.
Contoh
- Memverifikasi JWS terlampir yang ditandatangani dengan algoritma HS256
- Memverifikasi JWS terpisah yang ditandatangani dengan algoritma RS256
Memverifikasi JWS terlampir yang ditandatangani dengan algoritma HS256
Kebijakan contoh ini memverifikasi JWS terlampir yang ditandatangani dengan algoritma enkripsi HS256, HMAC
menggunakan checksum SHA-256. JWS diteruskan dalam permintaan proxy menggunakan parameter formulir bernama
JWS. Kunci dimuat dalam variabel bernama private.secretkey.
JWS terlampir berisi header, payload, dan tanda tangan yang dienkode:
header.payload.signature
Konfigurasi kebijakan mencakup informasi yang diperlukan Edge untuk mendekode dan mengevaluasi JWS,
seperti tempat menemukan JWS (dalam flow variable yang ditentukan dalam elemen <Source>),
algoritma penandatanganan yang diperlukan, dan tempat menemukan kunci rahasia (disimpan dalam flow variable Edge, yang dapat
diambil dari KVM Edge, misalnya).
<VerifyJWS name="JWS-Verify-HS256">
<DisplayName>JWS Verify HS256</DisplayName>
<Algorithm>HS256</Algorithm>
<Source>request.formparam.JWS</Source>
<IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables>
<SecretKey>
<Value ref="private.secretkey"/>
</SecretKey>
</VerifyJWS>Kebijakan menulis outputnya ke variabel konteks sehingga kebijakan atau kondisi berikutnya di proxy API dapat memeriksa nilai tersebut. Lihat Variabel alur untuk mengetahui daftar variabel yang ditetapkan oleh kebijakan ini.
Memverifikasi JWS terpisah yang ditandatangani dengan algoritma RS256
Contoh kebijakan ini memverifikasi JWS terpisah yang ditandatangani dengan algoritma RS256. Untuk memverifikasi,
Anda harus memberikan kunci publik. JWS diteruskan dalam permintaan proxy menggunakan parameter formulir
bernama JWS. Kunci publik terdapat dalam variabel bernama public.publickey.
JWS yang terlepas menghilangkan payload dari JWS:
header..signature
Anda yang harus meneruskan payload ke kebijakan VerifyJWS dengan menentukan nama variabel yang berisi payload ke elemen
<DetachedContent>. Konten yang ditentukan dalam <DetachedContent>
harus dalam bentuk asli yang tidak dienkode seperti saat tanda tangan JWS dibuat.
<VerifyJWS name="JWS-Verify-RS256"> <DisplayName>JWS Verify RS256</DisplayName> <Algorithm>RS256</Algorithm> <Source>request.formparam.JWS</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <PublicKey> <Value ref="public.publickey"/> </PublicKey> <DetachedContent>private.payload</DetachedContent> </VerifyJWS>
Kebijakan menulis outputnya ke variabel konteks sehingga kebijakan atau kondisi berikutnya di proxy API dapat memeriksa nilai tersebut. Lihat Variabel alur untuk mengetahui daftar variabel yang ditetapkan oleh kebijakan ini.
Menetapkan elemen utama
Elemen yang Anda gunakan untuk menentukan kunci yang digunakan untuk memverifikasi JWS bergantung pada algoritma yang dipilih, seperti yang ditunjukkan dalam tabel berikut:
| Algoritma | elemen utama | |
|---|---|---|
| HS* |
<SecretKey> <Value ref="private.secretkey"/> </SecretKey> |
|
| RS*, ES*, PS* | <PublicKey> <Value ref="rsa_public_key"/> </PublicKey> atau: <PublicKey> <JWKS ref="jwks_val_ref_or_url"/> </PublicKey> |
|
| *Untuk mengetahui informasi selengkapnya tentang persyaratan utama, lihat Tentang algoritma enkripsi tanda tangan. | ||
Referensi elemen
Referensi kebijakan menjelaskan elemen dan atribut kebijakan Verifikasi JWS.
Catatan: Konfigurasi akan sedikit berbeda, bergantung pada algoritma enkripsi yang Anda gunakan. Lihat Contoh untuk contoh yang menunjukkan konfigurasi untuk kasus penggunaan tertentu.
Atribut yang berlaku untuk elemen tingkat teratas
<VerifyJWS name="JWS" continueOnError="false" enabled="true" async="false">
Atribut berikut bersifat umum untuk semua elemen induk kebijakan.
| Atribut | Deskripsi | Default | Kehadiran |
|---|---|---|---|
| nama |
Nama internal kebijakan. Karakter yang dapat Anda gunakan dalam nama dibatasi untuk:
A-Z0-9._\-$ %. Namun, UI pengelolaan Edge menerapkan batasan tambahan, seperti menghapus karakter yang bukan alfanumerik secara otomatis.
Secara opsional, gunakan elemen |
T/A | Wajib |
| continueOnError |
Setel ke false untuk menampilkan error saat kebijakan gagal. Hal ini adalah perilaku yang diharapkan untuk sebagian besar kebijakan.
Setel ke |
false | Opsional |
| diaktifkan |
Setel ke true untuk menerapkan kebijakan.
Setel ke |
true | Opsional |
| asinkron | Atribut ini tidak digunakan lagi. | false | Tidak digunakan lagi |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
Gunakan selain atribut nama untuk memberi label kebijakan di editor proxy UI pengelolaan dengan nama bahasa alami yang berbeda.
| Default | Jika Anda menghapus elemen ini, nilai atribut nama kebijakan akan digunakan. |
| Kehadiran | Opsional |
| Jenis | String |
<Algorithm>
<Algorithm>HS256</Algorithm>
Menentukan algoritma enkripsi untuk menandatangani token. Algoritma RS*/PS*/ES* menggunakan pasangan kunci publik/rahasia, sedangkan algoritma HS* menggunakan rahasia bersama. Lihat juga Tentang algoritma enkripsi tanda tangan.
Anda dapat menentukan beberapa nilai yang dipisahkan dengan koma. Misalnya, "HS256, HS512" atau "RS256, PS256". Namun, Anda tidak dapat menggabungkan algoritma HS* dengan algoritma lainnya atau algoritma ES* dengan algoritma lainnya karena algoritma tersebut memerlukan jenis kunci tertentu. Anda dapat menggabungkan algoritma RS* dan PS*.
| Default | T/A |
| Kehadiran | Wajib |
| Jenis | String nilai yang dipisahkan koma |
| Nilai yang valid | HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512 |
<AdditionalHeaders/Claim>
<AdditionalHeaders> <Claim name='claim1'>explicit-value-of-claim-here</Claim> <Claim name='claim2' ref='variable-name-here'/> <Claim name='claim3' ref='variable-name-here' type='boolean'/> <Claim name='claim4' ref='variable-name' type='string' array='true'/> </AdditionalHeaders>
Memvalidasi bahwa header JWS berisi pasangan nilai/nama klaim tambahan yang ditentukan dan nilai klaim yang ditegaskan cocok.
Klaim tambahan menggunakan nama yang bukan salah satu nama klaim JWS standar yang terdaftar. Nilai klaim tambahan dapat berupa string, angka, boolean, peta, atau array. Peta hanyalah sekumpulan pasangan nama/nilai. Nilai untuk klaim dari salah satu jenis ini dapat ditentukan secara eksplisit dalam konfigurasi kebijakan, atau secara tidak langsung melalui referensi ke flow variable.
| Default | T/A |
| Kehadiran | Opsional |
| Jenis |
String (default), angka, boolean, atau peta. Jenis defaultnya adalah String jika tidak ada jenis yang ditentukan. |
| Array | Tetapkan ke true untuk menunjukkan apakah nilai adalah array jenis. Default: false |
| Nilai yang valid | Nilai apa pun yang ingin Anda gunakan untuk klaim tambahan. |
Elemen <Claim> menggunakan atribut berikut:
- name - (Wajib) Nama klaim.
- ref - (Opsional) Nama flow variable. Jika ada, kebijakan akan menggunakan nilai variabel ini sebagai klaim. Jika atribut ref dan nilai klaim eksplisit ditentukan, nilai eksplisit adalah nilai default, dan digunakan jika flow variable yang dirujuk tidak terselesaikan.
- type - (Opsional) Salah satu dari: string (default), angka, boolean, atau peta
- array - (Opsional) Tetapkan ke true untuk menunjukkan apakah nilai adalah array jenis. Default: false.
<DetachedContent>
<DetachedContent>variable-name-here</DetachedContent>
JWS yang dibuat dengan payload konten berbentuk:
header.payload.signature
Jika Anda menggunakan kebijakan GenerateJWS untuk membuat payload terpisah, JWS yang dihasilkan akan menghilangkan payload dan berbentuk:
header..signature
Untuk payload yang terpisah, Anda dapat meneruskan payload ke kebijakan VerifyJWS menggunakan elemen
<DetachedContent>. Payload konten yang ditentukan harus dalam
bentuk asli yang tidak dienkode seperti saat tanda tangan JWS dibuat.
Kebijakan menampilkan error jika:
<DetachedContent>ditentukan saat JWS tidak berisi payload konten terpisah (kode kesalahan adalahsteps.jws.ContentIsNotDetached).<DetachedContent>dihilangkan dan JWS memiliki payload konten yang terpisah (kode error adalahsteps.jws.InvalidSignature).
| Default | N/A |
| Kehadiran | Opsional |
| Jenis | Referensi variabel |
<IgnoreCriticalHeaders>
<IgnoreCriticalHeaders>true|false</IgnoreCriticalHeaders>
Disetel ke salah (false) jika Anda ingin kebijakan menampilkan error saat header apa pun yang tercantum dalam header
crit JWS tidak tercantum dalam elemen <KnownHeaders>.
Setel ke benar (true) agar kebijakan VerifyJWS mengabaikan header crit.
Salah satu alasan untuk menyetel elemen ini ke benar (true) adalah jika Anda berada di lingkungan pengujian dan Anda tidak ingin kebijakan gagal karena header tidak ada.
| Default | false |
| Kehadiran | Opsional |
| Jenis | Boolean |
| Nilai yang valid | benar atau salah |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
Setel ke salah (false) jika Anda ingin kebijakan menampilkan error saat variabel yang dirujuk yang ditentukan dalam kebijakan tidak dapat diselesaikan. Setel ke benar (true) untuk memperlakukan variabel yang tidak dapat diselesaikan sebagai string kosong (null).
| Default | false |
| Kehadiran | Opsional |
| Jenis | Boolean |
| Nilai yang valid | benar atau salah |
<KnownHeaders>
<KnownHeaders>a,b,c</KnownHeaders> or: <KnownHeaders ref=’variable_containing_headers’/>
Kebijakan GenerateJWS menggunakan elemen <CriticalHeaders> untuk mengisi header
crit dalam token. Contoh:
{
“typ: “...”,
“alg” : “...”,
“crit” : [ “a”, “b”, “c” ],
}Kebijakan VerifyJWS memeriksa header crit di JWS, jika ada, dan untuk setiap item yang tercantum, kebijakan ini memeriksa apakah elemen <KnownHeaders> juga mencantumkan header tersebut. Elemen
<KnownHeaders> dapat berisi superset item yang tercantum dalam crit.
Semua header yang tercantum di crit harus tercantum dalam
elemen <KnownHeaders>. Header apa pun yang ditemukan kebijakan di crit
yang tidak tercantum juga di <KnownHeaders> akan menyebabkan kebijakan VerifyJWS gagal.
Anda dapat secara opsional mengonfigurasi kebijakan VerifyJWS untuk mengabaikan header crit dengan
menyetel elemen <IgnoreCriticalHeaders> ke true.
| Default | T/A |
| Kehadiran | Opsional |
| Jenis | Array string yang dipisahkan koma |
| Nilai yang valid | Array atau nama variabel yang berisi array. |
<PublicKey/JWKS>
<!-- Specify the JWKS. --> <PublicKey> <JWKS>jwks-value-here</JWKS> </PublicKey> or: <!-- Specify a variable containing the JWKS. --> <PublicKey> <JWKS ref="public.jwks"/> </PublicKey> or: <!-- Specify a public URL that returns the JWKS. The URL is static, meaning you cannot set it using a variable. --> <PublicKey> <JWKS uri="jwks-url"/> </PublicKey>
Menentukan nilai dalam format JWKS (RFC 7517) yang berisi serangkaian kunci publik. Gunakan hanya jika algoritma adalah salah satu dari RS256/RS384/RS512, PS256/PS384/PS512, atau ES256/ES384/ES512.
Jika JWS masuk memiliki ID kunci yang ada dalam set JWKS, kebijakan akan menggunakan kunci publik yang benar untuk memverifikasi tanda tangan JWS. Untuk mengetahui detail tentang fitur ini, lihat Menggunakan Kumpulan Kunci Web JSON (JWKS) untuk memverifikasi JWS.
Jika Anda mengambil nilai dari URL publik, Edge akan meng-cache JWKS selama 300 detik. Saat masa berlaku cache berakhir, Edge akan mengambil JWKS lagi.
| Default | T/A |
| Kehadiran | Untuk memverifikasi JWS menggunakan algoritma RSA, Anda harus menggunakan elemen JWKS atau Value. |
| Jenis | String |
| Nilai yang valid | Variabel alur, nilai string, atau URL. |
<PublicKey/Value>
<PublicKey> <Value ref="public.publickey"/> </PublicKey> -or- <PublicKey> <Value> -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw2kPrRzcufvUNHvTH/WW Q0UrCw5c0+Y707KX3PpXkZGbtTT4nvU1jC0d1lHV8MfUyRXmpmnNxJHAC2F73IyN C5TBtXMORc+us7A2cTtC4gZV256bT4h3sIEMsDl0Joz9K9MPzVPFxa1i0RgNt06n Xn/Bs2UbbLlKP5Q1HPxewUDEh0gVMqz9wdIGwH1pPxKvd3NltYGfPsUQovlof3l2 ALvO7i5Yrm96kknfFEWf1EjmCCKvz2vjVbBb6mp1ZpYfc9MOTZVpQcXSbzb/BWUo ZmkDb/DRW5onclGzxQITBFP3S6JXd4LNESJcTp705ec1cQ9Wp2Kl+nKrKyv1E5Xx DQIDAQAB -----END PUBLIC KEY----- </Value> </PublicKey>
Menentukan kunci publik yang digunakan untuk memverifikasi tanda tangan pada JWS. Gunakan atribut ref untuk meneruskan kunci dalam flow variable, atau tentukan kunci berenkode PEM secara langsung. Gunakan hanya jika algoritmanya adalah salah satu dari RS256/RS384/RS512, PS256/PS384/PS512, atau ES256/ES384/ES512.
| Default | T/A |
| Kehadiran | Untuk memverifikasi JWS yang ditandatangani dengan algoritma RSA, Anda harus menggunakan elemen JWKS atau Nilai. |
| Jenis | String |
| Nilai yang valid | Variabel atau string alur. |
<SecretKey/Value>
<SecretKey> <Value ref="private.your-variable-name"/> </SecretKey>
Memberikan kunci rahasia yang digunakan untuk memverifikasi atau menandatangani token dengan algoritma HMAC. Gunakan hanya jika algoritma adalah salah satu dari HS256, HS384, HS512. Gunakan atribut ref untuk meneruskan kunci dalam flow variable.
| Default | T/A |
| Kehadiran | Diperlukan untuk algoritma HMAC. |
| Jenis | String |
| Nilai yang valid |
Variabel alur yang merujuk ke string.
Catatan: Jika flow variable, variabel tersebut harus memiliki awalan "private". Contoh,
|
<Source>
<Source>JWS-variable</Source>
Jika ada, menentukan flow variable tempat kebijakan diharapkan menemukan JWS untuk diverifikasi.
| Default | request.header.authorization (Lihat catatan di atas untuk mengetahui informasi penting
tentang setelan default). |
| Kehadiran | Opsional |
| Jenis | String |
| Nilai yang valid | Nama flow variable Edge. |
Variabel flow
Setelah berhasil, kebijakan Verifikasi JWS dan Dekode JWS akan ditetapkan variabel konteks sesuai dengan pola ini:
jws.{policy_name}.{variable_name}
Misalnya, jika nama kebijakan adalah verify-jws, kebijakan akan menyimpan
algoritma yang ditentukan dalam JWS untuk variabel konteks ini:
jws.verify-jws.header.algorithm
| Nama variabel | Deskripsi |
|---|---|
decoded.header.name |
Nilai header yang dapat diurai JSON dalam payload. Satu variabel ditetapkan untuk
setiap {i>header<i} dalam {i>payload<i}. Meskipun Anda juga dapat menggunakan variabel flow header.name,
variabel ini adalah variabel yang direkomendasikan
untuk mengakses {i>header<i}. |
header.algorithm |
Algoritma penandatanganan yang digunakan pada JWS. Misalnya, RS256, HS384, dan sebagainya. Lihat Parameter Header(Algoritma) untuk mengetahui informasi selengkapnya. |
header.kid |
ID Kunci, jika ditambahkan saat JWS dibuat. Lihat juga "Menggunakan Kumpulan Kunci Web JSON (JWKS)" di JWT dan JWS ringkasan kebijakan untuk memverifikasi JWS. Lihat Parameter Header(Key ID) untuk mengetahui informasi selengkapnya. |
header.type |
Nilai jenis header. Lihat Parameter Header(Jenis) untuk mengetahui informasi selengkapnya. |
header.name |
Nilai header bernama (standar atau tambahan). Salah satunya akan ditetapkan untuk setiap {i>header<i} tambahan di bagian {i> header<i} JWS. |
header-json |
Header dalam format JSON. |
payload |
Payload JWS jika JWS memiliki payload yang terpasang. Untuk payload yang dilepas, variabel ini kosong. |
valid |
Dalam kasus VerifyJWS, variabel ini akan bernilai benar
ketika tanda tangan diverifikasi, dan
waktu saat ini adalah sebelum masa berlaku token habis, dan setelah nilai token {i>notBefore<i}, jika
tersedia. Jika tidak, flag akan bernilai salah.
Dalam kasus DecodeJWS, variabel ini belum ditetapkan. |
Referensi error
Bagian ini menjelaskan kode kesalahan dan pesan error yang ditampilkan dan variabel kesalahan yang disetel oleh Edge saat kebijakan ini memicu error. Informasi ini penting untuk diketahui apakah Anda mengembangkan aturan kesalahan untuk menangani kesalahan. Untuk mempelajari lebih lanjut, lihat Yang perlu Anda ketahui tentang error kebijakan dan Menangani kesalahan.
Error runtime
Error ini dapat terjadi saat kebijakan dieksekusi.
| Kode kesalahan | Status HTTP | Terjadi saat |
|---|---|---|
steps.jws.AlgorithmInTokenNotPresentInConfiguration |
401 | Terjadi saat kebijakan verifikasi memiliki beberapa algoritma |
steps.jws.AlgorithmMismatch |
401 | Algoritme yang ditentukan dalam header oleh kebijakan Pembuatan tidak cocok dengan yang diharapkan dalam kebijakan Verifikasi. Algoritma yang ditentukan harus cocok. |
steps.jws.ContentIsNotDetached |
401 | <DetachedContent> ditentukan saat JWS tidak berisi payload konten terpisah. |
steps.jws.FailedToDecode |
401 | Kebijakan tidak dapat mendekode JWS. JWS mungkin rusak. |
steps.jws.InsufficientKeyLength |
401 | Untuk kunci kurang dari 32 byte untuk algoritma HS256 |
steps.jws.InvalidClaim |
401 | Karena klaim atau klaim tidak cocok, atau ketidakcocokan header atau header tidak ada. |
steps.jws.InvalidCurve |
401 | Kurva yang ditentukan oleh kunci tidak valid untuk algoritma Kurva Eliptis. |
steps.jws.InvalidJsonFormat |
401 | JSON yang tidak valid ditemukan di header JWS. |
steps.jws.InvalidJws |
401 | Error ini terjadi saat verifikasi tanda tangan JWS gagal. |
steps.jws.InvalidPayload |
401 | Payload JWS tidak valid. |
steps.jws.InvalidSignature |
401 | <DetachedContent> dihilangkan dan JWS memiliki payload konten terpisah. |
steps.jws.KeyIdMissing |
401 | Kebijakan Verifikasi menggunakan JWKS sebagai sumber untuk kunci publik, tetapi JWS yang ditandatangani tidak menyertakan properti kid di header. |
steps.jws.KeyParsingFailed |
401 | Kunci publik tidak dapat diuraikan dari informasi kunci yang diberikan. |
steps.jws.MissingPayload |
401 | Payload JWS tidak ada. |
steps.jws.NoAlgorithmFoundInHeader |
401 | Terjadi saat JWS menghilangkan header algoritma. |
steps.jws.NoMatchingPublicKey |
401 | Kebijakan Verifikasi menggunakan JWKS sebagai sumber untuk kunci publik, tetapi kid dalam JWS yang ditandatangani tidak tercantum di JWKS. |
steps.jws.UnhandledCriticalHeader |
401 | Header yang ditemukan oleh kebijakan Verifikasi JWS di header crit tidak tercantum di KnownHeaders. |
steps.jws.UnknownException |
401 | Terjadi pengecualian yang tidak diketahui. |
steps.jws.WrongKeyType |
401 | Jenis kunci yang ditentukan salah. Misalnya, jika Anda menentukan kunci RSA untuk algoritma Kurva Elliptik, atau kunci kurva untuk algoritma RSA. |
Error saat deployment
Error ini dapat terjadi saat Anda men-deploy proxy yang berisi kebijakan ini.
| Nama error | Terjadi saat |
|---|---|
InvalidAlgorithm |
Satu-satunya nilai yang valid adalah: RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512, HS256, HS384, HS512. |
|
|
Kemungkinan error deployment lainnya. |
Variabel error
Variabel ini ditetapkan saat error runtime terjadi. Untuk mengetahui informasi selengkapnya, lihat Yang perlu Anda ketahui tentang error kebijakan.
| Variabel | Dari mana | Contoh |
|---|---|---|
fault.name="fault_name" |
fault_name adalah nama error, seperti yang tercantum dalam tabel Runtime errors di atas. Nama error adalah bagian terakhir dari kode error. | fault.name Matches "TokenExpired" |
JWS.failed |
Semua kebijakan JWS menetapkan variabel yang sama jika terjadi kegagalan. | jws.JWS-Policy.failed = true |
Contoh respons error
Untuk penanganan error, praktik terbaiknya adalah menjebak bagian errorcode dari respons error. Jangan mengandalkan teks di faultstring, karena teks tersebut dapat berubah.
Contoh aturan error
<FaultRules>
<FaultRule name="JWS Policy Errors">
<Step>
<Name>JavaScript-1</Name>
<Condition>(fault.name Matches "TokenExpired")</Condition>
</Step>
<Condition>JWS.failed=true</Condition>
</FaultRule>
</FaultRules>