GenerateJWS ポリシー

このページの内容は ApigeeApigee ハイブリッドに該当します。

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>

<Password> 要素と <Id> 要素は省略可能です。

* 鍵の要件について詳しくは、署名暗号アルゴリズムについてをご覧ください。

Generate JWS の要素リファレンス

このポリシー リファレンスでは、Generate JWS ポリシーの要素と属性について説明しています。

注: 構成は、使用する暗号化アルゴリズムによって多少異なります。特定のユースケースの構成例については、サンプルをご覧ください。

最上位の要素に適用される属性

<GenerateJWS name="JWS" continueOnError="false" enabled="true" async="false">

次の属性は、すべてのポリシーの親要素に共通です。

属性 説明 デフォルト 要否
name ポリシーの内部名。名前に使用できる文字は A-Z0-9._\-$ % のみです。ただし、Apigee UI では、英数字以外の文字を自動的に削除するなど、追加の制限が適用されます。

必要に応じて、<displayname></displayname> 要素を使用して、Apigee UI プロキシ エディタでポリシーに別の自然言語名でラベルを付けます。

なし 必須
continueOnError ポリシーが失敗した場合にエラーを返すには、false に設定します。これはほとんどのポリシーで想定される動作です。

ポリシーが失敗した後もフローの実行を続行する場合は、true に設定します。

false 省略可
enabled ポリシーを適用するには、true に設定します。

ポリシーを「turn off」するには、false に設定します。ポリシーがフローに接続されている場合でも適用されません。

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 が必要です。例: private.mypassword

<PrivateKey/Value>

<PrivateKey>
  <Value ref="private.variable-name-here"/>
</PrivateKey>

JWS への署名に使用され、PEM エンコードされた秘密鍵を指定します。ref 属性を使用して、鍵をフロー変数に渡します。

デフォルト なし
要否 ポリシーを使用して、RS*、PS*、ES* アルゴリズムのいずれかを使用して JWS を生成する場合に必要です。
文字列
有効な値 PEM エンコードされた秘密鍵の値を表す文字列を含むフロー変数

注: フロー変数には接頭辞 private が必要です。例: private.mykey

<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> の子要素と属性の説明を示したものです。

プレゼンス 説明
エンコード(属性) 省略可

参照される変数で鍵をエンコードする方法を指定します。デフォルトでは、encoding 属性が存在しない場合、鍵のエンコードは UTF-8 として扱われます。属性の有効な値は 16 進数、base16、base64、base64url です。エンコード値の hex と base16 は同義です。

<SecretKey encoding="hex" >
  <Id ref="variable-containing-key-id-here">secret-key-id</Id>
  <Value ref="private.secretkey"/>
</SecretKey>

上記の例では、エンコードが hex であるため、変数 private.secretkey の内容が 494c6f766541504973 の場合、鍵は 9 バイトのセットとしてデコードされ、その 16 進数は 49 4c 6f 76 65 41 50 49 73 になります。

Id(要素) 省略可

鍵識別子。値には任意の文字列を指定できます。値は、リテラル テキスト値として、または変数参照によって間接的に、ref 属性で指定できます。

<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 のヘッダーにこのキー識別子が kid クレームとして含まれます。

値(要素) 必須

エンコードされた秘密鍵。ペイロードの署名に使用する秘密鍵を指定します。private.secret-key などの変数で間接的に鍵を指定するには、ref 属性を使用します。

<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 ポリシーに対応する要素に一致するようにのみ提供されます(SignedEncrypted のいずれかの値を使用できます)。

デフォルト なし
要否 省略可
文字列
有効な値 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

EmptyElementForKeyConfiguration

FailedToResolveVariable

InvalidConfigurationForActionAndAlgorithmFamily

InvalidConfigurationForVerify

InvalidEmptyElement

InvalidFamiliesForAlgorithm

InvalidKeyConfiguration

InvalidNameForAdditionalClaim

InvalidNameForAdditionalHeader

InvalidPublicKeyId

InvalidPublicKeyValue

InvalidSecretInConfig

InvalidTypeForAdditionalClaim

InvalidTypeForAdditionalHeader

InvalidValueForElement

InvalidValueOfArrayAttribute

InvalidVariableNameForSecret

MissingConfigurationElement

MissingElementForKeyConfiguration

MissingNameForAdditionalClaim

MissingNameForAdditionalHeader

発生の可能性があるその他のデプロイエラー。

障害変数

ランタイム エラーが発生すると、次の変数が設定されます。詳細については、ポリシーエラーについて知っておくべきことをご覧ください。

変数 説明
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>