Kebijakan GenerateJWS

Halaman ini berlaku untuk Apigee dan Apigee Hybrid.

Baca dokumentasi Apigee Edge.

ikon kebijakan

Apa

Menghasilkan JWS bertanda tangan, dengan sekumpulan 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 JWS dienkripsi dan ditandatangani, lihat RFC7515.

Kebijakan ini merupakan Kebijakan yang dapat diperluas, dan penggunaan kebijakan ini mungkin memiliki implikasi biaya atau pemanfaatan, bergantung pada lisensi Apigee Anda. Untuk mengetahui informasi tentang jenis kebijakan dan implikasi penggunaan, lihat Jenis kebijakan.

Video

Tonton video singkat untuk mempelajari cara menghasilkan JWT yang ditandatangani. Meskipun video ini khusus untuk menghasilkan JWT, banyak konsep yang sama untuk JWS.

Sampel

Membuat JWS yang ditandatangani dengan HS256

Kebijakan contoh ini menghasilkan JWS yang ditandatangani menggunakan algoritma HS256. HS256 bergantung pada rahasia bersama untuk menandatangani dan memverifikasi tanda tangan. JWS ini menggunakan konten "terlampir", yang berarti header, payload, dan tanda tangan yang dienkode digabungkan dengan titik untuk menghasilkan JWS akhir:

[header].[payload].[signature]

Gunakan elemen <Payload> untuk menetapkan payload JWS mentah dan tidak dienkode. Dalam contoh ini, variabel berisi payload. Saat tindakan kebijakan ini dipicu, Apigee akan mengenkode header dan payload JWS, lalu menambahkan tanda tangan yang dienkode untuk menandatangani JWS secara digital.

Konfigurasi kebijakan di bawah ini 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 bertanda tangan yang juga merupakan JWT bertanda tangan. (referensi)

Konfigurasi kebijakan di bawah ini membuat JWS dari payload yang terdapat dalam variabel json-content, dan menyimpan JWS yang dihasilkan dalam variabel output-variable. Hasilnya akan menjadi JWT yang ditandatangani jika dan hanya jika variabel json-content menyimpan payload JSON, dan properti di dalam payload JSON tersebut valid untuk JWT. Misalnya, jika ada, properti exp harus memiliki nilai numerik. Properti aud, jika ada, harus berupa string atau array string. Dan seterusnya. Lihat IETF RFC7519 untuk 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 disediakan dalam bentuk berenkode PEM.

JWS dengan konten terpisah menghilangkan payload dari JWS yang dihasilkan:

[header]..[signature]

Gunakan elemen <Payload> untuk menetapkan payload JWS mentah dan 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 serial. Hal ini berguna jika konten yang ditandatangani berukuran besar, atau berisi 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> dalam 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 menghasilkan JWS bergantung pada algoritma yang dipilih, seperti yang ditunjukkan dalam tabel berikut:

Algoritma 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 <Password> dan <Id> bersifat opsional.

*Untuk mengetahui informasi selengkapnya tentang persyaratan utama, lihat Tentang algoritma enkripsi tanda tangan.

Referensi elemen untuk Membuat JWS

Referensi kebijakan menjelaskan elemen dan atribut kebijakan Generate JWS.

Catatan: Konfigurasi akan sedikit berbeda, bergantung pada algoritma enkripsi yang Anda gunakan. Lihat Contoh untuk mengetahui contoh yang menunjukkan konfigurasi untuk kasus penggunaan tertentu.

Atribut yang berlaku untuk elemen level atas

<GenerateJWS name="JWS" continueOnError="false" enabled="true" async="false">

Atribut berikut bersifat umum untuk semua elemen induk kebijakan.

Atribut Deskripsi Default Kehadiran
name Nama internal kebijakan. Karakter yang dapat Anda gunakan dalam nama dibatasi untuk: A-Z0-9._\-$ %. Namun, UI Apigee menerapkan pembatasan tambahan, misalnya penghapusan otomatis karakter yang bukan alfanumerik.

Atau, gunakan elemen <displayname></displayname> untuk memberi label kebijakan di editor proxy UI Apigee dengan nama bahasa alami yang berbeda.

T/A Diperlukan
continueOnError Setel ke false untuk menampilkan error jika kebijakan gagal. Ini adalah perilaku yang wajar untuk sebagian besar kebijakan.

Setel ke true agar eksekusi alur berlanjut bahkan setelah kebijakan gagal.

false Opsional
diaktifkan Setel ke true untuk menerapkan kebijakan.

