このページの内容は Apigee と Apigee ハイブリッドに該当します。
Apigee Edge のドキュメントを表示する。
概要
構成可能な一連のクレームが含まれる署名付き JWS を生成します。JWS はクライアントに返すことができます。また、バックエンド ターゲットに送信するなど、他の方法で使用することもできます。詳細については、JWS ポリシーと JWT ポリシーの概要をご覧ください。
JWS の構成要素およびその暗号化と署名の方法については、RFC7515 をご覧ください。
このポリシーは拡張可能なポリシーであり、Apigee ライセンスによっては、このポリシーの使用によって費用や使用率に影響する場合があります。ポリシータイプと使用量への影響については、ポリシータイプをご覧ください。
動画
署名付き JWT の生成方法について短い動画をご覧ください。この動画では JWT の生成方法について説明していますが、コンセプトの多くは JWS と同じです。
例
HS256 で署名された JWS を生成する
このサンプル ポリシーでは、HS256 アルゴリズムを使用して署名された JWS が生成されます。HS256 は、署名とその検証の両方に共有シークレットを利用します。この JWS では「添付」コンテンツが使用されます。つまり、エンコードされたヘッダー、ペイロード、署名がドット連結されて最終的な JWS が生成されます。
[header].[payload].[signature]
<Payload>
要素を使用して、RAW で未エンコードの JWS ペイロードを指定します。この例では、変数にペイロードが含まれています。このポリシー アクションがトリガーされると、Apigee は JWS ヘッダーとペイロードをエンコードし、エンコード済みの署名を追加して JWS にデジタル署名します。
次のポリシー構成では、変数 my-payload
に含まれるペイロードから JWS が作成され、結果の JWS が変数 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>
HS256 署名付き JWT を生成する
この例では、HS256 アルゴリズムで署名された添付ファイルを含む JWS も生成します。この場合、ペイロードは JSON です。typ
ヘッダーを JWT に設定すると、署名付き JWT でもある署名付き JWS が生成されます。(リファレンス)
次のポリシー構成では、変数 json-content
に含まれるペイロードから JWS が作成され、結果の JWS が変数 output-variable
に保存されます。json-content
変数が JSON ペイロードを含み、その JSON ペイロード内のプロパティが JWT に対して有効である場合のみ、結果が署名付き JWT になります。たとえば、exp
プロパティが存在する場合は、数値を保持する必要があります。aud
プロパティが存在する場合は、文字列または文字列の配列でなければなりません。そこでも同じ手順を繰り返します。JWT クレームの有効な値の詳細については、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>
分離 JWS を生成する
このサンプル ポリシーでは、RS256 アルゴリズムを使用して署名された、分離コンテンツを使用した JWS が生成されます。RS256 署名を生成するには、RSA 秘密鍵が必要です。この秘密鍵は PEM エンコード形式で提供する必要があります。
分離コンテンツを含む JWS では、生成された JWS からペイロードが省略されます。
[header]..[signature]
<Payload>
要素を使用して、エンコードされていない未加工の JWS ペイロードを指定します。このポリシーがトリガーされると、Apigee は JWS ヘッダーとペイロードをエンコードし、それらを使用してエンコード済みの署名を生成します。ただし、生成された JWS では、シリアル化された JWS からエンコードされたペイロードが省略されます。これは、署名されたコンテンツが大きいか、バイナリ(画像や PDF など)、またはその両方である場合に役立ちます。検証を許可するには、JWS と署名付きコンテンツに含まれたペイロードの両方の要素を検証側に渡す必要があります。VerifyJWS ポリシーを使用して JWS を検証する場合は、VerifyJWS ポリシーの <DetachedContent>
要素を使用して、ペイロードを含む変数を指定できます。
<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>
鍵要素の設定
JWS の生成に使用する鍵の指定に使用する要素は、次の表に示すように、選択したアルゴリズムによって異なります。
アルゴリズム | 鍵要素 | |
---|---|---|
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>
|
|
* 鍵の要件について詳しくは、署名暗号アルゴリズムについてをご覧ください。 |
Generate JWS の要素リファレンス
このポリシー リファレンスでは、Generate JWS ポリシーの要素と属性について説明しています。
注: 構成は、使用する暗号化アルゴリズムによって多少異なります。特定のユースケースの構成例については、サンプルをご覧ください。
最上位の要素に適用される属性
<GenerateJWS name="JWS" continueOnError="false" enabled="true" async="false">
次の属性は、すべてのポリシーの親要素に共通です。
属性 | 説明 | デフォルト | 要否 |
---|---|---|---|
name |
ポリシーの内部名。名前に使用できる文字は A-Z0-9._\-$ % のみです。ただし、Apigee UI では、英数字以外の文字を自動的に削除するなど、追加の制限が適用されます。
必要に応じて、 |
なし | 必須 |
continueOnError |
ポリシーが失敗した場合にエラーを返すには、false に設定します。これはほとんどのポリシーで想定される動作です。
ポリシーが失敗した後もフローの実行を続行する場合は、 |
false | 省略可 |
enabled |
ポリシーを適用するには、true に設定します。ポリシーを「turn off」するには、 |
true | 省略可 |
async | この属性は非推奨となりました。 | false | 非推奨 |
<DisplayName>
<DisplayName>Policy Display Name</DisplayName>
name 属性に加えて、Apigee UI プロキシ エディタでポリシーを別の自然言語名でラベル付けするために使用します。
デフォルト | この要素を省略した場合、ポリシーの name 属性の値が使用されます。 |
要否 | 省略可 |
型 | 文字列 |
<Algorithm>
<Algorithm>algorithm-here</Algorithm>
トークンに署名する暗号化アルゴリズムを指定します。
デフォルト | なし |
要否 | 必須 |
型 | 文字列 |
有効な値 | 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>
JWS のヘッダーに、追加クレーム名と値のペアを挿入します。
デフォルト | なし |
要否 | 省略可 |
有効な値 | 追加のクレームに使用する任意の値。クレームは、文字列、数値、ブール値、マップ、または配列として明示的に指定できます。 |
<Claim>
要素には次の属性があります。
- name -(必須)クレームの名前。パラメータとも呼ばれます。
- ref -(省略可)フロー変数の名前。設定された場合、ポリシーはこの変数の値をクレームとして使用します。ref 属性と明示的なクレーム値が両方指定された場合、明示的な値がデフォルトとなり、参照されたフロー変数が解決されない場合に使用されます。
- type -(省略可)文字列(デフォルト)、数値、ブール値、マッピングのいずれか
- array -(省略可)値が型の配列かどうかを示すには true に設定します(デフォルトは false)。
<CriticalHeaders>
<CriticalHeaders>a,b,c</CriticalHeaders> or: <CriticalHeaders ref="variable_containing_headers"/>
JWS に重大なヘッダーである crit を追加します。crit ヘッダーはヘッダー名の配列で、JWS 受信者により把握され、認識される必要があります。たとえば、デコードしたときに次のような JWS ヘッダーを生成するために、この構成要素を使用できます。
{ "typ": "...", "alg" : "...", "hyb" : "some-value-here", "crit" : [ "hyb" ], }
この JWS ヘッダーは、hyb ヘッダー パラメータが非常に重要で、JWS の受信側がそのパラメータの意味と値を理解する必要があることを示します。
IETF RFC 7515 に従い、JWS の受信側は、crit パラメータで参照される 1 つ以上のパラメータを理解できなければ、JWS を無効として拒否する必要があります。Apigee では、VerifyJWS ポリシーがこの動作に準拠しています。
crit パラメータにリストされているパラメータごとに、VerifyJWS ポリシーの <KnownHeaders>
要素もそのパラメータをリストしていることを確認します。
VerifyJWS ポリシーが crit で検出したヘッダーの中に <KnownHeaders>
にリストされていないものがあると、VerifyJWS ポリシーは JWS を拒否します。
デフォルト | なし |
要否 | 省略可 |
型 | 1 つ以上の文字列のカンマ区切り配列 |
有効な値 | 配列、または配列を含む変数への参照。 |
<DetachContent>
<DetachContent>true|false</DetachContent>
JWS を分離済みペイロードありで生成するか(<DetachContent>true</DetachContent>
)、なしで生成するか(<DetachContent>false</DetachContent>
)を指定します。
false を指定した場合(デフォルト)、生成される JWS は次の形式になります。
[header].[payload].[signature]
true を指定して分離済みペイロードがある JWS を作成する場合、生成される JWS ではペイロードが省略されて、次の形式になります。
[header]..[signature]
分離済みペイロードを使用したJWSの場合、元のエンコードされていないペイロードをシリアル化された JWS とともに検証当事者に渡すかどうかは任意です。
デフォルト | false |
要否 | 省略可 |
型 | Boolean |
有効な値 | true または false |
<IgnoreUnresolvedVariables>
<IgnoreUnresolvedVariables>true|false</IgnoreUnresolvedVariables>
false に設定すると、ポリシーで指定された参照値が解決できない場合にエラーを返します。true に設定すると、解決できない変数を空の文字列(null)として扱います。
デフォルト | false |
要否 | 省略可 |
型 | Boolean |
有効な値 | true または false |
<OutputVariable>
<OutputVariable>output-variable</OutputVariable>
生成された JWS がポリシーがセットされるコンテキスト変数の名前を指定します。デフォルトでは、ポリシーにより JWS は jws.POLICYNAME.generated_jws
という名前のコンテキスト変数に配置されます。
デフォルト | jws.POLICYNAME.generated_jws |
要否 | 省略可 |
型 | 文字列(フロー変数名) |
<Payload>
<Payload ref="flow-variable-name-here" /> or <Payload>payload-value</Payload>
RAW で未エンコードの JWS ペイロードを指定します。ペイロードが含まれた変数または文字列を指定します。
デフォルト | なし |
要否 | 必須 |
型 | 文字列、バイト配列、ストリーム、未エンコード JWS ペイロードのその他の表現 |
有効な値 | メッセージ テンプレート、またはペイロードを含む変数への参照。 |
<PrivateKey> 要素
省略可能で、<Algorithm>
が RS*、PS*、ES* のいずれかの場合にのみ使用されます。署名に使用する秘密鍵と、秘密鍵に関連するその他の情報を指定します。これは、アルゴリズムが非対称アルゴリズムである場合に使用されます。
<PrivateKey> <Value ref="private.privatekey"</Value> </PrivateKey>
デフォルト: | なし |
要否: | 省略可。ただし、<PrivateKey> 要素または <SecretKey> 要素のいずれか 1 つのみを含める必要があります。アルゴリズムが RS*、PS*、ES* の場合は <PrivateKey> 要素を使用し、アルゴリズムが HS* の場合は <SecretKey> 要素を使用します。 |
型: | 該当なし |
<PrivateKey/Id>
<PrivateKey> <Id ref="flow-variable-name-here"/> </PrivateKey> or <PrivateKey> <Id>your-id-value-here</Id> </PrivateKey>
JWS ヘッダーに含める鍵 ID(kid)を指定します。
デフォルト | なし |
要否 | 省略可 |
型 | 文字列 |
有効な値 | フロー変数または文字列 |
<PrivateKey/Password>
<PrivateKey> <Password ref="private.privatekey-password"/> </PrivateKey>
必要に応じ、ポリシーで秘密鍵の復号に使用するパスワードを指定します。ref 属性を使用して、鍵をフロー変数に渡します。
デフォルト | なし |
要否 | 省略可 |
型 | 文字列 |
有効な値 |
フロー変数参照 注: ref 属性を使用してフロー変数を指定する必要があります。パスワードが平文で指定されているポリシー構成は、Apigee によって拒否されます。フロー変数には接頭辞 private が必要です。例: |
<PrivateKey/Value>
<PrivateKey> <Value ref="private.variable-name-here"/> </PrivateKey>
JWS への署名に使用され、PEM エンコードされた秘密鍵を指定します。ref 属性を使用して、鍵をフロー変数に渡します。
デフォルト | なし |
要否 | ポリシーを使用して、RS*、PS*、ES* アルゴリズムのいずれかを使用して JWS を生成する場合に必要です。 |
型 | 文字列 |
有効な値 |
PEM エンコードされた秘密鍵の値を表す文字列を含むフロー変数 注: フロー変数には接頭辞 private が必要です。例:
|
<SecretKey>
<SecretKey encoding="base16|hex|base64|base64url" > <Id ref="variable-containing-key-id-here">secret-key-id</Id> <Value ref="private.variable-here"/> </SecretKey>
対称(HS*)アルゴリズム(HS256、HS384、HS512 のいずれか)を使用する JWS の生成時に使用する秘密鍵を指定します。
このエレメントはオプションです。ただし、<PrivateKey>
要素または <SecretKey>
要素のいずれか 1 つのみを含める必要があります。非対称アルゴリズム(RS*、PS*、ES* のいずれか)で署名された JWS を生成する場合は <PrivateKey>
要素を使用し、対称アルゴリズム(HS* などのアルゴリズム)で署名された JWS を生成する場合は <SecretKey>
要素を使用します。
<SecretKey>
の子
次の表は、<SecretKey>
の子要素と属性の説明を示したものです。
子 | プレゼンス | 説明 |
---|---|---|
エンコード(属性) | 省略可 | 参照される変数で鍵をエンコードする方法を指定します。デフォルトでは、 <SecretKey encoding="hex" > <Id ref="variable-containing-key-id-here">secret-key-id</Id> <Value ref="private.secretkey"/> </SecretKey> 上記の例では、エンコードが |
Id(要素) | 省略可 | 鍵識別子。値には任意の文字列を指定できます。値は、リテラル テキスト値として、または変数参照によって間接的に、 <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> ポリシーには、生成された JWS のヘッダーにこのキー識別子が |
値(要素) | 必須 | エンコードされた秘密鍵。ペイロードの署名に使用する秘密鍵を指定します。 <SecretKey> <Id ref="flow-variable-name-here"/> <Value ref="private.my-secret-variable"/> </SecretKey> Apigee は、HS256 / HS384 / HS512 アルゴリズムに対して最小限の鍵強度を適用します。鍵の最小長は、HS256 では 32 バイト、HS384 では 48 バイト、HS512 では 64 バイトです。強度の低い鍵を使用すると実行時エラーが発生します。 |
<Type>
<Type>type-string-here</Type>
許可された値が Signed
のみの任意の要素です。ポリシーによって署名付き JWS が生成されることを指定します。<Type>
は、GenerateJWT ポリシーと VerifyJWT ポリシーに対応する要素に一致するようにのみ提供されます(Signed
か Encrypted
のいずれかの値を使用できます)。
デフォルト | なし |
要否 | 省略可 |
型 | 文字列 |
有効な値 | Signed |
フロー変数
Generate JWS ポリシーではフロー変数が設定されません。
エラー リファレンス
このセクションでは、このポリシーによってエラーがトリガーされたときに返される障害コードとエラー メッセージ、Apigee によって設定される障害変数について説明します。これは、障害に対処する障害ルールを作成するうえで重要な情報です。詳細については、ポリシーエラーについて知っておくべきことと障害の処理をご覧ください。
ランタイム エラー
このエラーは、ポリシーの実行時に発生することがあります。
障害コード | HTTP ステータス | 発生条件 |
---|---|---|
steps.jws.GenerationFailed |
401 |
ポリシーで JWS を生成できなかった場合。 |
steps.jws.InsufficientKeyLength |
401 |
HS256 アルゴリズムの鍵が 32 バイト未満の場合。 |
steps.jws.InvalidClaim |
401 |
クレームが欠落しているか、一致していない場合。または、ヘッダーが欠落しているか、一致していない場合。 |
steps.jws.InvalidCurve |
401 |
鍵で指定された曲線が、楕円曲線アルゴリズムでは無効な場合。 |
steps.jws.InvalidJsonFormat |
401 |
JWS ヘッダーで無効な JSON が検出された場合。 |
steps.jws.InvalidPayload |
401 |
JWS ペイロードが無効な場合。 |
steps.jws.InvalidSignature |
401 |
<DetachedContent> が省略され、JWS に分離されたコンテンツ ペイロードがある場合。 |
steps.jws.KeyIdMissing |
401 |
Verify ポリシーが公開鍵のソースとして JWKS を使用しているが、署名付き JWS のヘッダーに kid プロパティが含まれてない場合。 |
steps.jws.KeyParsingFailed |
401 |
指定された鍵情報で公開鍵を解析できない場合。 |
steps.jws.MissingPayload |
401 |
JWS ペイロードが欠落している場合。 |
steps.jws.NoAlgorithmFoundInHeader |
401 |
JWS がアルゴリズム ヘッダーを省略すると発生します。 |
steps.jws.SigningFailed |
401 |
GenerateJWS で、HS384 または HS512 アルゴリズムの鍵が最小サイズより小さい場合。 |
steps.jws.UnknownException |
401 |
不明な例外が発生した場合。 |
steps.jws.WrongKeyType |
401 |
鍵のタイプが正しくない場合。たとえば、楕円曲線アルゴリズムで RSA 鍵を指定した場合や、RSA アルゴリズムで曲線鍵を指定した場合など。 |
デプロイエラー
以下のエラーは、このポリシーを含むプロキシをデプロイするときに発生することがあります。
エラー名 | 発生条件 |
---|---|
InvalidAlgorithm |
有効な値: RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512,
HS256, HS384, HS512 |
|
発生の可能性があるその他のデプロイエラー。 |
障害変数
ランタイム エラーが発生すると、次の変数が設定されます。詳細については、ポリシーエラーについて知っておくべきことをご覧ください。
変数 | 説明 | 例 |
---|---|---|
fault.name="fault_name" |
fault_name は、上記のランタイム エラーの表に記載されている障害の名前です。障害名は、障害コードの最後の部分です。 | fault.name Matches "TokenExpired" |
JWS.failed |
障害の場合は、すべての JWS ポリシーで同じ変数が設定されます。 | jws.JWS-Policy.failed = true |
エラー レスポンスの例
ベスト プラクティスとして、エラー処理でエラー レスポンスの errorcode
の部分をトラップすることをおすすめします。faultstring
のテキストには依存しないでください。この部分は変更される可能性があります。
障害ルールの例
<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>