Kebijakan VerifyJWS

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

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 <displayname></displayname> untuk melabeli kebijakan di editor proxy UI pengelolaan dengan nama bahasa alami yang berbeda.

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 true agar eksekusi alur berlanjut meskipun kebijakan gagal.

false Opsional
diaktifkan Setel ke true untuk menerapkan kebijakan.

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

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 adalah steps.jws.ContentIsNotDetached).
  • <DetachedContent> dihilangkan dan JWS memiliki payload konten yang terpisah (kode error adalah steps.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, private.mysecret

<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

This section describes the fault codes and error messages that are returned and fault variables that are set by Edge when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.

Runtime errors

These errors can occur when the policy executes.

Fault code HTTP status Occurs when
steps.jws.AlgorithmInTokenNotPresentInConfiguration 401 Occurs when the verification policy has multiple algorithms
steps.jws.AlgorithmMismatch 401 The algorithm specified in the header by the Generate policy did not match the one expected in the Verify policy. The algorithms specified must match.
steps.jws.ContentIsNotDetached 401 <DetachedContent> is specified when the JWS does not contain a detached content payload.
steps.jws.FailedToDecode 401 The policy was unable to decode the JWS. The JWS is possibly corrupted.
steps.jws.InsufficientKeyLength 401 For a key less than 32 bytes for the HS256 algorithm
steps.jws.InvalidClaim 401 For a missing claim or claim mismatch, or a missing header or header mismatch.
steps.jws.InvalidCurve 401 The curve specified by the key is not valid for the Elliptic Curve algorithm.
steps.jws.InvalidJsonFormat 401 Invalid JSON found in the JWS header.
steps.jws.InvalidJws 401 This error occurs when the JWS signature verification fails.
steps.jws.InvalidPayload 401 The JWS payload is invalid.
steps.jws.InvalidSignature 401 <DetachedContent> is omitted and the JWS has a detached content payload.
steps.jws.KeyIdMissing 401 The Verify policy uses a JWKS as a source for public keys, but the signed JWS does not include a kid property in the header.
steps.jws.KeyParsingFailed 401 The public key could not be parsed from the given key information.
steps.jws.MissingPayload 401 The JWS payload is missing.
steps.jws.NoAlgorithmFoundInHeader 401 Occurs when the JWS omits the algorithm header.
steps.jws.NoMatchingPublicKey 401 The Verify policy uses a JWKS as a source for public keys, but the kid in the signed JWS is not listed in the JWKS.
steps.jws.UnhandledCriticalHeader 401 A header found by the Verify JWS policy in the crit header is not listed in KnownHeaders.
steps.jws.UnknownException 401 An unknown exception occurred.
steps.jws.WrongKeyType 401 Wrong type of key specified. For example, if you specify an RSA key for an Elliptic Curve algorithm, or a curve key for an RSA algorithm.

Deployment errors

These errors can occur when you deploy a proxy containing this policy.

Error name Occurs when
InvalidAlgorithm The only valid values are: 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

Other possible deployment errors.

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>