Halaman ini berlaku untuk Apigee dan Apigee hybrid.
Lihat dokumentasi Apigee Edge.
Apa
Membuat JWS yang ditandatangani, dengan kumpulan klaim yang dapat dikonfigurasi. JWS kemudian dapat ditampilkan ke klien, dikirim ke target backend, atau digunakan dengan cara lain. Lihat ringkasan kebijakan JWS dan JWT untuk pengantar mendetail.
Untuk mempelajari bagian-bagian JWS dan cara dienkripsi serta ditandatangani, lihat RFC7515.
Kebijakan ini adalah Kebijakan yang dapat diperluas dan penggunaan kebijakan ini mungkin memiliki implikasi biaya atau penggunaan, bergantung pada lisensi Apigee Anda. Untuk informasi tentang jenis kebijakan dan implikasi penggunaan, lihat Jenis kebijakan.
Video
Tonton video singkat untuk mempelajari cara membuat JWT yang ditandatangani. Meskipun video ini khusus untuk membuat JWT, banyak konsep yang sama untuk JWS.
Sampel
Membuat JWS yang ditandatangani dengan HS256
Contoh kebijakan ini menghasilkan JWS yang ditandatangani menggunakan algoritma HS256. HS256 mengandalkan secret bersama untuk menandatangani dan memverifikasi tanda tangan. JWS ini menggunakan konten "terlampir", yang berarti header, payload, dan tanda tangan yang dienkode disambungkan dengan titik untuk menghasilkan JWS akhir:
[header].[payload].[signature]
Gunakan elemen <Payload>
untuk menentukan payload JWS mentah yang tidak dienkode.
Dalam contoh ini, variabel berisi payload. Saat tindakan kebijakan ini dipicu,
Apigee mengenkode header dan payload JWS, lalu menambahkan tanda tangan yang dienkode untuk menandatangani JWS secara digital.
Konfigurasi kebijakan di bawah membuat JWS dari payload yang terdapat dalam variabel
my-payload
, dan menyimpan JWS yang dihasilkan dalam variabel
output-variable
.
<GenerateJWS name="JWS-Generate-HS256"> <DisplayName>JWS Generate HS256</DisplayName> <Algorithm>HS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <SecretKey> <Value ref="private.secretkey"/> <Id>1918290</Id> </SecretKey> <Payload ref="my-payload"/> <OutputVariable>output-variable</OutputVariable> </GenerateJWS>
Membuat JWT yang ditandatangani HS256
Contoh ini juga menghasilkan JWS dengan konten terlampir yang ditandatangani menggunakan algoritma
HS256. Dalam hal ini, payload-nya adalah JSON. Menetapkan header typ
ke JWT
akan menghasilkan JWS yang ditandatangani yang juga merupakan JWT yang ditandatangani.
(referensi)
Konfigurasi kebijakan di bawah membuat JWS dari payload yang terdapat dalam variabel
json-content
, dan menyimpan JWS yang dihasilkan dalam variabel
output-variable
. Hasilnya akan berupa JWT yang ditandatangani jika dan hanya jika variabel json-content
menyimpan payload JSON, dan properti dalam payload JSON tersebut valid untuk JWT. Misalnya, properti exp
, jika ada, harus memiliki nilai numerik. Properti aud
, jika ada,
harus berupa string atau array string. Dan seterusnya. Lihat
IETF RFC7519 untuk mengetahui
detail tentang nilai yang valid untuk klaim JWT.
<GenerateJWS name="JWS-Generate-HS256-JWT"> <Algorithm>HS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <SecretKey> <Value ref="private.secretkey"/> </SecretKey> <Payload ref="json-content"/> <AdditionalHeaders> <Claim name="typ">JWT</Claim> </AdditionalHeaders> <OutputVariable>output-variable</OutputVariable> </GenerateJWS>
Membuat JWS terpisah
Contoh kebijakan ini menghasilkan JWS dengan konten terpisah, yang ditandatangani menggunakan algoritma RS256. Pembuatan tanda tangan RS256 bergantung pada kunci pribadi RSA, yang harus diberikan dalam format yang dienkode PEM.
JWS dengan konten yang terpisah akan menghapus payload dari JWS yang dihasilkan:
[header]..[signature]
Gunakan elemen <Payload>
untuk menentukan payload JWS mentah yang tidak dienkode.
Saat kebijakan ini dipicu, Apigee akan mengenkode header dan payload JWS, lalu menggunakannya
untuk membuat tanda tangan yang dienkode. Namun, JWS yang dihasilkan menghilangkan payload yang dienkode dari JWS yang diserialisasi. Hal ini berguna jika konten yang ditandatangani berukuran besar, atau biner (seperti
gambar atau PDF), atau keduanya. Untuk mengizinkan validasi, Anda harus meneruskan kedua elemen, JWS dan
payload yang disertakan dalam konten yang ditandatangani, ke pihak yang memverifikasi. Jika menggunakan
kebijakan VerifyJWS untuk memverifikasi JWS, Anda dapat menentukan variabel yang berisi payload
dengan elemen <DetachedContent>
kebijakan VerifyJWS.
<GenerateJWS name="JWS-Generate-RS256"> <DisplayName>JWS Generate RS256</DisplayName> <Algorithm>RS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <PrivateKey> <Value ref="private.privatekey"/> <Password ref="private.privatekey-password"/> <Id ref="private.privatekey-id"/> </PrivateKey> <Payload ref="my-payload"/> <DetachContent>true</DetachContent> <OutputVariable>output-variable</OutputVariable> </GenerateJWS>
Menetapkan elemen utama
Elemen yang Anda gunakan untuk menentukan kunci yang digunakan untuk membuat JWS bergantung pada algoritma yang dipilih, seperti yang ditunjukkan dalam tabel berikut:
Algoritme | Elemen utama | |
---|---|---|
HS{256/384/512}* | <SecretKey> <Value ref="private.secretkey"/> <Id>1918290</Id> </SecretKey> |
|
RS/PS/ES{256/384/512}* | <PrivateKey> <Value ref="private.privatekey"/> <Password ref="private.privatekey-password"/> <Id ref="private.privatekey-id"/> </PrivateKey> Elemen |
|
*Untuk mengetahui persyaratan kunci selengkapnya, lihat Tentang algoritma enkripsi tanda tangan. |
Referensi elemen untuk Membuat JWS
Referensi kebijakan menjelaskan elemen dan atribut kebijakan Buat 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 atas
<GenerateJWS 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 Apigee menerapkan batasan tambahan, seperti menghapus karakter yang bukan alfanumerik secara otomatis.
Secara opsional, gunakan elemen |
T/A | Wajib |
continueOnError |
Tetapkan ke false untuk menampilkan error saat kebijakan gagal. Perilaku ini wajar terjadi untuk sebagian besar kebijakan.
Tetapkan ke |
false | Opsional |
diaktifkan |
Tetapkan ke true untuk menerapkan kebijakan.
Tetapkan ke |
benar | Opsional |
asinkron | Atribut ini tidak digunakan lagi. | false | Tidak digunakan lagi |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
Gunakan selain atribut nama untuk memberi label pada kebijakan di editor proxy UI Apigee dengan nama bahasa alami yang berbeda.
Default | Jika Anda menghapus elemen ini, nilai atribut nama kebijakan akan digunakan. |
Kehadiran | Opsional |
Jenis | String |
<Algorithm>
<Algorithm>algorithm-here</Algorithm>
Menentukan algoritma enkripsi untuk menandatangani token.
Default | T/A |
Kehadiran | Wajib |
Jenis | String |
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>
Menempatkan pasangan nama/nilai klaim tambahan di header untuk JWS.
Default | T/A |
Kehadiran | Opsional |
Nilai yang valid | Nilai apa pun yang ingin Anda gunakan untuk klaim tambahan. Anda dapat menentukan klaim secara eksplisit sebagai string, angka, boolean, peta, atau array. |
Elemen <Claim>
menggunakan atribut berikut:
- name - (Wajib) Nama klaim, yang juga dikenal sebagai parameter.
- ref - (Opsional) Nama variabel alur. Jika ada, kebijakan akan menggunakan nilai variabel ini sebagai klaim. Jika atribut ref dan nilai klaim eksplisit ditentukan, nilai eksplisit adalah default, dan digunakan jika variabel alur yang dirujuk tidak terselesaikan.
- type - (Opsional) Salah satu dari: string (default), angka, boolean, atau peta
- array - (Opsional) Tetapkan ke true untuk menunjukkan apakah nilainya adalah array jenis. Default: false.
<CriticalHeaders>
<CriticalHeaders>a,b,c</CriticalHeaders> or: <CriticalHeaders ref="variable_containing_headers"/>
Menambahkan header penting, crit, ke JWS. Header crit adalah array nama header yang harus diketahui dan dikenali oleh penerima JWS. Misalnya, Anda dapat menggunakan elemen konfigurasi ini untuk menghasilkan header JWS yang saat didekode, terlihat seperti ini:
{ "typ": "...", "alg" : "...", "hyb" : "some-value-here", "crit" : [ "hyb" ], }
Header JWS ini menyatakan bahwa parameter header hyb sangat penting, dan setiap penerima JWS harus memahami arti dan nilai parameter tersebut.
Sesuai dengan IETF RFC 7515, penerima JWS harus menolak JWS sebagai
tidak valid jika penerima tidak memahami satu atau beberapa parameter yang dirujuk dalam
parameter crit. Di Apigee, kebijakan VerifyJWS sesuai dengan perilaku ini.
Untuk setiap parameter yang tercantum dalam parameter crit, kebijakan ini akan memeriksa apakah
elemen <KnownHeaders>
kebijakan VerifyJWS juga mencantumkan parameter tersebut.
Setiap header yang ditemukan kebijakan VerifyJWS di crit yang juga tidak tercantum
di <KnownHeaders>
akan menyebabkan kebijakan VerifyJWS menolak JWS.
Default | T/A |
Kehadiran | Opsional |
Jenis | Array yang dipisahkan koma dari satu atau beberapa string |
Nilai yang valid | Array atau referensi ke variabel yang berisi array. |
<DetachContent>
<DetachContent>true|false</DetachContent>
Menentukan apakah akan membuat JWS dengan payload terpisah, <DetachContent>true</DetachContent>
,
atau tidak, <DetachContent>false</DetachContent>
.
Jika Anda menentukan false, yang merupakan default, JWS yang dihasilkan akan berbentuk:
[header].[payload].[signature]
Jika Anda menentukan true untuk membuat JWS dengan payload terpisah, JWS yang dihasilkan akan menghapus payload dan dalam bentuk:
[header]..[signature]
Dengan JWS yang menggunakan payload terpisah, Anda dapat meneruskan payload asli yang tidak dienkode ke pihak verifikasi, beserta JWS yang diserialisasi.
Default | false |
Kehadiran | Opsional |
Jenis | Boolean |
Nilai yang valid | benar atau salah |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
Tetapkan ke salah (false) jika Anda ingin kebijakan menampilkan error saat variabel yang dirujuk yang ditentukan dalam kebijakan tidak dapat di-resolve. Tetapkan ke benar (true) untuk memperlakukan variabel yang tidak dapat di-resolve sebagai string kosong (null).
Default | false |
Kehadiran | Opsional |
Jenis | Boolean |
Nilai yang valid | benar atau salah |
<OutputVariable>
<OutputVariable>output-variable</OutputVariable>
Menentukan nama variabel konteks yang akan ditetapkan kebijakan dengan JWS yang dihasilkan.
Secara default, kebijakan menempatkan JWS ke dalam variabel konteks bernama
jws.POLICYNAME.generated_jws
.
Default | jws.POLICYNAME.generated_jws |
Kehadiran | Opsional |
Jenis | String (nama variabel alur) |
<Payload>
<Payload ref="flow-variable-name-here" /> or <Payload>payload-value</Payload>
Menentukan payload JWS mentah yang tidak dienkode. Tentukan variabel yang berisi payload, atau string.
Default | T/A |
Kehadiran | Wajib |
Jenis | String, array byte, streaming, atau representasi lain dari payload JWS yang tidak dienkode. |
Nilai yang valid | Template pesan, atau referensi ke variabel yang berisi payload. |
Elemen <PrivateKey>
Ini bersifat opsional, hanya untuk digunakan jika <Algorithm>
adalah salah satu opsi RS*, PS*,
atau ES*. File ini menentukan kunci pribadi yang akan digunakan untuk penandatanganan, serta informasi
lain yang terkait dengan kunci pribadi. Ini digunakan jika algoritma adalah algoritma asimetris.
<PrivateKey> <Value ref="private.privatekey"</Value> </PrivateKey>
Default: | T/A |
Kehadiran: | Opsional. Namun, Anda harus menyertakan tepat satu dari
elemen <PrivateKey> atau <SecretKey> .
Gunakan elemen <PrivateKey> jika algoritma adalah RS*, PS*, atau ES*,
dan gunakan elemen <SecretKey> jika algoritma adalah HS*.
|
Jenis: | T/A |
<PrivateKey/Id>
<PrivateKey> <Id ref="flow-variable-name-here"/> </PrivateKey> or <PrivateKey> <Id>your-id-value-here</Id> </PrivateKey>
Menentukan ID kunci (kid) yang akan disertakan dalam header JWS.
Default | T/A |
Kehadiran | Opsional |
Jenis | String |
Nilai yang valid | Variabel atau string alur |
<PrivateKey/Password>
<PrivateKey> <Password ref="private.privatekey-password"/> </PrivateKey>
Tentukan sandi yang harus digunakan kebijakan untuk mendekripsi kunci pribadi, jika diperlukan. Gunakan atribut ref untuk meneruskan kunci dalam variabel alur.
Default | T/A |
Kehadiran | Opsional |
Jenis | String |
Nilai yang valid |
Referensi variabel alur. Catatan: Anda harus menentukan variabel alur
dengan atribut ref. Apigee akan menolak konfigurasi kebijakan yang tidak valid, yaitu konfigurasi yang sandinya ditentukan dalam teks biasa. Variabel alur harus memiliki awalan "private". Misalnya, |
<PrivateKey/Value>
<PrivateKey> <Value ref="private.variable-name-here"/> </PrivateKey>
Menentukan kunci pribadi berenkode PEM yang digunakan untuk menandatangani JWS. Gunakan atribut ref untuk meneruskan kunci dalam variabel flow.
Default | T/A |
Kehadiran | Wajib digunakan saat menggunakan kebijakan untuk membuat JWS menggunakan salah satu algoritma RS*, PS*, atau ES*. |
Jenis | String |
Nilai yang valid |
Variabel alur yang berisi string yang mewakili nilai kunci pribadi yang dienkode PEM.
Catatan: Variabel alur harus memiliki awalan "private". Misalnya,
|
<SecretKey>
<SecretKey encoding="base16|hex|base64|base64url" > <Id ref="variable-containing-key-id-here">secret-key-id</Id> <Value ref="private.variable-here"/> </SecretKey>
Menentukan kunci rahasia yang akan digunakan saat membuat JWS yang menggunakan algoritma simetris (HS*), salah satu dari HS256, HS384, atau HS512.
Elemen ini bersifat opsional. Namun, Anda harus menyertakan tepat satu dari
elemen <PrivateKey>
atau <SecretKey>
.
Gunakan elemen <PrivateKey>
saat membuat JWS yang ditandatangani dengan
algoritma asimetris (salah satu dari RS*, PS*, atau ES*),
dan gunakan elemen <SecretKey>
saat membuat JWS yang ditandatangani dengan
algoritma simetris (algoritma seperti HS*).
Anak-anak <SecretKey>
Tabel berikut memberikan deskripsi elemen turunan dan atribut
<SecretKey>
:
Anak | Kehadiran | Deskripsi |
---|---|---|
encoding (atribut) | Opsional | Menentukan cara kunci dienkode dalam variabel yang dirujuk. Secara default, jika tidak ada
<SecretKey encoding="hex" > <Id ref="variable-containing-key-id-here">secret-key-id</Id> <Value ref="private.secretkey"/> </SecretKey> Pada contoh di atas, karena encoding-nya adalah |
ID (elemen) | Opsional | ID kunci. Nilainya dapat berupa string apa pun. Anda dapat menentukan nilai sebagai
nilai teks literal, atau secara tidak langsung, melalui referensi variabel, dengan atribut
<SecretKey> <Id ref="flow-variable-name-here"/> <Value ref="private.variable-here"/> </SecretKey> or <SecretKey> <Id>your-id-value-here</Id> <Value ref="private.variable-here"/> </SecretKey> Kebijakan akan menyertakan ID kunci ini sebagai klaim |
Nilai (elemen) | Wajib | Kunci rahasia yang dienkode. Menentukan kunci rahasia yang digunakan untuk menandatangani payload.
Gunakan atribut <SecretKey> <Id ref="flow-variable-name-here"/> <Value ref="private.my-secret-variable"/> </SecretKey> Apigee menerapkan kekuatan kunci minimum untuk algoritma HS256/HS384/HS512. Panjang kunci minimum untuk HS256 adalah 32 byte, untuk HS384 adalah 48 byte, dan untuk HS512 adalah 64 byte. Menggunakan kunci dengan kekuatan yang lebih rendah akan menyebabkan error runtime. |
<Type>
<Type>type-string-here</Type>
Elemen opsional yang hanya mengizinkan nilai Signed
, yang menentukan bahwa kebijakan
menghasilkan JWS yang ditandatangani. <Type>
disediakan
hanya untuk mencocokkan elemen yang sesuai untuk kebijakan GenerateJWT dan VerifyJWT (dengan
nilai Signed
atau Encrypted
).
Default | T/A |
Kehadiran | Opsional |
Jenis | String |
Nilai yang valid | Signed |
Variabel alur
Kebijakan Buat JWS tidak menetapkan variabel alur.
Referensi error
Bagian ini menjelaskan kode error dan pesan error yang ditampilkan serta variabel error yang ditetapkan oleh Apigee saat kebijakan ini memicu error. Informasi ini penting untuk diketahui jika Anda mengembangkan aturan error untuk menangani error. Untuk mempelajari lebih lanjut, lihat Yang perlu Anda ketahui tentang error kebijakan dan Menangani error.
Error runtime
Error ini dapat terjadi saat kebijakan dieksekusi.
Kode kerusakan | Status HTTP | Terjadi saat |
---|---|---|
steps.jws.GenerationFailed |
401 |
Kebijakan tidak dapat membuat JWS. |
steps.jws.InsufficientKeyLength |
401 |
Untuk kunci kurang dari 32 byte untuk algoritma HS256 |
steps.jws.InvalidClaim |
401 |
Untuk klaim yang tidak ada atau ketidakcocokan klaim, atau header yang tidak ada atau ketidakcocokan header. |
steps.jws.InvalidCurve |
401 |
Kurva yang ditentukan oleh kunci tidak valid untuk algoritma Elliptic Curve. |
steps.jws.InvalidJsonFormat |
401 |
JSON tidak valid ditemukan di header JWS. |
steps.jws.InvalidPayload |
401 |
Payload JWS tidak valid. |
steps.jws.InvalidSignature |
401 |
<DetachedContent> dihilangkan dan JWS memiliki payload konten yang terpisah. |
steps.jws.KeyIdMissing |
401 |
Kebijakan Verifikasi menggunakan JWKS sebagai sumber 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.SigningFailed |
401 |
Di GenerateJWS, untuk kunci yang kurang dari ukuran minimum untuk algoritma HS384 atau HS512 |
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 Elliptic Curve, 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 menangkap 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>