本頁內容適用於 Apigee 和 Apigee Hybrid。
查看
Apigee Edge 說明文件。
結果
驗證從用戶端或其他系統收到的 JWS 簽章。這項政策也會將標頭擷取至環境變數,以便後續政策或條件檢查這些值,做出授權或路由決策。如需詳細簡介,請參閱 JWS 和 JWT 政策總覽。
如果 JWS 經過驗證且有效,要求即可繼續進行。如果無法驗證 JWS 簽章,或因某種錯誤導致 JWS 無效,系統會停止所有處理作業,並在回應中傳回錯誤。
這項政策是可擴充政策,使用這項政策可能會產生費用或影響用量,具體情況取決於您的 Apigee 授權。如要瞭解政策類型和使用方式的影響,請參閱「政策類型」。
如要瞭解 JWS 的各個部分,以及加密和簽署方式,請參閱 RFC7515。
影片
請觀看短片,瞭解如何驗證 JWS 的簽章。雖然這部影片專門介紹如何驗證 JWT,但許多概念也適用於 JWS。
範例
驗證以 HS256 演算法簽署的附加 JWS
這項範例政策會驗證以 HS256 加密演算法簽署的附加 JWS,並使用 SHA-256 總和檢查碼的 HMAC。JWS 會透過名為 JWS
的表單參數,在 Proxy 要求中傳遞。金鑰包含在名為 private.secretkey
的變數中。
隨附的 JWS 包含編碼的標頭、酬載和簽章:
header.payload.signature
政策設定包含 Apigee 解碼及評估 JWS 時所需的資訊,例如 JWS 的位置 (位於 <Source>
元素中指定的流程變數)、必要簽署演算法,以及私密金鑰的位置 (儲存在 Apigee 流程變數中,例如可能從 Apigee KVM 擷取)。
<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>
這項政策會將輸出內容寫入環境變數,以便 API 代理程式中的後續政策或條件檢查這些值。如需這項政策設定的變數清單,請參閱「流程變數」。
驗證以 RS256 演算法簽署的分離式 JWS
這個範例政策會驗證以 RS256 演算法簽署的分離式 JWS。如要驗證,請提供公開金鑰。JWS 會透過名為 JWS
的表單參數,在 Proxy 要求中傳遞。公開金鑰包含在名為 public.publickey
的變數中。
分離式 JWS 會從 JWS 省略酬載:
header..signature
您可以指定包含酬載的變數名稱給 <DetachedContent>
元素,將酬載傳遞至 VerifyJWS 政策。<DetachedContent>
中指定的內容必須與建立 JWS 簽章時的原始未編碼形式相同。
<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>
這項政策會將輸出內容寫入環境變數,以便 API 代理程式中的後續政策或條件檢查這些值。如需這項政策設定的變數清單,請參閱「流程變數」。
設定主要元素
用來指定驗證 JWS 金鑰的元素取決於所選演算法,如下表所示:
演算法 | 重要元素 | |
---|---|---|
HS* |
<SecretKey> <Value ref="private.secretkey"/> </SecretKey> |
|
RS*、ES*、PS* | <PublicKey> <Value ref="rsa_public_key"/> </PublicKey> 或: <PublicKey> <JWKS ref="jwks_val_ref_or_url"/> </PublicKey> |
|
*如要進一步瞭解金鑰規定,請參閱「關於簽章加密演算法」。 |
元素參考資料
政策參考資料說明「驗證 JWS」政策的元素和屬性。
注意:設定會因使用的加密演算法而略有不同。如需特定用途的設定範例,請參閱「範例」。
S適用於頂層元素的屬性
<VerifyJWS name="JWS" continueOnError="false" enabled="true" async="false">
所有政策父項元素都有下列屬性。
屬性 | 說明 | 預設 | 外觀狀態 |
---|---|---|---|
名稱 |
政策的內部名稱。名稱只能使用以下字元:
A-Z0-9._\-$ % 。不過,Apigee 使用者介面會強制執行其他限制,例如自動移除非英數字元。
(選用) 使用 |
不適用 | 必填 |
continueOnError |
設為 false ,以便在政策失敗時傳回錯誤。這是大多數政策的預期行為。
設為 |
false | 選用 |
已啟用 |
設為 true 即可強制執行政策。
設為 |
是 | 選用 |
非同步 | 這項屬性已淘汰。 | false | 已淘汰 |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
除了名稱屬性之外,您也可以使用這個屬性,在 Apigee UI 代理項目編輯器中,以其他自然語言名稱標示政策。
預設 | 如果省略這個元素,系統會使用政策名稱屬性的值。 |
外觀狀態 | 選用 |
類型 | 字串 |
<Algorithm>
<Algorithm>HS256</Algorithm>
指定用來簽署權杖的加密演算法。RS*/PS*/ES* 演算法採用公開/私密金鑰組,而 HS* 演算法則採用共用密鑰。另請參閱「 關於簽章加密演算法」。
你可以指定多個值,並以半形逗號分隔。例如「HS256、HS512」或「RS256、PS256」。 不過,HS* 演算法不得與其他演算法合併使用,ES* 演算法也不得與其他演算法合併使用,因為這些演算法需要特定金鑰類型。您可以結合 RS* 和 PS* 演算法。
預設 | 不適用 |
外觀狀態 | 必填 |
類型 | 以半形逗號分隔的值字串 |
有效值 | 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>
驗證 JWS 標頭是否包含指定的額外聲明名稱/值組,以及聲明值是否相符。
額外聲明使用的名稱並非標準、已註冊的 JWS 聲明名稱。額外聲明的值可以是字串、數字、布林值、對應或陣列。對應只是名稱/值組合的集合。您可以在政策設定中明確指定任何這類型態的聲明值,也可以透過參照流程變數間接指定。
預設 | 不適用 |
外觀狀態 | 選用 |
類型 |
字串 (預設)、數字、布林值或對應。 如果未指定類型,系統會預設為 String。 |
陣列 | 設為 true,表示值是否為型別陣列。預設值: false |
有效值 | 您要用於額外聲明的任何值。 |
<Claim>
元素會採用下列屬性:
- name - (必填) 聲明名稱。
- ref - (選用) 流程變數的名稱。如果存在,政策會使用這個變數的值做為聲明。如果同時指定 ref 屬性和明確的聲明值,系統會預設使用明確值,並在參照的流程變數未解析時使用該值。
- type - (選用) 其中一種:字串 (預設)、數字、布林值或對應
- array - (選用) 設為 true,表示值是否為型別陣列。預設值: false。
<DetachedContent>
<DetachedContent>variable-name-here</DetachedContent>
產生的 JWS (含內容酬載) 格式如下:
header.payload.signature
如果您使用 GenerateJWS 政策建立分離式酬載,產生的 JWS 會省略酬載,且格式如下:
header..signature
如果是已卸離的酬載,您可以使用 <DetachedContent>
元素,將酬載傳遞至 VerifyJWS 政策。指定內容酬載必須與建立 JWS 簽章時的原始未編碼形式相同。
在下列情況下,政策會擲回錯誤:
- 如果 JWS 不含已卸離的內容酬載,則會指定
<DetachedContent>
(錯誤代碼為steps.jws.ContentIsNotDetached
)。 <DetachedContent>
已省略,且 JWS 具有分離的內容酬載 (錯誤代碼為steps.jws.InvalidSignature
)。
預設 | N/A |
外觀狀態 | 選用 |
類型 | 變數參考資料 |
<IgnoreCriticalHeaders>
<IgnoreCriticalHeaders>true|false</IgnoreCriticalHeaders>
如果 JWS 的 crit 標頭中列出的任何標頭未列在 <KnownHeaders>
元素中,請將這項政策設為 false,讓政策擲回錯誤。設為 true 可讓 VerifyJWS 政策忽略 crit 標頭。
將這個元素設為 true 的原因之一,是如果您處於測試環境,且不希望因缺少標頭而導致政策失敗,
預設 | false |
外觀狀態 | 選用 |
類型 | 布林值 |
有效值 | true 或 false |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
如果希望政策在無法解析政策中指定的任何參照變數時擲回錯誤,請設為 false。設為 true 可將任何無法解析的變數視為空字串 (空值)。
預設 | false |
外觀狀態 | 選用 |
類型 | 布林值 |
有效值 | true 或 false |
<KnownHeaders>
<KnownHeaders>a,b,c</KnownHeaders> or: <KnownHeaders ref=’variable_containing_headers’/>
GenerateJWS 政策會使用 <CriticalHeaders>
元素,在權杖中填入 crit 標頭。例如:
{ “typ: “...”, “alg” : “...”, “crit” : [ “a”, “b”, “c” ], }
VerifyJWS 政策會檢查 JWS 中的 crit 標頭 (如有),並針對列出的每個項目,檢查 <KnownHeaders>
元素是否也列出該標頭。<KnownHeaders>
元素可包含 crit 中列出的項目超集。只要 crit 中列出的所有標頭都列在 <KnownHeaders>
元素中即可。如果政策在 crit 中找到的任何標頭未列於 <KnownHeaders>
,VerifyJWS 政策就會失敗。
如有需要,您可以將 <IgnoreCriticalHeaders>
元素設為 true
,讓 VerifyJWS 政策忽略 crit 標頭。
預設 | 不適用 |
外觀狀態 | 選用 |
類型 | 以半形逗號分隔的字串陣列 |
有效值 | 陣列或含有陣列的變數名稱。 |
<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>
以 JWKS 格式 (RFC 7517) 指定值,其中包含一組公開金鑰。僅在演算法為 RS256/RS384/RS512、PS256/PS384/PS512 或 ES256/ES384/ES512 時使用。
如果傳入的 JWS 含有 JWKS 集合中的金鑰 ID,政策就會使用正確的公開金鑰驗證 JWS 簽章。如要瞭解這項功能的詳細資訊,請參閱「 使用 JSON Web Key Set (JWKS) 驗證 JWS」。
如果您從公開網址擷取值,Apigee 會將 JWKS 快取 300 秒。 快取過期時,Apigee 會再次擷取 JWKS。
預設 | 不適用 |
外觀狀態 | 如要使用 RSA 演算法驗證 JWS,必須使用 JWKS 或 Value 元素。 |
類型 | 字串 |
有效值 | 流程變數、字串值或網址。 |
<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>
指定用於驗證 JWS 簽章的公開金鑰。使用 ref 屬性在流程變數中傳遞金鑰,或直接指定 PEM 編碼金鑰。僅在演算法為 RS256/RS384/RS512、PS256/PS384/PS512 或 ES256/ES384/ES512 時使用。
預設 | 不適用 |
外觀狀態 | 如要驗證以 RSA 演算法簽署的 JWS,您必須使用 JWKS 或 Value 元素。 |
類型 | 字串 |
有效值 | 流程變數或字串。 |
<SecretKey>
<SecretKey encoding="base16|hex|base64|base64url" > <Value ref="private.your-variable-name"/> </SecretKey>
指定驗證使用對稱 (HS*) 演算法 (HS256、HS384 或 HS512) 的 JWS 時要使用的私密金鑰。
此元素為選用項目。不過,您必須只包含一個 <PublicKey>
或 <SecretKey>
元素。驗證演算法為 RS*、PS* 或 ES* 的 JWS 時,請使用 <PublicKey>
元素;驗證演算法為 HS* 的 JWS 時,請使用 <SecretKey>
元素。
「<SecretKey>
」的子女
下表說明 <SecretKey>
的子元素和屬性:
子項 | 存在必要性 | 說明 |
---|---|---|
編碼 (屬性) | 選用 | 指定如何編碼參照變數中的金鑰。根據預設,如果沒有 <SecretKey encoding="base64" > <Value ref="private.secretkey"/> </SecretKey> 在上述範例中,由於編碼為 |
值 (元素) | 必填 | 編碼後的密鑰。指定用於驗證酬載的私密金鑰。使用 <SecretKey> <Value ref="private.my-secret-variable"/> </SecretKey> Apigee 會針對 HS256/HS384/HS512 演算法強制執行最低金鑰強度。HS256 的金鑰長度下限為 32 個位元組,HS384 為 48 個位元組,HS512 則為 64 個位元組。使用強度較低的金鑰會導致執行階段錯誤。 |
<Source>
<Source>JWS-variable</Source>
如有,則指定政策預期會找到要驗證的 JWS 的流程變數。
預設 | request.header.authorization (請參閱上方的附註,瞭解預設值的重要資訊)。 |
外觀狀態 | 選用 |
類型 | 字串 |
有效值 | Apigee 流程變數名稱。 |
<Type>
<Type>type-string-here</Type>
選用元素,唯一允許的值為 Signed
,用於指定政策會驗證已簽署的 JWS。<Type>
僅用於比對 GenerateJWT 和 VerifyJWT 政策的對應元素 (其中可採用 Signed
或 Encrypted
值)。
預設 | 不適用 |
外觀狀態 | 選用 |
類型 | 字串 |
有效值 | Signed |
流程變數
成功後,「Verify JWS」和「Decode JWS」政策會根據以下模式設定內容變數:
jws.{policy_name}.{variable_name}
舉例來說,如果政策名稱為 verify-jws
,則政策會將 JWS 中指定的演算法儲存至這個內容變數:jws.verify-jws.header.algorithm
變數名稱 | 說明 |
---|---|
decoded.header.name |
酬載中標頭的 JSON 可剖析值。每個酬載標頭都會設定一個變數。您也可以使用 header.name 流程變數,但建議您使用這個變數來存取標頭。 |
header.algorithm |
JWS 使用的簽署演算法。例如 RS256、HS384 等。詳情請參閱「(演算法) 標頭參數」一文。 |
header.kid |
金鑰 ID (如果在產生 JWS 時新增)。如要驗證 JWS,請參閱「JWT 和 JWS 政策總覽」一文中的「使用 JSON Web 金鑰集合 (JWKS)」一節。詳情請參閱「(Key ID) 標頭參數」。 |
header.type |
標頭類型值。詳情請參閱「(Type) 標頭參數」。 |
header.name |
命名標頭的值 (標準或額外)。在 JWS 的標頭部分,每個額外標頭都會設定其中一個。 |
header-json |
以 JSON 格式提供的標頭。 |
payload |
如果 JWS 有附加的酬載,則為 JWS 酬載。如果是分離的酬載,這個變數會是空白。 |
valid |
在 VerifyJWS 的情況下,如果簽名已驗證,且目前時間在符記到期時間之前,且在符記 notBefore 值之後 (如果有這些值的話),這個變數就會設為 true。否則為 false。
在 DecodeJWS 的情況下,這個變數並未設定。 |
錯誤參考資料
本節說明這項政策觸發錯誤時,Apigee 傳回的錯誤代碼和錯誤訊息,以及 Apigee 設定的錯誤變數。如果您要開發錯誤處理規則,就必須瞭解這項資訊。如需更多資訊,請參閱「關於政策錯誤的相關資訊」和「處理錯誤」。
執行階段錯誤
政策執行時可能會發生這些錯誤。
錯誤代碼 | HTTP 狀態 | 發生時機 |
---|---|---|
steps.jws.AlgorithmInTokenNotPresentInConfiguration |
401 |
驗證政策包含多個演算法時發生 |
steps.jws.AlgorithmMismatch |
401 |
Generate 政策在標頭中指定的演算法與 Verify 政策中預期的演算法不符。指定的演算法必須相符。 |
steps.jws.ContentIsNotDetached |
401 |
如果 JWS 不包含已分離的內容酬載,就會指定 <DetachedContent> 。 |
steps.jws.FailedToDecode |
401 |
政策無法解碼 JWS。JWS 可能已損毀。 |
steps.jws.InsufficientKeyLength |
401 |
針對 HS256 演算法,金鑰長度必須小於 32 位元組 |
steps.jws.InvalidClaim |
401 |
缺少聲明或聲明不相符,或是缺少標頭或標頭不相符。 |
steps.jws.InvalidCurve |
401 |
金鑰指定的曲線不適用於橢圓曲線演算法。 |
steps.jws.InvalidJsonFormat |
401 |
JWS 標頭中發現無效的 JSON。 |
steps.jws.InvalidJws |
401 |
當 JWS 簽名驗證失敗時,就會發生此錯誤。 |
steps.jws.InvalidPayload |
401 |
JWS 酬載無效。 |
steps.jws.InvalidSignature |
401 |
<DetachedContent> 已省略,且 JWS 具有分離的內容酬載。 |
steps.jws.KeyIdMissing |
401 |
Verify 政策會使用 JWKS 做為公開金鑰來源,但已簽署的 JWS 不會在標頭中加入 kid 屬性。 |
steps.jws.KeyParsingFailed |
401 |
無法從指定的金鑰資訊剖析公開金鑰。 |
steps.jws.MissingPayload |
401 |
缺少 JWS 酬載。 |
steps.jws.NoAlgorithmFoundInHeader |
401 |
發生於 JWS 省略演算法標頭時。 |
steps.jws.NoMatchingPublicKey |
401 |
Verify 政策使用 JWKS 做為公開金鑰來源,但已簽署的 JWS 中的 kid 並未列在 JWKS 中。 |
steps.jws.UnhandledCriticalHeader |
401 |
crit 標頭中由「驗證 JWS」政策所找到的標頭,並未列在 KnownHeaders 中。 |
steps.jws.UnknownException |
401 |
發生不明例外狀況。 |
steps.jws.WrongKeyType |
401 |
指定的金鑰類型有誤。例如,如果您為橢圓曲線演算法指定 RSA 金鑰,或為 RSA 演算法指定曲線金鑰。 |
部署錯誤
部署含有這項政策的 Proxy 時,可能會發生這些錯誤。
錯誤名稱 | 發生時機 |
---|---|
InvalidAlgorithm |
唯一有效的值為 RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512,
HS256, HS384, HS512 。 |
|
其他可能的部署錯誤。 |
錯誤變數
系統會在發生執行階段錯誤時設定這些變數。詳情請參閱重要須知 政策錯誤。
變數 | 地點 | 範例 |
---|---|---|
fault.name="fault_name" |
fault_name 是錯誤的名稱,如上方「執行階段錯誤」表格所列。錯誤名稱是錯誤程式碼的最後部分。 | fault.name Matches "TokenExpired" |
JWS.failed |
如果作業失敗,所有 JWS 政策都會設定相同的變數。 | jws.JWS-Policy.failed = true |
錯誤回應範例
針對錯誤處理,最佳做法是將錯誤的 errorcode
部分加以包裝
回應。請勿參考 faultstring
中的文字,因為可能會變動。
錯誤規則範例
<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>