JWS 和 JWT 政策總覽

查看 Apigee Edge 說明文件。
前往 Apigee X說明文件
資訊

本主題提供關於 JWT (JSON Web Token) 的一般資訊 和 JWS (JSON Web Signature) 及 Apigee JWS/JWT 政策。

簡介

JWS 和 JWT 通常用於在連線之間共用憑證附加資訊或斷言 應用程式。JWS/JWT 政策可讓 Edge API Proxy 執行下列操作:

  • 產生已簽署的 JWTJWS
  • 驗證已簽署的 JWT 也就是 JWS/JWT 內的憑證附加資訊或 JWS
  • 將已簽署的 JWT 解碼JWS

在後兩個情況中,這項政策也會設定允許額外政策的變數,或 來檢查已驗證的聲明,並依據這些要求制定決策 著作權聲明。

使用「驗證 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> 元素指定。

如要進一步瞭解符記的編碼和簽署方式,請參閱:

JWS 和 JWT 之間的差異

您可以使用 JWT 或 JWS,在已連結的應用程式之間共用憑證附加資訊或斷言。 兩者的主要差異在於酬載的表示法:

  • JWT
    • 酬載一律為 JSON 物件
    • 酬載一律會附加至 JWT
    • 符記的 typ 標頭一律設為 JWT
  • JWS
    • 酬載可以用任何格式表示,例如 JSON 物件、位元組串流、八位元串流及其他
    • 酬載不一定要附加至 JWS

由於 JWT 格式一律使用 JSON 物件來代表酬載,因此 Edge Generate JWT 和 JWT 政策皆內建支援,可處理常見的註冊要求名稱,例如 audisssub 等。也就是說,您可以使用 產生 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:

  1. 檢查 JWS/JWT 標頭,找出金鑰 ID (kid)。
  2. 檢查 JWS/JWT 標頭,找出簽署演算法 (alg),例如 RS256。
  3. 從指定核發機構已知端點的 JWKS 中擷取金鑰和 ID 清單。
  4. 從金鑰清單擷取公開金鑰 ID,該金鑰 ID 會列於 JWS/JWT 標頭中 並使用比對演算法,前提是 JWKS 金鑰必須指定演算法。
  5. 使用這個公開金鑰驗證 JWS/JWT 上的簽名。

身為 Edge API Proxy 開發人員,您必須執行下列操作,才能進行 JWS/JWT 驗證:

  1. 從指定核發機構的已知端點擷取金鑰和 ID 清單。你可以 請為這個步驟使用服務呼叫政策。
  2. 在「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 設計人員,您必須負責決定要使用的鍵;在某些情況下 可能是固定的硬式編碼金鑰。