Tổng quan về chính sách JWS và JWT

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến Tài liệu về Apigee X.
thông tin

Chủ đề này cung cấp thông tin chung về JWT (Mã thông báo web JSON) và JWS (Chữ ký web JSON) cũng như các chính sách của Apigee JWS/JWT mà các nhà phát triển proxy Apigee có thể quan tâm.

Giới thiệu

Cả JWS và JWT thường được dùng để chia sẻ các xác nhận quyền sở hữu hoặc câu nhận định giữa các . Chính sách JWS/JWT cho phép các proxy API của Edge:

  • Tạo một JWT đã ký hoặc JWS.
  • Xác minh JWT đã ký hoặc JWS và các thông báo xác nhận quyền sở hữu trong JWS/JWT.
  • Giải mã JWT đã ký hoặc JWS mà không xác thực chữ ký.

Trong hai trường hợp sau, chính sách cũng đặt các biến cho phép các chính sách bổ sung hoặc các dịch vụ phụ trợ, để kiểm tra những tuyên bố đã được xác thực và đưa ra quyết định dựa trên những tuyên bố đó xác nhận quyền sở hữu.

Khi bạn sử dụng chính sách Xác minh JWS/JWT, một JWS/JWT không hợp lệ sẽ bị từ chối và xảy ra lỗi . Tương tự, khi bạn sử dụng chính sách Giải mã JWS/JWT, giá trị JWS/JWT không đúng định dạng sẽ dẫn đến lỗi .

Video

Hãy xem video ngắn để tìm hiểu nhanh về JWT. Trong khi video này đang để tạo JWT, nhiều khái niệm cũng giống nhau đối với JWS.

Đây là một video ngắn để tìm hiểu thêm về cấu trúc JWT.

Trường hợp sử dụng

Bạn có thể dùng chính sách JWS/JWT để:

  • Tạo JWS/JWT mới trên proxy hoặc phía điểm cuối mục tiêu của proxy Edge. Cho Ví dụ: bạn có thể tạo một luồng yêu cầu proxy để tạo JWS/JWT rồi trả về cho máy khách. Hoặc bạn có thể thiết kế một proxy để proxy này tạo ra JWS/JWT trên luồng yêu cầu mục tiêu và đính kèm nó vào yêu cầu được gửi đến mục tiêu. Sau đó, các thông báo xác nhận quyền sở hữu đó sẽ xuất hiện các dịch vụ phụ trợ để áp dụng thêm các quy trình xử lý bảo mật khác.
  • Xác minh và trích xuất các thông báo xác nhận quyền sở hữu từ JWS/JWT nhận được từ các yêu cầu của máy khách đến từ đích ý kiến phản hồi về dịch vụ, từ phản hồi cho chính sách về Chú thích dịch vụ hoặc từ các nguồn khác. Edge sẽ xác minh chữ ký trên JWS/JWT, xem JWS/JWT là do bên thứ ba tạo hay do Edge tạo sử dụng thuật toán RSA hoặc HMAC.
  • Giải mã JWS/JWT. Việc giải mã hữu ích nhất khi được sử dụng cùng với chính sách Xác minh JWS/JWT, khi Bạn phải biết giá trị của thông báo xác nhận quyền sở hữu (JWT) hoặc tiêu đề (JWS/JWT) trong JWS/JWT trước khi xác minh JWS/JWT.

Các thành phần của JWS/JWT

JWS/JWT đã ký mã hoá thông tin thành 3 phần được phân tách bằng dấu chấm: tiêu đề, phần tải trọng và phần tử chữ ký:

header.payload.signature
  • Chính sách Tạo JWS/JWT tạo ra cả 3 phần.
  • Chính sách Xác minh JWS/JWT kiểm tra cả 3 phần.
  • Chính sách Giải mã JWS/JWT chỉ kiểm tra tiêu đề và tải trọng.

JWS cũng hỗ trợ định dạng phân tách để loại bỏ tải trọng khỏi JWS:

header..signature

Với JWS tách biệt, tải trọng sẽ được gửi riêng biệt với JWS. Bạn sử dụng Phần tử <DetachedContent> của chính sách Xác minh JWS để chỉ định tải trọng JWS thô, chưa mã hoá. Sau đó, chính sách Xác minh JWS sẽ xác minh JWS bằng cách sử dụng tiêu đề và chữ ký trong JWS và tải trọng do phần tử <DetachedContent> chỉ định.

Để tìm hiểu thêm về mã thông báo cũng như cách mã hoá và ký mã, hãy xem:

Sự khác biệt giữa JWS và JWT

Bạn có thể sử dụng JWT hoặc JWS để chia sẻ thông báo xác nhận quyền sở hữu hoặc câu nhận định giữa các ứng dụng đã kết nối. Sự khác biệt chính giữa hai phần này là cách thể hiện tải trọng:

  • JWT
    • Tải trọng luôn là một đối tượng JSON
    • Tải trọng luôn được đính kèm vào JWT
    • Tiêu đề typ của mã thông báo luôn được đặt thành JWT
  • JWS
    • Tải trọng có thể được biểu thị bằng bất kỳ định dạng nào, chẳng hạn như đối tượng JSON, luồng byte, luồng octet và các định dạng khác
    • Tải trọng không phải được gắn với JWS

