查看 Apigee Edge 說明文件。
前往
Apigee X說明文件。 資訊
本主題提供關於 JWT (JSON Web Token) 的一般資訊 和 JWS (JSON Web Signature) 及 Apigee JWS/JWT 政策。
簡介
JWS 和 JWT 通常用於在連線之間共用憑證附加資訊或斷言 應用程式。JWS/JWT 政策可讓 Edge API Proxy 執行下列操作:
在後兩個情況中,這項政策也會設定允許額外政策的變數,或 來檢查已驗證的聲明,並依據這些要求制定決策 著作權聲明。
使用「驗證 JWS/JWT」政策時,無效的 JWS/JWT 將遭到拒絕且會導致錯誤 值。同樣地,使用解碼 JWS/JWT 政策時,如果 JWS/JWT 的格式有誤,便會導致錯誤 值。
影片
觀看短片,快速瞭解 JWT。這部影片 許多概念都與 JWS 相同。
觀看這部短片,進一步瞭解 JWT 結構。
用途
您可以使用 JWS/JWT 政策執行下列作業:
- 在 Edge Proxy 的 Proxy 或目標端點端產生新的 JWS/JWT。適用對象 舉例來說,您可以建立 Proxy 要求流程,產生 JWS/JWT 並傳回至用戶端。 或者,您可以設計 Proxy 以便在目標要求流程中產生 JWS/JWT。 並附加至傳送至目標的要求接著您就能啟用這些著作權聲明 以便套用進一步的安全性處理
- 從目標內傳入用戶端要求所取得的 JWS/JWT 驗證並擷取憑證附加資訊 服務回應、來自服務呼叫政策回應,或其他來源。邊緣將 驗證 JWS/JWT 上的簽章 (無論 JWS/JWT 是由第三方或 Edge 產生) 使用 RSA 或 HMAC 演算法。
- 將 JWS/JWT 解碼。與 Verify JWS/JWT 政策搭配使用時,解碼器最實用,因為 必須先確認 JWS/JWT 中的憑證附加資訊 (JWT) 或標頭 (JWS/JWT) 值,才能進行驗證 JWS/JWT
JWS/JWT 的一部分
已簽署的 JWS/JWT 會將資訊編碼成三個部分,分別以句點分隔:標頭、酬載和 簽章:
header.payload.signature
- 「產生 JWS/JWT」政策會建立全部三個部分。
- 「Verify JWS/JWT」政策檢查全部三個部分。
- 解碼 JWS/JWT 政策只會檢查標頭和酬載。
JWS 也支援省略來自 JWS 酬載的「卸離」格式:
header..signature
使用卸離的 JWS 時,承載會與 JWS 分開傳送。您可以使用
驗證 JWS 政策的 <DetachedContent>
元素,用於指定未編碼的原始 JWS 酬載。
接著,Verify JWS 政策使用 JWS 和酬載中的標頭和簽章驗證 JWS
由 <DetachedContent>
元素指定。
如要進一步瞭解符記的編碼和簽署方式,請參閱:
- JWT:IETF RFC7519
- JWS:IETF RFC7515
JWS 和 JWT 之間的差異
您可以使用 JWT 或 JWS,在已連結的應用程式之間共用憑證附加資訊或斷言。 兩者的主要差異在於酬載的表示法:
- JWT
- 酬載一律為 JSON 物件
- 酬載一律會附加至 JWT
- 符記的
typ
標頭一律設為JWT
- JWS
- 酬載可以用任何格式表示,例如 JSON 物件、位元組串流、八位元串流及其他
- 酬載不一定要附加至 JWS
由於 JWT 格式一律使用 JSON 物件來代表酬載,因此 Edge Generate JWT 和 JWT 政策皆內建支援,可處理常見的註冊要求名稱,例如 aud、 iss、sub 等。也就是說,您可以使用 產生 JWT 政策,以在酬載中設定這些憑證附加資訊,以及驗證 JWT 政策的元素,以便驗證這些值。 請參閱註冊的版權聲明名稱 一節。
除了支援特定註冊要求名稱外,您可以直接產生 JWT 政策 支援在 JWT 中新增具有任意名稱的憑證附加資訊。每項憑證附加資訊都是簡單的名稱/值組合 其中的值可以是數字、布林值、字串、地圖或陣列。
由於 JWS 可以使用任何酬載的資料表示法,因此無法在酬載中新增憑證附加資訊。 產生 JWS 政策不支援在 JWS 標頭中加入任意名稱的聲明。 此外,JWS 政策支援卸離酬載,而 JWS 會省略酬載。 卸離酬載可讓您分別傳送 JWS 和酬載,且基於多項安全標準的要求。
關於簽名演算法
JWS/JWT 驗證和 JWS/JWT 產生政策使用 SHA2 支援 RSA、RSASSA-PSS、ECDSA 和 HMAC 演算法 256、384 或 512 的位元強度檢查碼。無論 演算法用於簽署 JWS/JWT。
HMAC 演算法
HMAC 演算法是使用共用密鑰 (又稱為密鑰) 來建立 簽章 (也稱為簽署 JWS/JWT) 以及驗證簽章。
密鑰長度的下限取決於演算法的位元強度:
- HS256:金鑰長度下限為 32 位元組
- HS386:金鑰長度下限為 48 個位元組
- HS512:金鑰長度下限為 64 個位元組
RSA 演算法
RSA 演算法會使用公開/私密金鑰組做為加密編譯簽章。有回應式搜尋廣告 簽章,簽署方會使用 RSA 私密金鑰簽署 JWS/JWT,而驗證方會使用 相符的 RSA 公開金鑰,以便驗證 JWS/JWT 上的簽名。 鍵。
RSASSA-PSS 演算法
RSASSA-PSS 演算法已更新 RSA 演算法。與 RSS 一樣,RSASSA-PSS 會使用 RSA 公開/私密金鑰組。金鑰的格式與 RSS 相同。 簽署方使用私密金鑰簽署 JWS/JWT,而驗證方會使用 公開金鑰,以便驗證 JWS/JWT 上的簽名。這些鍵沒有任何大小規定。
ECDSA 演算法
橢圓曲線數位簽章演算法 (ECDSA) 演算法是橢圓曲線密碼編譯 包括 P-256、P-384 和 P-521 曲線使用 ECDSA 演算法時,演算法會決定 您必須指定公開與私密金鑰的類型:
演算法 | 弧形 | 金鑰規定 |
---|---|---|
ES256 | P-256 | 從 P-256 曲線產生的金鑰 (也稱為 secp256r1 或 prime256v1) |
ES384 | P-384 | 從 P-384 曲線產生的金鑰 (也稱為 secp384r1) |
ES512 | P-521 | 從 P-521 曲線產生的金鑰 (也稱為 secp521r1) |
金鑰加密演算法
JWS/JWT 政策支援 OpenSSL。
使用 JSON Web KeySet (JWKS) 驗證 JWS/JWT
驗證已簽署的 JWS/JWT 時,您需要提供 與用來簽署權杖的私密金鑰相關聯。您有兩個選項: 提供公開金鑰給驗證 JWS/JWT 政策:
- 使用實際的公開金鑰值 (通常在流程變數中提供);或
- 使用 JWKS 包裝的公開金鑰。
關於 JWKS
JWKS 是一種 JSON 結構,代表一組 JSON Web Keys (JWK)。JWK 是 JSON 資料 代表加密編譯金鑰的架構JWK 和 JWKS 均參閱 RFC7517 中所述。請參閱 JKWS 範例: 附錄 A:JSON Web 金鑰組範例
JWKS 結構
RFC7517 說明 JWKS 的主要元素 例如「RSA」或「EC」例如,視金鑰類型而定 這些參數可能包括:
- kty - 金鑰類型,例如「RSA」或「EC」
- kid (鍵 id) - 可以是任何值 (鍵中沒有重複的值) 設定)。如果傳入 JWT 含有 JWKS 集合中的金鑰 ID,那麼政策 將使用正確的公開金鑰驗證 JWS/JWT 簽章。
以下是選用元素及其值的範例:
- alg - 金鑰演算法。必須與 JWS/JWT 中的簽署演算法相符。
- use:如果有這個目錄,則必須 ssig。
下列 JWKS 包含必要元素和值,且在 Edge 上的有效值 (來自 https://www.googleapis.com/oauth2/v3/certs):
{ "keys":[ { "kty":"RSA", "alg":"RS256", "use":"sig", "kid":"ca04df587b5a7cead80abee9ea8dcf7586a78e01", "n":"iXn-WmrwLLBa-QDiToBozpu4Y4ThKdwORWFXQa9I75pKOvPUjUjE2Bk05TUSt7-V7KDjCq0_Nkd-X9rMRV5LKgCa0_F8YgI30QS3bUm9orFryrdOc65PUIVFVxIwMZuGDY1hj6HEJVWIr0CZdcgNIll06BasclckkUK4O-Eh7MaQrqb646ghFlG3zlgk9b2duHbDOq3s39ICPinRQWC6NqTYfqg7E8GN_NLY9srUCc_MswuUfMJ2cKT6edrhLuIwIj_74YGkpOwilr2VswKsvJ7dcoiJxheKYvKDKtZFkbKrWETTJSGX2Xeh0DFB0lqbKLVvqkM2lFU2Qx1OgtTnrw", "e":"AQAB" }, { "kty":"EC", "alg":"ES256", "use":"enc", "kid":"k05TUSt7-V7KDjCq0_N" "crv":"P-256", "x":"Xej56MungXuFZwmk_xccvsMpCtXmqhvEEMCmHyAmKF0", "y":"Bozpu4Y4ThKdwORWFXQa9I75pKOvPUjUjE2Bk05TUSt", } ] }
將 Proxy 設計為 使用 JWKS
如果從核發者取得 JWS/JWT,通常會將金鑰 ID (或兒童) 插入 JWS/JWT 中。 標題。金鑰會向 JWS/JWT 的接收者說明如何找到 透過已簽署的 JWS/JWT 驗證簽名。
舉例來說,假設核發者使用私密金鑰簽署 JWT,「金鑰 ID」代表了 用於驗證 JWT 的相符公開金鑰。公開金鑰清單通常位於 一些廣為人知的端點,例如:https://www.googleapis.com/oauth2/v3/certs。
這是 Edge (或任何支援 JWKS 的平台) 需要執行的基本序列 來處理具有 JWKS 的 JWS/JWT:
- 檢查 JWS/JWT 標頭,找出金鑰 ID (kid)。
- 檢查 JWS/JWT 標頭,找出簽署演算法 (alg),例如 RS256。
- 從指定核發機構已知端點的 JWKS 中擷取金鑰和 ID 清單。
- 從金鑰清單擷取公開金鑰 ID,該金鑰 ID 會列於 JWS/JWT 標頭中 並使用比對演算法,前提是 JWKS 金鑰必須指定演算法。
- 使用這個公開金鑰驗證 JWS/JWT 上的簽名。
身為 Edge API Proxy 開發人員,您必須執行下列操作,才能進行 JWS/JWT 驗證:
- 從指定核發機構的已知端點擷取金鑰和 ID 清單。你可以 請為這個步驟使用服務呼叫政策。
- 在「Verify JWS/JWT」政策中,在
<Source>
中指定 JWS/JWT 的位置 元素以及<PublicKey/JWKS>
元素中的 JWKS 酬載。例如: 建立 VerifyJWT 政策:<VerifyJWT name="JWT-Verify-RS256"> <Algorithm>RS256</Algorithm> <Source>json.jwt</Source> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <PublicKey> <JWKS ref="public.jwks"/> </PublicKey> <Subject>apigee-seattle-hatrack-montage</Subject> <Issuer>urn://apigee-edge-JWT-policy-test</Issuer> <Audience>urn://c60511c0-12a2-473c-80fd-42528eb65a6a</Audience> <AdditionalClaims> <Claim name="show">And now for something completely different.</Claim> </AdditionalClaims> </VerifyJWT>
Verify JWT 政策會執行其他動作:
- 如果在 JWKS,Verify JWT 政策會擲回錯誤,也不會驗證 JWT。
- 如果傳入 JWT 在標頭中找不到金鑰 ID (kid),則 不可使用 keyid-to-verification-key。
身為 Proxy 設計人員,您必須負責決定要使用的鍵;在某些情況下 可能是固定的硬式編碼金鑰。