Diese Seite gilt für Apigee und Apigee Hybrid.
Apigee Edge-Dokumentation aufrufen
Was
Generiert ein signiertes JWS mit einem konfigurierbaren Satz von Anforderungen. Das JWT kann dann an Clients zurückgegeben, an Back-End-Ziele übertragen oder auf andere Weise genutzt werden. Eine detaillierte Einführung finden Sie unter Übersicht über JWS- und JWT-Richtlinien.
Informationen zu den Teilen einer JWS und deren Verschlüsselung und Signatur finden Sie unter RFC7515.
Diese Richtlinie ist eine erweiterbare Richtlinie, deren Verwendung je nach Apigee-Lizenz Auswirkungen auf die Kosten oder die Nutzung haben kann. Informationen zu Richtlinientypen und Auswirkungen auf die Nutzung finden Sie unter Richtlinientypen.
Video
In diesem kurzen Video erfahren Sie, wie Sie ein signiertes JWT generieren. Obwohl dieses Video speziell für die Generierung eines JWT gedacht ist, sind viele der Konzepte für JWS identisch.
Beispiele
Eine mit HS256 signierte JWS generieren
Diese Beispielrichtlinie generiert eine JWS, die mit dem HS256-Algorithmus signiert wurde. HS256 stützt sich auf ein gemeinsames Secret für die Signatur und die Verifizierung der Signatur. Diese JWS verwendet „angehängte” Inhalte, d. h., der codierte Header, die Nutzlast und die Signatur werden durch Punkte verkettet, um die endgültige JWS zu erzeugen:
[header].[payload].[signature]
Mit dem Element <Payload>
geben Sie die nicht codierte JWS-Rohnutzlast an.
In diesem Beispiel enthält eine Variable die Nutzlast. Wenn diese Richtlinienaktion ausgelöst wird, codiert Apigee den JWS-Header und die Nutzlast und fügt dann die codierte Signatur hinzu, um die JWS digital zu signieren.
Die folgende Richtlinienkonfiguration erstellt eine JWS aus einer Nutzlast, die in der Variablen my-payload
enthalten ist, und speichert die resultierende JWS in der Variablen output-variable
.
<GenerateJWS name="JWS-Generate-HS256"> <DisplayName>JWS Generate HS256</DisplayName> <Algorithm>HS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <SecretKey> <Value ref="private.secretkey"/> <Id>1918290</Id> </SecretKey> <Payload ref="my-payload"/> <OutputVariable>output-variable</OutputVariable> </GenerateJWS>
Ein mit HS256 signiertes JWT generieren
In diesem Beispiel wird auch eine JWS mit angehängten Inhalten generiert, die mit dem HS256-Algorithmus signiert wurden. In diesem Fall ist die Nutzlast JSON. Wenn Sie den typ
-Header auf JWT setzen, wird ein signiertes JWS ausgegeben, das auch ein signiertes JWT ist.
(Referenz)
Die folgende Richtlinienkonfiguration erstellt eine JWS aus einer Nutzlast, die in der Variablen json-content
enthalten ist, und speichert die resultierende JWS in der Variablen output-variable
. Das Ergebnis ist nur dann ein signiertes JWT, wenn die Variable json-content
eine JSON-Nutzlast enthält und die Attribute innerhalb dieser JSON-Nutzlast für JWT gültig sind. Das Attribut exp
muss beispielsweise einen numerischen Wert enthalten, sofern vorhanden. Das Attribut aud
, sofern vorhanden, muss ein String oder ein Array von Strings sein. Dies sind nur einige Beispiele für die Bedeutung von Data Governance. Weitere Informationen zu den gültigen Werten für JWT-Anforderungen finden Sie unter IETF RFC7519.
<GenerateJWS name="JWS-Generate-HS256-JWT"> <Algorithm>HS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <SecretKey> <Value ref="private.secretkey"/> </SecretKey> <Payload ref="json-content"/> <AdditionalHeaders> <Claim name="typ">JWT</Claim> </AdditionalHeaders> <OutputVariable>output-variable</OutputVariable> </GenerateJWS>
Getrennte JWS generieren
Diese Beispielrichtlinie generiert eine JWS mit getrenntem Inhalt, die mit dem RS256-Algorithmus signiert wird. Das Generieren einer RS256-Signatur benötigt einen privaten RSA-Schlüssel, der in PEM-codierter Form bereitgestellt werden muss.
Eine JWS mit getrenntem Inhalt lässt die Nutzlast der generierten JWS aus:
[header]..[signature]
Mit dem Element <Payload>
geben Sie die nicht codierte JWS-Rohnutzlast an.
Wenn diese Richtlinie ausgelöst wird, codiert Apigee den JWS-Header und die Nutzlast und verwendet sie anschließend zum Generieren der codierten Signatur. Die generierte JWS lässt die codierte Nutzlast jedoch aus der serialisierten JWS aus. Dies ist nützlich, wenn die signierten Inhalte groß oder binär sind (z. B. ein Bild oder eine PDF-Datei) oder beides. Um die Validierung zu ermöglichen, müssen beide Elemente, die JWS und die Nutzlast, die in dem signierten Inhalt enthalten war, an die überprüfende Partei übergeben werden. Wenn Sie die VerifyJWS-Richtlinie verwenden, um die JWS zu prüfen, können Sie die Variable mit der Nutzlast mit dem Element <DetachedContent>
der VerifyJWS-Richtlinie angeben.
<GenerateJWS name="JWS-Generate-RS256"> <DisplayName>JWS Generate RS256</DisplayName> <Algorithm>RS256</Algorithm> <IgnoreUnresolvedVariables>false</IgnoreUnresolvedVariables> <PrivateKey> <Value ref="private.privatekey"/> <Password ref="private.privatekey-password"/> <Id ref="private.privatekey-id"/> </PrivateKey> <Payload ref="my-payload"/> <DetachContent>true</DetachContent> <OutputVariable>output-variable</OutputVariable> </GenerateJWS>
Schlüsselelemente festlegen
Welche Elemente Sie verwenden, um den Schlüssel zur Generierung der JWS anzugeben, hängt vom ausgewählten Algorithmus ab, wie in der folgenden Tabelle dargestellt:
Algorithmus | Schlüsselelemente | |
---|---|---|
HS{256/384/512}* | <SecretKey> <Value ref="private.secretkey"/> <Id>1918290</Id> </SecretKey> |
|
RS/PS/ES{256/384/512}* | <PrivateKey> <Value ref="private.privatekey"/> <Password ref="private.privatekey-password"/> <Id ref="private.privatekey-id"/> </PrivateKey> Die Elemente |
|
* Weitere Informationen zu den Schlüsselanforderungen finden Sie unter Signaturverschlüsselungsalgorithmen. |
Elementreferenz für GenerateJWS
Die Richtlinienreferenz beschreibt die Elemente und Attribute der GenerateJWS-Richtlinie.
Hinweis: Die Konfiguration variiert je nach verwendetem Verschlüsselungsalgorithmus. In den Beispielen finden Sie Beispiele für Konfigurationen von bestimmten Anwendungsfällen.
Attribute, die auf das oberste Element angewendet werden
<GenerateJWS name="JWS" continueOnError="false" enabled="true" async="false">
Die folgenden Attribute gelten für alle übergeordneten Richtlinienelemente.
Attribut | Beschreibung | Standard | Presence |
---|---|---|---|
Name |
Der interne Name der Richtlinie. Folgende Zeichen sind im Namen zulässig: A-Z0-9._\-$ % . Die Apigee-Benutzeroberfläche erzwingt jedoch zusätzliche Einschränkungen, z. B. das automatische Entfernen nicht alphanumerischer Zeichen.
Optional können Sie das Element |
– | Erforderlich |
continueOnError |
Legen Sie false fest, um einen Fehler zurückzugeben, wenn eine Richtlinie fehlschlägt. Dies ist für die meisten Richtlinien das erwartete Verhalten.
Legen Sie |
false | Optional |
aktiviert | Legen Sie true fest, um die Richtlinie zu erzwingen.
Legen Sie |
true | Optional |
async | Dieses Attribut wurde verworfen. | false | Verworfen |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
Wird zusätzlich zum Namensattribut verwendet, um die Richtlinie im Proxy-Editor der Apigee-Benutzeroberfläche mit einem anderen Namen in einer natürlichen Sprache zu versehen.
Standard | Wenn Sie dieses Element weglassen, wird der Wert des Namensattributs der Richtlinie verwendet. |
Presence | Optional |
Typ | String |
<Algorithm>
<Algorithm>algorithm-here</Algorithm>
Gibt den Verschlüsselungsalgorithmus zum Signieren des Tokens an.
Standard | – |
Presence | Erforderlich |
Typ | String |
Zulässige Werte | HS256, HS384, HS512, RS256, RS384, RS512, ES256, ES384, ES512, PS256, PS384, PS512 |
<AdditionalHeaders/Claim>
<AdditionalHeaders> <Claim name='claim1'>explicit-value-of-claim-here</Claim> <Claim name='claim2' ref='variable-name-here'/> <Claim name='claim3' ref='variable-name-here' type='boolean'/> <Claim name='claim4' ref='variable-name' type='string' array='true'/> </AdditionalHeaders>
Fügt die zusätzlichen Paare aus Anforderungsname/Wert in den Header für die JWS ein.
Standard | – |
Presence | Optional |
Zulässige Werte | Jeder Wert, den Sie für eine zusätzliche Anforderung verwenden möchten. Sie können die Anforderung explizit als String, Zahl, booleschen Wert, Zuordnung oder Array angeben. |
Das Element <Claim>
verwendet die folgenden Attribute:
- name: (erforderlich) der Name der Anforderung, auch als Parameter bezeichnet.
- ref – (optional) Der Name einer Ablaufvariable. Falls vorhanden, verwendet die Richtlinie den Wert dieser Variable als Anforderung. Wenn sowohl ein ref-Attribut als auch ein expliziter Anforderungswert angegeben sind, ist der explizite Wert der Standardwert. Er wird verwendet, wenn die referenzierte Ablaufvariable nicht aufgelöst wird.
- type – (optional) Kann String (Standard), Zahl, boolescher Wert oder Map sein
- array – (optional) Legen Sie true fest, um anzugeben, dass der Wert ein Typarray ist. Standardeinstellung: false.
<CriticalHeaders>
<CriticalHeaders>a,b,c</CriticalHeaders> or: <CriticalHeaders ref="variable_containing_headers"/>
Fügt der JWS den kritischen Header crit hinzu. Der Header crit ist ein Array aus Headernamen, die bekannt sein und vom JWS-Empfänger erkannt werden müssen. Sie können mit diesem Konfigurationselement beispielsweise einen JWS-Header erstellen, der bei der Decodierung so aussieht:
{ "typ": "...", "alg" : "...", "hyb" : "some-value-here", "crit" : [ "hyb" ], }
Dieser JWS-Header bestätigt, dass der Header-Parameter hyb von entscheidender Bedeutung ist und jeder Empfänger der JWS die Bedeutung und den Wert dieses Parameters verstehen muss.
Gemäß IETF RFC 7515 sollte der Empfänger einer JWS die JWS als ungültig ablehnen, wenn der Empfänger einen oder mehrere Parameter, auf die im crit-Parameter verwiesen wird, nicht versteht. In Apigee entspricht diesem Verhalten die VerifyJWS-Richtlinie.
Für jeden im crit-Parameter aufgeführten Parameter wird geprüft, ob das <KnownHeaders>
-Element der VerifyJWS-Richtlinie diesen Parameter ebenfalls enthält.
Jeder Header, den die VerifyJWS-Richtlinie in crit findet, aber nicht in der <KnownHeaders>
-Liste aufgeführt ist, veranlasst die VerifyJWS-Richtlinie, die JWS abzulehnen.
Standard | – |
Presence | Optional |
Typ | Durch Kommas getrenntes Array aus einem oder mehreren Strings |
Zulässige Werte | Entweder ein Array oder ein Verweis auf eine Variable, die das Array enthält. |
<DetachContent>
<DetachContent>true|false</DetachContent>
Gibt an, ob die JWS mit einer getrennten Nutzlast (<DetachContent>true</DetachContent>
) oder nicht (<DetachContent>false</DetachContent>
) generiert werden soll.
Wenn Sie "false" angeben, hat die standardmäßig erstellte JWS folgendes Format:
[header].[payload].[signature]
Wenn Sie "true" festlegen, um eine JWS mit einer getrennten Nutzlast zu erstellen, wird die Nutzlast in der erzeugten JWS weggelassen. Sie hat das folgende Format:
[header]..[signature]
Bei einer JWS, die eine getrennte Nutzlast verwendet, können Sie die ursprüngliche, nicht codierte Nutzlast zusammen mit der serialisierten JWS an die prüfende Partei übergeben.
Standard | false |
Presence | Optional |
Typ | Boolesch |
Zulässige Werte | "true" oder "false" |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
Setzen Sie diesen Wert auf "false", wenn die Richtlinie einen Fehler ausgibt, falls eine in der Richtlinie angegebene Variable, auf die verwiesen wird, nicht auflösbar ist. Setzen Sie diesen Wert auf "true", um alle nicht aufgelösten Variablen als leeren String zu behandeln (null).
Standard | false |
Presence | Optional |
Typ | Boolesch |
Zulässige Werte | "true" oder "false" |
<OutputVariable>
<OutputVariable>output-variable</OutputVariable>
Gibt den Namen der Kontextvariablen an, die die Richtlinie mit der generierten JWS festlegen soll.
Standardmäßig wird die JWS von der Richtlinie in die Kontextvariable namens jws.POLICYNAME.generated_jws
eingefügt.
Standard | jws.POLICYNAME.generated_jws |
Presence | Optional |
Typ | String (Name einer Ablaufvariablen) |
<Payload>
<Payload ref="flow-variable-name-here" /> or <Payload>payload-value</Payload>
Gibt die unformatierte nicht codierte JWS-Nutzlast an. Geben Sie eine Variable mit der Nutzlast oder einen String an.
Standard | – |
Presence | Erforderlich |
Typ | String, Byte-Array, Stream oder eine andere Darstellung der nicht codierten JWS-Nutzlast. |
Zulässige Werte | Entweder eine Nachrichtenvorlage oder ein Verweis auf eine Variable, die die Nutzlast enthält. |
<PrivateKey>-Element
Dies ist optional, und wird nur verwendet, wenn <Algorithm>
eine der Optionen RS*, PS* oder ES* ist. Es gibt den privaten Schlüssel für Signieren sowie andere Informationen zum privaten Schlüssel an. Es wird verwendet, wenn der Algorithmus ein asymmetrischer Algorithmus ist.
<PrivateKey> <Value ref="private.privatekey"</Value> </PrivateKey>
Standard: | – |
Präsenz: | Optional. Sie müssen jedoch genau eines der Elemente <PrivateKey> oder <SecretKey> angeben.
Verwenden Sie das Element <PrivateKey> , wenn der Algorithmus RS*, PS* oder ES* ist, und verwenden Sie das Element <SecretKey> , wenn der Algorithmus HS* ist.
|
Typ: | – |
<PrivateKey/Id>
<PrivateKey> <Id ref="flow-variable-name-here"/> </PrivateKey> or <PrivateKey> <Id>your-id-value-here</Id> </PrivateKey>
Gibt die Schlüssel-ID (kid) an, die im JWS-Header enthalten sein muss.
Standard | – |
Presence | Optional |
Typ | String |
Zulässige Werte | Eine Ablaufvariable oder ein String |
<PrivateKey/Password>
<PrivateKey> <Password ref="private.privatekey-password"/> </PrivateKey>
Falls erforderlich, geben Sie das Passwort an, das die Richtlinie zum Entschlüsseln des privaten Schlüssels verwenden soll. Verwenden Sie das Attribut ref, um den Schlüssel in einer Ablaufvariable zu übergeben.
Standard | – |
Presence | Optional |
Typ | String |
Zulässige Werte |
Eine Referenz für eine Ablaufvariable. Hinweis: Sie müssen eine Ablaufvariable mit dem Attribut ref angeben. Apigee lehnt Richtlinienkonfigurationen, in denen das Passwort im Klartext angegeben wird, als ungültig ab. Die Ablaufvariable muss das Präfix „private” haben. Zum Beispiele |
<PrivateKey/Value>
<PrivateKey> <Value ref="private.variable-name-here"/> </PrivateKey>
Gibt einen PEM-codierten privaten Schlüssel an, der zum Signieren der JWS verwendet wird. Verwenden Sie das Attribut ref, um den Schlüssel in einer Ablaufvariable zu übergeben.
Standard | – |
Presence | Erforderlich, wenn mit der Richtlinie eine JWS mithilfe eines der RS*-, PS*- oder ES*-Algorithmen generiert wird. |
Typ | String |
Zulässige Werte | Eine Ablaufvariable mit einem String, der einen privaten PEM-codierten Schlüsselwert darstellt. Hinweis: Die Ablaufvariable muss das Präfix "private" haben. Beispiel: |
<SecretKey>
<SecretKey encoding="base16|hex|base64|base64url" > <Id ref="variable-containing-key-id-here">secret-key-id</Id> <Value ref="private.variable-here"/> </SecretKey>
Gibt den geheimen Schlüssel an, der beim Generieren einer JWS verwendet werden soll, die einen symmetrischen Algorithmus (HS*) verwendet, entweder HS256, HS384 oder HS512.
Dieses Element ist optional. Sie müssen aber unbedingt entweder <PrivateKey>
oder <SecretKey>
angeben.
Verwenden Sie das Element <PrivateKey>
, wenn Sie eine JWS generieren, die mit einem asymmetrischen Algorithmus signiert ist (entweder RS*, PS* oder ES*), und das Element <SecretKey>
, wenn Sie eine JWS signieren, die mit einen symmetrischen Algorithmus (wie HS*) signiert ist.
Untergeordnete Elemente von <SecretKey>
In der folgenden Tabelle sind die untergeordneten Elemente und Attribute von <SecretKey>
beschrieben:
Kind | Presence | Beschreibung |
---|---|---|
encoding (Attribut) | Optional | Gibt an, wie der Schlüssel in der referenzierten Variable codiert ist. Wenn kein <SecretKey encoding="hex" > <Id ref="variable-containing-key-id-here">secret-key-id</Id> <Value ref="private.secretkey"/> </SecretKey> Da im obigen Beispiel die Codierung |
Id (Element) | Optional | Die Schlüsselkennung. Der Wert kann ein beliebiger String sein. Sie können den Wert als Literaltextwert oder indirekt über eine Variablenreferenz mit dem Attribut <SecretKey> <Id ref="flow-variable-name-here"/> <Value ref="private.variable-here"/> </SecretKey> or <SecretKey> <Id>your-id-value-here</Id> <Value ref="private.variable-here"/> </SecretKey> Die Richtlinie enthält diese Schlüsselkennung als Anforderung |
Value (Element) | Erforderlich | Einen codierten geheimen Schlüssel Gibt den geheimen Schlüssel an, der zum Signieren der Nutzlast verwendet wird.
Verwenden Sie das Attribut <SecretKey> <Id ref="flow-variable-name-here"/> <Value ref="private.my-secret-variable"/> </SecretKey> Apigee erzwingt eine Mindestschlüsselstärke für die Algorithmen HS256/HS384/HS512. Die Mindestschlüssellänge für HS256 beträgt 32 Byte, für HS384 48 Byte und für HS512 64 Byte. Die Verwendung eines Schlüssels mit geringerer Stärke führt zu einem Laufzeitfehler. |
<Type>
<Type>type-string-here</Type>
Optionales Element, dessen einziger erlaubter Wert Signed
ist und angibt, dass die Richtlinie ein signiertes JWS generiert. <Type>
wird nur bereitgestellt, um mit dem entsprechenden Element für die GenerateJWT- und VerifyJWT-Richtlinien abzugleichen. Dabei kann es einen der Werte Signed
oder Encrypted
haben.
Standard | – |
Presence | Optional |
Typ | String |
Gültiger Wert | Signed |
Ablaufvariablen
Die GenerateJWS-Richtlinie legt keine Ablaufvariablen fest.
Fehlerreferenz
This section describes the fault codes and error messages that are returned and fault variables that are set by Apigee when this policy triggers an error. This information is important to know if you are developing fault rules to handle faults. To learn more, see What you need to know about policy errors and Handling faults.
Runtime errors
These errors can occur when the policy executes.
Fault code | HTTP status | Occurs when |
---|---|---|
steps.jws.GenerationFailed |
401 |
The policy was unable to generate the JWS. |
steps.jws.InsufficientKeyLength |
401 |
For a key less than 32 bytes for the HS256 algorithm |
steps.jws.InvalidClaim |
401 |
For a missing claim or claim mismatch, or a missing header or header mismatch. |
steps.jws.InvalidCurve |
401 |
The curve specified by the key is not valid for the Elliptic Curve algorithm. |
steps.jws.InvalidJsonFormat |
401 |
Invalid JSON found in the JWS header. |
steps.jws.InvalidPayload |
401 |
The JWS payload is invalid. |
steps.jws.InvalidSignature |
401 |
<DetachedContent> is omitted and the JWS has a detached content payload. |
steps.jws.KeyIdMissing |
401 |
The Verify policy uses a JWKS as a source for public keys, but the signed JWS does not
include a kid property in the header. |
steps.jws.KeyParsingFailed |
401 |
The public key could not be parsed from the given key information. |
steps.jws.MissingPayload |
401 |
The JWS payload is missing. |
steps.jws.NoAlgorithmFoundInHeader |
401 |
Occurs when the JWS omits the algorithm header. |
steps.jws.SigningFailed |
401 |
In GenerateJWS, for a key less than the minimum size for the HS384 or HS512 algorithms |
steps.jws.UnknownException |
401 |
An unknown exception occurred. |
steps.jws.WrongKeyType |
401 |
Wrong type of key specified. For example, if you specify an RSA key for an Elliptic Curve algorithm, or a curve key for an RSA algorithm. |
Deployment errors
These errors can occur when you deploy a proxy containing this policy.
Error name | Occurs when |
---|---|
InvalidAlgorithm |
The only valid values are: RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512,
HS256, HS384, HS512 . |
|
Other possible deployment errors. |
Fault variables
These variables are set when a runtime error occurs. For more information, see What you need to know about policy errors.
Variables | Where | Example |
---|---|---|
fault.name="fault_name" |
fault_name is the name of the fault, as listed in the Runtime errors table above. The fault name is the last part of the fault code. | fault.name Matches "TokenExpired" |
JWS.failed |
All JWS policies set the same variable in the case of a failure. | jws.JWS-Policy.failed = true |
Example error response
For error handling, the best practice is to trap the errorcode
part of the error
response. Do not rely on the text in the faultstring
, because it could change.
Example fault rule
<FaultRules> <FaultRule name="JWS Policy Errors"> <Step> <Name>JavaScript-1</Name> <Condition>(fault.name Matches "TokenExpired")</Condition> </Step> <Condition>JWS.failed=true</Condition> </FaultRule> </FaultRules>