Setel ke false untuk "menonaktifkan" kebijakan. Kebijakan tidak akan diterapkan meskipun tetap melekat pada alur.

true Opsional
async 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 Apigee dengan nama natural-language yang berbeda.

Default Jika Anda menghapus elemen ini, nilai atribut nama kebijakan akan digunakan.
Kehadiran Opsional
Type String

<Algorithm>

<Algorithm>algorithm-here</Algorithm>

Menentukan algoritma enkripsi untuk menandatangani token.

Default T/A
Kehadiran Diperlukan
Type String
Nilai yang valid HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512

<AdditionalHeader/Klaim>

<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, 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 eksplisitnya adalah default, dan digunakan jika variabel alur yang direferensikan 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.

<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, akan terlihat seperti ini:

{
  "typ": "...",
  "alg" : "...",
  "hyb" : "some-value-here",
  "crit" : [ "hyb" ],
}

Header JWS ini menegaskan 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, kode akan memeriksa apakah elemen <KnownHeaders> kebijakan VerifyJWS juga mencantumkan parameter tersebut. Header yang ditemukan oleh kebijakan VerifyJWS dalam crit yang tidak tercantum dalam <KnownHeaders> akan menyebabkan kebijakan VerifyJWS menolak JWS.

Default T/A
Kehadiran Opsional
Type 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 menghasilkan JWS dengan payload terpisah, <DetachContent>true</DetachContent>, atau tidak, <DetachContent>false</DetachContent>.

Jika Anda menetapkan false, secara default, JWS yang dihasilkan adalah dalam bentuk:

[header].[payload].[signature]

Jika Anda menetapkan true untuk membuat JWS dengan payload terpisah, JWS yang dihasilkan akan menghilangkan payload dan berada dalam bentuk:

[header]..[signature]

Dengan JWS yang menggunakan payload terpisah, Anda dapat meneruskan payload asli yang tidak dienkode ke pihak yang memverifikasi, beserta JWS serial.

Default false
Kehadiran Opsional
Type Boolean
Nilai yang valid benar atau salah

<IgnoreUnresolvedVariables>

<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>

Tetapkan ke false jika Anda ingin kebijakan menampilkan error saat variabel direferensikan yang ditentukan dalam kebijakan tidak dapat diselesaikan. Tetapkan ke true untuk memperlakukan variabel yang tidak dapat di-resolve sebagai string kosong (null).

Default false
Kehadiran Opsional
Type Boolean
Nilai yang valid benar atau salah

<OutputVariable>

<OutputVariable>output-variable</OutputVariable>

Menentukan nama variabel konteks yang akan disetel oleh kebijakan dengan JWS yang dihasilkan. Secara default, kebijakan tersebut menempatkan JWS ke dalam variabel konteks bernama jws.POLICYNAME.generated_jws.

Default jws.POLICYNAME.generated_jws
Kehadiran Opsional
Type String (nama variabel flow)

<Payload>

<Payload ref="flow-variable-name-here" />

or

<Payload>payload-value</Payload>

Menentukan payload JWS mentah dan tidak dienkode. Tentukan variabel yang berisi payload, atau string.

Default T/A
Kehadiran Diperlukan
Type String, array byte, stream, atau representasi lain dari payload JWS yang tidak dienkode.
Nilai yang valid Template pesan, atau referensi ke variabel yang berisi payload.

Elemen <PrivateKey>

Hal 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. Digunakan ketika algoritma adalah algoritma asimetris.

<PrivateKey>
   <Value ref="private.privatekey"</Value>
</PrivateKey>
Default: T/A
Kehadiran: Opsional. Namun, Anda harus menyertakan tepat salah satu dari elemen <PrivateKey> atau <SecretKey>. Gunakan elemen <PrivateKey> ketika algoritme adalah RS*, PS*, atau ES*, dan gunakan elemen <SecretKey> saat algoritme 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 (anak) untuk disertakan dalam header JWS.

Default T/A
Kehadiran Opsional
Type String
Nilai yang valid String atau variabel 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 flow.

Default T/A
Kehadiran Opsional
Type String
Nilai yang valid

Referensi variabel alur. Catatan: Anda harus menentukan variabel alur dengan atribut ref. Apigee akan menolak karena konfigurasi kebijakan yang tidak valid yang menentukan sandinya dalam teks biasa. Variabel flow harus memiliki awalan "private". Misalnya, private.mypassword

<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 Diperlukan saat menggunakan kebijakan untuk membuat JWS menggunakan salah satu algoritma RS*, PS*, atau ES*.
Type String
Nilai yang valid Variabel alur berisi string yang mewakili nilai kunci pribadi berenkode PEM.

