Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. Informacje
Ten temat zawiera ogólne informacje o tokenie sieciowym JWT (JSON Web Token) i JWS (JSON Web Signature) oraz zasadach Apigee JWS/JWT, które mogą zainteresować programistów serwerów proxy Apigee.
Wstęp
Do współdzielenia deklaracji i asercji między połączonymi aplikacjami zwykle używane są JWS i JWT. Zasady JWS/JWT umożliwiają serwerom proxy Edge API:
- Wygeneruj podpisany JWT lub JWS.
- Zweryfikuj podpisany JWT lub JWS oraz zgłoszenia w JWS/JWT.
- Zdekoduj podpisany JWT lub JWS bez weryfikowania podpisu.
W 2 ostatnich przypadkach zasada określa też zmienne, które zezwalają na dodatkowe zasady lub same usługi backendu na sprawdzanie zweryfikowanych deklaracji i podejmowanie decyzji na ich podstawie.
Jeśli użyjesz zasady weryfikacji JWS/JWT, nieprawidłowy token JWS/JWT zostanie odrzucony i pojawi się warunek błędu. Podobnie jeśli jest używana zasada dekodowania JWS/JWT, nieprawidłowy format JWS/JWT spowoduje błąd.
Filmy
Obejrzyj krótki film z krótkim wprowadzeniem do JWT. Ten film dotyczy generowania tokena JWT, ale wiele koncepcji jest takich samych w JWS.
Krótki film, który zawiera więcej informacji o strukturze JWT.
Przypadki użycia
Za pomocą zasad JWS/JWT możesz:
- Wygeneruj nowy JWS/JWT po stronie serwera proxy lub docelowego punktu końcowego serwera proxy Edge. Możesz na przykład utworzyć przepływ żądania serwera proxy, który generuje JWS/JWT i zwraca go klientowi. Możesz też zaprojektować serwer proxy tak, aby generował JWS/JWT w docelowym przepływie żądania i dołączył go do żądania wysyłanego do środowiska docelowego. Roszczenia te będą wtedy dostępne, aby umożliwić usługom backendu zastosowanie dalszego przetwarzania zabezpieczeń.
- Zweryfikuj i wyodrębnij deklaracje z JWS/JWT uzyskany z przychodzących żądań klienta, z odpowiedzi usługi docelowej, odpowiedzi zasad dotyczących wywołań usługi lub z innych źródeł. Edge sprawdzi podpis w JWS/JWT przy użyciu algorytmów RSA lub HMAC, niezależnie od tego, czy JWS/JWT został wygenerowany przez firmę zewnętrzną czy przez samą usługę Edge.
- Zdekoduj JWS/JWT. Dekodowanie jest najbardziej przydatne, gdy jest używane w połączeniu z zasadą weryfikacji JWS/JWT, gdy wartość deklaracji (JWT) lub nagłówka (JWS/JWT) z JWS/JWT musi być znana przed zweryfikowaniem JWS/JWT.
Elementy JWS/JWT
Podpisany JWS/JWT koduje informacje w 3 częściach rozdzielonych kropkami: nagłówek, ładunek i podpis:
header.payload.signature
- Zasada Wygeneruj JWS/JWT tworzy wszystkie 3 części.
- Zasada weryfikacji JWS/JWT sprawdza wszystkie 3 części.
- Zasada Decode JWS/JWT sprawdza tylko nagłówek i ładunek.
JWS obsługuje też format detached, który pomija ładunek z JWS:
header..signature
Po odłączeniu JWS ładunek jest wysyłany niezależnie od JWS. Do określenia nieprzetworzonego, niezakodowanego ładunku JWS służy element <DetachedContent>
zasady weryfikacji JWS.
Następnie zasada weryfikacji JWS weryfikuje JWS przy użyciu nagłówka i podpisu w JWS oraz ładunku określonym przez element <DetachedContent>
.
Więcej informacji o tokenach oraz sposobie ich kodowania i podpisywania znajdziesz tutaj:
- JWT: IETF RFC7519
- JWS: IETF RFC7515
Różnice między JWS a JWT
Do współdzielenia deklaracji lub asercji między połączonymi aplikacjami możesz używać tokena JWT lub JWS. Główna różnica między nimi polega na reprezentacji ładunku:
- JWT
- Ładunek to zawsze obiekt JSON
- Ładunek jest zawsze podłączony do tokena JWT
- Nagłówek
typ
tokena jest zawsze ustawiony naJWT
- JWS
- Ładunek może być reprezentowany w dowolnym formacie, takim jak obiekt JSON, strumień bajtów czy strumień oktetu.
- Ładunek nie musi być podłączony do JWS
Format JWT zawsze używa obiektu JSON do reprezentowania ładunku, dlatego zasady Edge Wygeneruj token JWT i Zweryfikuj tokeny JWT obsługują teraz typowe zarejestrowane nazwy roszczeń, takie jak aud, iss, sub i inne. Oznacza to, że możesz użyć elementów zasady generowania tokena JWT, aby ustawić te deklaracje w ładunku, oraz elementów zasady weryfikacji JWT, aby zweryfikować ich wartości. Więcej informacji znajdziesz w sekcji Zarejestrowane nazwy roszczenia w specyfikacji JWT.
Oprócz obsługi określonych zarejestrowanych nazw roszczeń zasada Wygeneruj token JWT bezpośrednio obsługuje dodawanie do tokena JWT deklaracji z dowolnymi nazwami. Każde żądanie składa się z prostej pary nazwa/wartość, której wartością może być liczba, wartość logiczna, ciąg znaków, mapa lub tablica.
JWS może korzystać z dowolnej reprezentacji danych dla ładunku, więc nie można do niego dodawać deklaracji. Zasada Wygeneruj JWS obsługuje dodawanie deklaracji z dowolnymi nazwami do nagłówka pliku JWS. Zasady JWS obsługują też ładunek odłączony, w przypadku którego JWS go pomija. Ładunek odłączony umożliwia osobne wysyłanie JWS i ładunku. Jest on wymagany przez kilka standardów bezpieczeństwa.
Informacje o algorytmach podpisu
Zasady weryfikacji JWS/JWT i funkcji generowania JWS/JWT obsługują algorytmy RSA, RSASSA-PSS, ECDSA i HMAC, używając sum kontrolnych SHA2 o długości bitów 256, 384 lub 512. Zasada dekodowania JWS/JWT działa niezależnie od algorytmu użytego do podpisania JWS/JWT.
Algorytm HMAC
Algorytm HMAC korzysta z udostępnionego obiektu tajnego, zwanego kluczem obiektu tajnego, do tworzenia podpisu (nazywanego też podpisywaniem JWS/JWT) i weryfikacji podpisu.
Minimalna długość tajnego klucza zależy od siły bitowej algorytmu:
- HS256: minimalna długość klucza: 32 bajty
- HS386: minimalna długość klucza: 48 bajtów
- HS512: minimalna długość klucza wynosi 64 bajty
Algorytm RSA
Algorytm RSA wykorzystuje parę kluczy (publiczny i prywatny) do podpisu kryptograficznego. W przypadku podpisów RSA strona podpisująca używa klucza prywatnego RSA do podpisywania JWS/JWT, a osoba weryfikująca używa pasującego klucza publicznego RSA do weryfikacji podpisu w JWS/JWT. Nie ma wymagań dotyczących rozmiaru kluczy.
Algorytm RSASSA-PSS
Algorytm RSASSA-PSS jest aktualizacją algorytmu RSA. Podobnie jak w przypadku RSS, RSASSA-PSS korzysta z pary kluczy publiczny/prywatny RSA do podpisu kryptograficznego. Format klucza jest taki sam jak w przypadku RSS. Strona podpisująca używa klucza prywatnego do podpisywania JWS/JWT, a osoba weryfikująca używa pasującego klucza publicznego do weryfikacji podpisu na JWS/JWT. Nie ma wymagań dotyczących rozmiaru kluczy.
Algorytm ECDSA
Algorytm podpisu cyfrowego wykorzystujący krzywe eliptyczne (Elliptic Curve Digital Signature Algorithm, ECDSA) to algorytm kryptograficzny oparty na krzywych eliptycznych z krzywą P-256, P-384 i P-521. Gdy używasz algorytmów ECDSA, algorytm określa typ klucza publicznego i prywatnego, który musisz określić:
Algorytm | Krzywa | Kluczowe wymaganie |
---|---|---|
ES256 | P-256 | Klucz wygenerowany na podstawie krzywej P-256 (nazywany też secp256r1 lub prime256v1) |
ES384 | P-384 | Klucz wygenerowany na podstawie krzywej P-384 (znany też jako secp384r1) |
ES512 | P-521 | Klucz wygenerowany na podstawie krzywej P-521 (znanej też jako secp521r1) |
Algorytmy szyfrowania klucza
Zasady JWS/JWT obsługują wszystkie algorytmy szyfrowania kluczy obsługiwane przez OpenSSL.
Używanie zestawu kluczy internetowych JSON (JWKS) do weryfikacji JWS/JWT
Gdy weryfikujesz podpisany JWS/JWT, musisz podać klucz publiczny powiązany z kluczem prywatnym używanym do podpisania tokena. Możesz udostępnić klucz publiczny do weryfikacji zasad JWS/JWT na 2 sposoby:
- użyj rzeczywistej wartości klucza publicznego (zwykle podawanej w zmiennej przepływu) lub
- użyć klucza publicznego opakowanego w kod JWKS.
Informacje o JWKS
JWKS to struktura JSON, która reprezentuje zestaw kluczy internetowych JSON (JWK). JWK to struktura danych JSON, która reprezentuje klucz kryptograficzny. JWK i JWKS zostały opisane w RFC7517. Zobacz przykłady JKWS w Dodatku A. Przykładowe zestawy kluczy internetowych JSON
Struktura JWKS
RFC7517 opisuje kluczowe elementy JWKS dla każdego typu klucza, np. „RSA” lub „EC”. W zależności od typu klucza parametry mogą obejmować:
- kty – typ klucza, np. „RSA” lub „EC”.
- kid (identyfikator klucza) – może być dowolną wartością (bez duplikatów w zestawie kluczy). Jeśli przychodzący token JWT nosi identyfikator klucza, który znajduje się w zestawie JWKS, zasada użyje odpowiedniego klucza publicznego do zweryfikowania podpisu JWS/JWT.
Oto przykłady elementów opcjonalnych i ich wartości:
- alg – algorytm klucza. Musi być zgodny z algorytmem podpisywania w JWS/JWT.
- use – jeśli występuje, musi być sig.
Ten JWKS zawiera wymagane elementy i wartości i jest prawidłowy w przeglądarce Edge (z 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", } ] }
Zaprojektowanie serwera proxy do używania JWKS
Po uzyskaniu tokena JWS/JWT od wydawcy wydawca często wstawia identyfikator klucza (lub podmiotu podrzędnego) w nagłówku JWS/JWT. Klucz informuje odbiorcę JWS/JWT, jak znaleźć klucz publiczny lub tajny wymagany do zweryfikowania podpisu w podpisanym JWS/JWT.
Załóżmy na przykład, że wydawca podpisuje JWT za pomocą klucza prywatnego. „Identyfikator klucza” wskazuje pasujący klucz publiczny do weryfikacji tokena JWT. Lista kluczy publicznych jest zwykle dostępna w znanym punkcie końcowym, na przykład https://www.googleapis.com/oauth2/v3/certs.
Oto podstawowa sekwencja, którą musi wykonać Edge (lub dowolna platforma współpracująca z JWKS), aby współpracować z JWS/JWT, który ma JWKS:
- Sprawdź nagłówek JWS/JWT, aby znaleźć identyfikator klucza (kid).
- Sprawdź nagłówek JWS/JWT, aby znaleźć algorytm podpisywania (alg), np. RS256.
- Pobierz listę kluczy i identyfikatorów z JWKS dobrze znanego punktu końcowego danego wydawcy.
- Wyodrębnij klucz publiczny z listy kluczy o identyfikatorze klucza wskazanym w nagłówku JWS/JWT i z algorytmem dopasowania, jeśli klucz JWKS określa algorytm.
- Użyj tego klucza publicznego, aby zweryfikować podpis na JWS/JWT.
Jeśli jesteś deweloperem serwera proxy Edge API, musisz wykonać te czynności, aby przeprowadzić weryfikację JWS/JWT:
- Pobierz listę kluczy i identyfikatorów ze znanego punktu końcowego danego wydawcy. W tym kroku możesz użyć zasady dotyczącej objaśnienia usługi.
- W zasadzie weryfikacji JWS/JWT określ lokalizację JWS/JWT w elemencie
<Source>
i ładunku JWKS w elemencie<PublicKey/JWKS>
. Na przykład w przypadku zasady Verification JWT:<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>
Zasada weryfikacji JWT wykonuje wszystkie pozostałe czynności:
- Jeśli w JWKS nie znaleziono klucza z identyfikatorem klucza zgodnym z identyfikatorem klucza (kid) podanym w tokenie JWT, zasada Weryfikacja JWT zgłasza błąd i nie weryfikuje tokena JWT.
- Jeśli przychodzący token JWT nie zawiera w nagłówku identyfikatora klucza (kid), mapowanie identyfikatora keyid-to-verification-key jest niemożliwe.
Jako projektant serwera proxy odpowiadasz za wybór klucza do użycia. W niektórych przypadkach może to być stały, zakodowany na stałe klucz.