Vì định dạng JWT luôn sử dụng đối tượng JSON để biểu thị tải trọng, nên Edge Generate JWT và chính sách Xác minh JWT được tích hợp sẵn hỗ trợ để xử lý các Tên xác nhận quyền sở hữu đã đăng ký phổ biến, chẳng hạn như aud, iss, sub, v.v. Điều đó có nghĩa là bạn có thể sử dụng các phần tử của Tạo chính sách JWT để đặt các thông báo này trong tải trọng và các phần tử của chính sách Xác minh JWT để xác minh giá trị của các thông báo đó. Xem Tên xác nhận quyền sở hữu đã đăng ký của phần thông số kỹ thuật JWT để biết thêm thông tin.

Cùng với việc hỗ trợ một số Tên xác nhận quyền sở hữu đã đăng ký, chính sách Tạo JWT trực tiếp hỗ trợ thêm thông báo xác nhận quyền sở hữu có tên tuỳ ý vào JWT. Mỗi xác nhận quyền sở hữu là một cặp tên/giá trị đơn giản, trong đó giá trị có thể là số loại, boolean, chuỗi, ánh xạ hoặc mảng.

Vì JWS có thể sử dụng bất kỳ cách biểu diễn dữ liệu nào cho tải trọng nên bạn không thể thêm thông báo xác nhận quyền sở hữu vào tải trọng đó. Chính sách Tạo JWS có hỗ trợ việc thêm thông báo xác nhận quyền sở hữu có tên tuỳ ý vào tiêu đề của JWS. Ngoài ra, các chính sách JWS hỗ trợ một tải trọng tách rời, trong đó JWS sẽ bỏ qua phần tải trọng này. Tải trọng tách rời cho phép bạn gửi JWS và tải trọng một cách riêng biệt, theo yêu cầu của một số tiêu chuẩn bảo mật.

Giới thiệu về các thuật toán chữ ký

Các chính sách Xác minh JWS/JWT và Tạo JWS/JWT hỗ trợ các thuật toán RSA, RSASSA-PSS, ECDSA và HMAC, sử dụng SHA2 tổng kiểm tra độ mạnh bit 256, 384, hoặc 512. Chính sách Giải mã JWS/JWT hoạt động bất kể thuật toán dùng để ký JWS/JWT.

Thuật toán HMAC

Thuật toán HMAC dựa trên một khoá bí mật dùng chung, còn gọi là khoá bí mật, để tạo ký (còn được gọi là ký JWS/JWT) và để xác minh chữ ký.

Độ dài tối thiểu của khoá bí mật phụ thuộc vào độ mạnh bit của thuật toán:

  • HS256: Độ dài khoá tối thiểu 32 byte
  • HS386: Độ dài khoá tối thiểu 48 byte
  • HS512: Độ dài khoá tối thiểu 64 byte

Thuật toán RSA

Thuật toán RSA sử dụng một cặp khoá công khai/riêng tư cho chữ ký mã hoá. Có nhân viên bán lẻ chữ ký, bên ký sẽ sử dụng khoá riêng tư RSA để ký JWS/JWT và bên xác minh sẽ sử dụng khoá công khai RSA trùng khớp để xác minh chữ ký trên JWS/JWT. Không có yêu cầu về kích thước đối với khoá.

Thuật toán RSASSA-PSS

Thuật toán RSASSA-PSS là bản cập nhật cho thuật toán RSA. Giống như RSS, RSASSA-PSS sử dụng RSA cặp khoá công khai/riêng tư cho chữ ký mã hoá. Định dạng của khoá giống với định dạng của RSS. Bên ký sử dụng một khoá riêng tư để ký JWS/JWT và bên xác minh sẽ sử dụng mã so khớp khoá công khai để xác minh chữ ký trên JWS/JWT. Không có yêu cầu về kích thước đối với khoá.

Thuật toán ECDSA

Thuật toán chữ ký số đường cong elip (ECDSA) là một thuật toán mã hoá đường cong elip một thuật toán cụ thể với đường cong P-256, P-384 và P-521. Khi bạn sử dụng thuật toán ECDSA, thuật toán sẽ xác định loại khoá công khai và riêng tư bạn phải chỉ định:

Thuật toán Đường cong Yêu cầu đối với khoá
ES256 P-256 Một khoá được tạo từ đường cong P-256 (còn được gọi là secp256r1 hoặc hay Prime256v1)
ES384 P-384 Một khoá được tạo từ đường cong P-384 (còn được gọi là secp384r1)
ES512 P-521 Một khoá được tạo từ đường cong P-521 (còn được gọi là secp521r1)

Các thuật toán mã hoá khoá