Catatan: Variabel flow harus memiliki awalan "private". Misalnya, private.mykey

<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 digunakan saat menghasilkan JWS yang menggunakan algoritma simetris (HS*), salah satu dari HS256, HS384, atau HS512.

Elemen ini bersifat opsional. Namun, Anda harus menyertakan tepat salah satu dari elemen <PrivateKey> atau <SecretKey>. Gunakan elemen <PrivateKey> saat menghasilkan JWS yang ditandatangani dengan algoritma asimetris (salah satu dari RS*, PS*, atau ES*), dan gunakan elemen <SecretKey> saat menghasilkan JWS yang ditandatangani dengan algoritma simetris (algoritma seperti HS*).

Anak dari <SecretKey>

Tabel berikut memberikan deskripsi elemen dan atribut turunan <SecretKey>:

Anak Kehadiran Deskripsi
encoding (atribut) Opsional

Menentukan cara kunci dienkode dalam variabel yang direferensikan. Secara default, jika tidak ada atribut encoding, encoding kunci diperlakukan sebagai UTF-8. Nilai yang valid untuk atribut ini adalah: hex, base16, base64, atau base64url. Nilai encoding hex dan base16 adalah sinonim.

<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 hex, jika isi variabel private.secretkey adalah 494c6f766541504973, kunci akan didekode sebagai satu set 9 byte, yang dalam heksadesimal adalah 49 4c 6f 76 65 41 50 49 73.

ID (elemen) Opsional

ID kunci. Nilainya dapat berupa string apa pun. Anda dapat menentukan nilai tersebut sebagai nilai teks literal, atau secara tidak langsung, melalui referensi variabel, dengan atribut ref.

<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 ini akan menyertakan ID kunci ini sebagai klaim kid di header JWS yang dihasilkan.

Nilai (elemen) Diperlukan

Kunci rahasia yang dienkode. Menentukan kunci rahasia yang digunakan untuk menandatangani payload. Gunakan atribut ref untuk memberikan kunci secara tidak langsung melalui variabel, seperti private.secret-key .

<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.

<Jenis>

<Type>type-string-here</Type>

Elemen opsional yang satu-satunya nilai yang diizinkan adalah Signed, yang menentukan bahwa kebijakan tersebut menghasilkan JWS yang ditandatangani. <Type> disediakan hanya untuk mencocokkan elemen yang sesuai dengan kebijakan GenerateJWT dan VerifyJWT (yang dapat menggunakan salah satu nilai Signed atau Encrypted).

Default T/A
Kehadiran Opsional
Type String
Nilai yang valid Signed

Variabel alur

Kebijakan Generate JWS tidak menetapkan variabel alur.

Referensi error

Bagian ini menjelaskan kode kesalahan dan pesan error yang ditampilkan dan variabel kesalahan yang disetel oleh Apigee saat kebijakan ini memicu error. Informasi ini penting untuk diketahui apakah Anda mengembangkan aturan kesalahan untuk menangani kesalahan. Untuk mempelajari lebih lanjut, lihat Hal 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.GenerationFailed 401 Kebijakan ini tidak dapat menghasilkan JWS.
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.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.SigningFailed 401 Dalam 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 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.

EmptyElementForKeyConfiguration

FailedToResolveVariable

InvalidConfigurationForActionAndAlgorithmFamily

InvalidConfigurationForVerify

InvalidEmptyElement

InvalidFamiliesForAlgorithm

InvalidKeyConfiguration

InvalidNameForAdditionalClaim

InvalidNameForAdditionalHeader

InvalidPublicKeyId

InvalidPublicKeyValue

InvalidSecretInConfig

InvalidTypeForAdditionalClaim

InvalidTypeForAdditionalHeader

InvalidValueForElement

InvalidValueOfArrayAttribute

InvalidVariableNameForSecret

MissingConfigurationElement

MissingElementForKeyConfiguration

MissingNameForAdditionalClaim

MissingNameForAdditionalHeader

Kemungkinan error deployment lainnya.

Variabel kesalahan

Variabel ini ditetapkan saat terjadi error runtime. Untuk informasi selengkapnya, lihat Yang perlu Anda ketahui tentang error kebijakan.

Variabel Dari mana Contoh
fault.name="fault_name" fault_name adalah nama kesalahan, seperti yang tercantum dalam tabel Error runtime di atas. Nama kesalahan adalah bagian terakhir dari kode kesalahan. 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 dapat berubah.

Contoh aturan kesalahan

<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>