JWS (JWT) ヘッダーを指定して、JWKS キーストアで署名検証キーを選択する標準的な方法はありますか?
私の目標は、OpenID Connect ID Token 検証ライブラリを実装することです。柔軟にさまざまな構成を想定しようとしていますが、キーの選択が IdP に固有のものである場合、それを行う意味があるかどうかはわかりません。
私の現在のアルゴリズムは、JWKS をウォークアウトして除外します。
- JWK に「use」フィールドがある場合、「use」が「sig」と等しくない場合は拒否されます
- JWK に "key_ops" フィールドがある場合、"key_ops" に "verify" が含まれていない場合は拒否されます
- JWK に「alg」フィールドがある場合、JWS ヘッダー値と異なる場合は拒否されます
- JWSヘッダーに「kid」フィールドがある場合、JWKに値がないか異なる値がある場合は拒否します(逆のロジックに注意してください)
- この段階で JWK が 1 つだけ残っている場合は、それを使用します。それ以外の場合は失敗です。
このアプローチは「十分に標準」ですか?
===編集===
OpenID Connect コア仕様のセクション 10.1に次のように記載されていることがわかりました。
RSA または ECDSA 署名を使用する場合、JOSE ヘッダーの alg ヘッダー パラメータ値は、JSON Web アルゴリズム [JWA] で定義されている適切なアルゴリズムに設定する必要があります。コンテンツの署名に使用される秘密鍵は、送信者が JWK セット ドキュメントで公開した署名検証に使用される公開鍵に関連付けられている必要があります。参照されている JWK セット ドキュメントに複数のキーがある場合は、JOSE ヘッダーに kid 値を指定する必要があります。それぞれの鍵の鍵使用法は、署名をサポートしなければなりません (MUST)。
JWK の「使用」は必須であるため、「sig」であることを安全に要求できます。
JWKS に複数のキーがある場合、JWT "kid" は必須です。これは、(間接的ではありますが) この場合、JWT の "kid" と "JWK" kid が一致する必要があることを示唆しています。ただし、「子供」は一意である必要はないため、追加のルールが必要です。