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ẻ 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 được kết nối. Chính sách JWS/JWT cho phép proxy API Edge:

  • Tạo một JWT hoặc JWS đã ký.
  • Xác minh một JWT hoặc JWS đã ký và các tuyên bố trong JWS/JWT.
  • Giải mã một JWT hoặc JWS đã ký mà không cần xác thực chữ ký.

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

Khi bạn sử dụng chính sách Verify JWS/JWT, một JWS/JWT không hợp lệ sẽ bị từ chối và dẫn đến tình trạng lỗi. Tương tự, khi sử dụng chính sách Decode JWS/JWT, JWS/JWT không đúng định dạng sẽ dẫn đến tình trạng lỗi.

Video

Hãy xem video ngắn để biết nhanh về JWT. Mặc dù video này dành riêng cho việc tạo JWT, nhưng nhiều khái niệm giống nhau cho JWS.

Đây là một video ngắn giúp bạ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 các chính sách JWS/JWT để:

  • Tạo một JWS/JWT mới trên proxy hoặc phía điểm cuối mục tiêu của proxy Edge. Ví dụ: bạn có thể tạo một luồng yêu cầu proxy để tạo JWS/JWT và trả về JWS/JWT cho máy khách. Hoặc bạn có thể thiết kế một proxy để nó tạo JWS/JWT trên luồng yêu cầu mục tiêu và đính kèm proxy đó vào yêu cầu được gửi tới mục tiêu. Sau đó, các thông báo xác nhận quyền sở hữu đó sẽ có sẵn để cho phép các dịch vụ phụ trợ áp dụng quy trình xử lý bảo mật hơn nữa.
  • Xác minh và trích xuất 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 ứng dụng đến, từ phản hồi dịch vụ mục tiêu, từ phản hồi của chính sách 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, cho dù JWS/JWT do bên thứ ba tạo hay do chính Edge tạo thông qua thuật toán RSA hoặc HMAC.
  • Giải mã JWS/JWT. Giải mã hữu ích nhất khi được dùng cùng với chính sách Verify JWS/JWT, khi phải xác định được giá trị của một thông báo xác nhận (JWT) hoặc tiêu đề (JWS/JWT) trong JWS/JWT trước khi xác minh JWS/JWT.

Các phần của JWS/JWT

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

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

JWS cũng hỗ trợ định dạng detached bỏ qua tải trọng khỏi JWS:

header..signature

Với JWS có thể tách rời, tải trọng sẽ được gửi riêng biệt với JWS. Bạn sẽ sử dụng phần tử <DetachedContent> của chính sách Verify 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 và cách mã hoá cũng như ký, 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ẻ 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. Điểm khác biệt chính giữa hai tập hợp này là cách thể hiện tải trọng:

  • JWT
    • Tải trọng luôn là đối tượng JSON
    • Tải trọng luôn được gắn 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
    • Không cần đính kèm tải trọng vào JWS

Vì định dạng JWT luôn sử dụng đối tượng JSON để đại diện cho tải trọng, nên các chính sách Tạo JWT và Xác minh JWT đã 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à các chính sách khác. Điều đó có nghĩa là bạn có thể sử dụng các phần tử của chính sách Tạo JWT để đặt những thông báo xác nhận quyền sở hữu này trong tải trọng, và các phần tử của chính sách Verify JWT (Xác minh JWT) để xác minh giá trị của các phần tử đó. Hãy xem phần Tên khiếu nại đã đăng ký trong 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 thông báo xác nhận quyền sở hữu đã đăng ký, chính sách Tạo JWT còn trực tiếp hỗ trợ việc thêm các 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à kiểu số, boolean, chuỗi, bản đồ hoặc mảng.

Vì JWS có thể sử dụng bất kỳ dữ liệu biểu diễn nào cho tải trọng, nên bạn không thể thêm 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ợ tải trọng có thể tách rời, trong đó JWS bỏ qua tải trọng. Tải trọng rời cho phép bạn gửi JWS và tải trọng riêng biệt, đồng thời yêu cầu này được yêu cầu trong một số tiêu chuẩn bảo mật.

Giới thiệu về 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 giá trị tổng kiểm SHA2 của độ 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 chữ ký (còn 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á. Với chữ ký RSA, bên ký sử dụng khoá riêng tư RSA để ký JWS/JWT, còn bên xác minh 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 các phím.

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 một cặp khoá công khai/riêng tư RSA 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ử dụng khoá công khai 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 phím.

Thuật toán ECDSA

Thuật toán chữ ký số cho đường cong Elliptic (ECDSA) là thuật toán mã hoá đường cong elip 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ư mà bạn phải chỉ định:

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

Thuật toán mã hoá khoá

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

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 cách để cung cấp khoá công khai cho các chính sách xác minh JWS/JWT:

  • 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
  • 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 Khoá web JSON (JWK). JWK là một cấu trúc 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 ở 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 khoá, chẳng hạn như "RSA" hoặc "EC". Ví dụ: tuỳ thuộc vào loại khoá, các tham 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ị tuỳ ý bất kỳ (không có giá trị trùng lặp trong một tập hợp khoá). Nếu JWT đến có mã nhận dạng khoá có trong tập hợp JWKS, thì chính sách này sẽ sử dụng khoá công khai chính xác để 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 các phần tử đó:

  • alg – Thuật toán chính. Tên này phải khớp với thuật toán ký trong JWS/JWT.
  • use – Nếu có, bạn phải sig.

Các JWKS sau đây bao gồm các phần tử và giá trị bắt buộc, đồng thời sẽ hợp lệ 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 lấy JWS/JWT từ ứng dụng phát hành, thường thì trình phát hành sẽ chèn Mã khoá (hoặc con) vào tiêu đề JWS/JWT. Khoá này cho người nhận JWS/JWT 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ử một tổ chức phát hành ký JWT bằng một khoá riêng tư. "Mã khoá" xác định khoá công khai trùng khớp cần dùng để xác minh JWT. Danh sách các 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 để hoạt động với JWS/JWT có JWKS:

  1. Kiểm tra tiêu đề JWS/JWT để tìm Mã 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 của một nhà phát hành cụ thể.
  4. Trích xuất khoá công khai từ danh sách khoá có mã nhận dạng khoá được ghi chú trong tiêu đề JWS/JWT và bằng 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 Edge, bạn cần làm như sau để thực hiện xác minh JWS/JWT:

  1. Truy xuất danh sách các khoá và mã nhận dạng từ đ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 về Chú thích dịch vụ cho bước này.
  2. Trong chính sách Verify JWS/JWT, hãy chỉ định vị trí của JWS/JWT trong phần tử <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 sẽ làm mọi việc khác:

  • Nếu không tìm thấy khoá có Mã khoá khớp với Mã khoá (kid) đã xác nhận trong JWT 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 có mã khoá (kid) trong tiêu đề, thì bạn không thể liên kết khoá keyid-to-verification-key này.

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