Các chính sách JWS/JWT hỗ trợ tất cả thuật toán mã hoá khoá được hỗ trợ bởi OpenSSL.

Sử dụng Bộ khoá web JSON (JWKS) để xác minh JWS/JWT

Khi xác minh JWS/JWT đã ký, bạn cần cung cấp khoá công khai liên kết với khoá riêng tư dùng để ký mã thông báo. Bạn có hai lựa chọn cho cung cấp khoá công khai cho chính sách JWS/JWT xác minh:

  • sử dụng giá trị khoá công khai thực tế (thường được cung cấp trong một biến luồng) hoặc
  • hãy sử dụng khoá công khai được gói trong JWKS.

Giới thiệu về JWKS

JWKS là một cấu trúc JSON đại diện cho một tập hợp các Khoá web JSON (JWKS). JWK là dữ liệu JSON đại diện cho một khoá mã hoá. JWK và JWKS được mô tả trong RFC7517. Xem ví dụ về JKWS tại Phụ lục A. Ví dụ về bộ khoá web JSON

Cấu trúc JWKS

RFC7517 mô tả các phần tử chính JWKS cho từng loại phím, chẳng hạn như "RSA" hoặc "EC". Ví dụ: tuỳ thuộc vào loại khoá, các thông số này có thể bao gồm:

  • kty – Loại khoá, chẳng hạn như "RSA" hoặc "EC".
  • kid (mã khoá) – Có thể là giá trị bất kỳ tuỳ ý (không có giá trị trùng lặp trong một khoá) bộ). Nếu JWT thư đến có mã khoá có trong tập hợp JWKS, thì chính sách sẽ sử dụng đúng khoá công khai để xác minh chữ ký JWS/JWT.

Sau đây là ví dụ về các phần tử không bắt buộc và giá trị của chúng:

  • alg – Thuật toán khoá. Mã này phải khớp với thuật toán ký trong JWS/JWT.
  • use – Nếu có, phải là sig.

JWKS sau đây bao gồm các phần tử cũng như giá trị bắt buộc và sẽ có hiệu lực trên Edge (từ 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",
      }
   ]
}

Thiết kế proxy để sử dụng JWKS

Khi JWS/JWT được lấy từ một nhà phát hành, thường thì nhà phát hành đó sẽ chèn một Mã khoá (hoặc con) vào JWS/JWT . Khoá này cho người nhận biết cách tìm khoá công khai hoặc khoá bí mật cần thiết để xác minh chữ ký trên JWS/JWT đã ký.

Ví dụ: giả sử tổ chức phát hành ký JWT bằng một khoá riêng tư. "Mã khoá" xác định khớp với khoá công khai dùng để xác minh JWT. Danh sách khoá công khai thường có tại một số điểm cuối phổ biến, ví dụ: https://www.googleapis.com/oauth2/v3/certs.

Đây là trình tự cơ bản mà Edge (hoặc bất kỳ nền tảng nào hoạt động với JWKS) cần thực hiện để làm việc với JWS/JWT có JWKS:

  1. Kiểm tra tiêu đề JWS/JWT để tìm Mã nhận dạng khoá (trẻ em).
  2. Kiểm tra tiêu đề JWS/JWT để tìm thuật toán ký (alg), chẳng hạn như RS256.
  3. Truy xuất danh sách các khoá và mã nhận dạng qua JWKS của điểm cuối phổ biến đối với một nhà phát hành cụ thể.
  4. Trích xuất khoá công khai từ danh sách các khoá có mã nhận dạng khoá được ghi chú trong tiêu đề JWS/JWT còn với thuật toán so khớp, nếu khoá JWKS chỉ định thuật toán.
  5. Sử dụng khoá công khai đó để xác minh chữ ký trên JWS/JWT.

Là nhà phát triển proxy API của Edge, bạn cần làm như sau để xác minh JWS/JWT:

  1. Truy xuất danh sách khoá và mã nhận dạng qua điểm cuối phổ biến của một nhà phát hành cụ thể. Bạn có thể sử dụng chính sách Chú thích dịch vụ cho bước này.
  2. Trong chính sách Xác minh JWS/JWT, hãy chỉ định vị trí của JWS/JWT trong <Source> và tải trọng JWKS trong phần tử <PublicKey/JWKS>. Ví dụ: đối với chính sách 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>
    

Chính sách Xác minh JWT thực hiện mọi việc khác:

  • Nếu khoá có giá trị nhận dạng khoá khớp với giá trị nhận dạng khoá (trẻ em) được xác nhận trong JWT không được tìm thấy trong JWKS thì chính sách Xác minh JWT sẽ gửi lỗi và không xác thực JWT.
  • Nếu JWT đến không mang mã khoá (trẻ em) trong tiêu đề, thì ánh xạ này của không thể sử dụng keyid-to-verification-key.

Là nhà thiết kế proxy, bạn chịu trách nhiệm xác định khoá để sử dụng; trong một số trường hợp có thể là một khoá cố định, được cố định giá trị trong mã.