3.2. 署名の検証
3.2. 署名の検証
HTTP メッセージ署名の検証は, 入力として署名コンテキスト (特に Signature および Signature-Input フィールドを含む対象メッセージ) とアプリケーションの要件を取り, 出力として肯定検証またはエラーとする過程である.
署名を検証するために, 検証者は次のアルゴリズムを適用しなければならない (MUST):
-
4.1 および 4.2 節で述べるとおり Signature および Signature-Input フィールドを解析し, 検証する署名とそのラベルを取り出す.
1.1. 複数の署名値が存在する場合, 検証者の方針と設定に基づきこのメッセージで処理すべき署名を決定する. 該当する署名が見つからない場合, エラーを出す.
1.2. 選んだ Signature フィールド値に対応する Signature-Input フィールド値 (同一ラベルのもの) がない場合, エラーを出す.
-
選んだ Signature-Input フィールドの値をパラメータ付き Inner List として解析し, 検証対象の署名の被覆コンポーネントの順序付きリストと署名パラメータを得る.
-
対応する Signature フィールドの値を解析し, 検証対象の署名のバイト列値を得る.
-
署名パラメータを調べ, 本文書で述べる要件および署名によって被覆すべきメッセージコンポーネントなどアプリケーションが定義する追加要件 (3.2.1 節) を満たすことを確認する.
-
この署名の検証鍵素材を決定する. 鍵素材が静的設定や外部プロトコル交渉など外部手段で既知の場合, 検証者はその外部知識から鍵素材を得る該当手法を用いる. 鍵が署名パラメータで識別される場合, 検証者は鍵識別子を逆参照して署名に用いる適切な鍵素材を得る. 検証者は, 署名が提示されたコンテキストにおける鍵素材の信頼性を判断しなければならない. 検証者がこのリクエストに対して知らない, 信頼しない, または事前設定と一致しない鍵が識別された場合, 検証は失敗しなければならない (MUST).
-
検証に適用するアルゴリズムを決定する:
6.1. アプリケーションが許容すると知っているアルゴリズムの集合から始める. 次の各ステップがこの集合にないアルゴリズムを選んだ場合, 署名検証は失敗する.
6.2. アルゴリズムが静的設定や外部プロトコル交渉など外部手段で既知の場合, 検証者はそのアルゴリズムを用いる.
6.3. アルゴリズムが鍵素材自体の algorithm フィールドなど鍵素材から決定できる場合, 検証者はそのアルゴリズムを用いる.
6.4. アルゴリズムが "HTTP Signature Algorithms" レジストリの値を用いた alg 署名パラメータで明示されている場合, 検証者は参照されたアルゴリズムを用いる.
6.5. アルゴリズムが複数箇所で指定される場合 (静的設定, alg 署名パラメータ, 鍵素材自体などの組合せ), 解決されたアルゴリズムは同一でなければならない (MUST). 同一でない場合, 検証者は検証を失敗させなければならない (MUST).
-
受信した HTTP メッセージと解析した署名パラメータを用いて, 2.5 節で定義されるアルゴリズムで署名ベースを再作成する. @signature-params への入力値は, 2.3 節で述べる規則に従って直列化されたこの署名の Signature-Input フィールドの値である. これには Signature-Input フィールドからの署名のラベルは含まれないことに注意すること.
-
鍵素材がアルゴリズムに適切であれば, 適切な HTTP_VERIFY 暗号検証アルゴリズムを署名, 再計算した署名ベース, 鍵素材, 署名値に適用する. HTTP_VERIFY 原始およびいくつかの具体アルゴリズムは 3.3 節で定義される.
-
検証アルゴリズム関数の結果が暗号検証関数の最終結果である.
上記のいずれかのステップが失敗するかエラーを出した場合, 署名検証は失敗する.
例えば, 次のメッセージのラベル sig1 の署名を test-key-rsa-pss 鍵 (付録 B.1.2 参照) および 3.3.1 節で述べる RSASSA-PSS アルゴリズムで検証する:
NOTE: '' line wrapping per RFC 8792
POST /foo?param=Value&Pet=dog HTTP/1.1
Host: example.com
Date: Tue, 20 Apr 2021 02:07:55 GMT
Content-Type: application/json
Content-Digest: sha-512=:WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX+T
aPm+AbwAgBWnrIiYllu7BNNyealdVLvRwEmTHWXvJwew==:
Content-Length: 18
Signature-Input: sig1=("@method" "@authority" "@path"
"content-digest" "content-length" "content-type")
;created=1618884473;keyid="test-key-rsa-pss"
Signature: sig1=:HIbjHC5rS0BYaa9v4QfD4193TORw7u9edguPh0AW3dMq9WImrl
FrCGUDih47vAxi4L2YRZ3XMJc1uOKk/J0ZmZ+wcta4nKIgBkKq0rM9hs3CQyxXGxH
LMCy8uqK488o+9jrptQ+xFPHK7a9sRL1IXNaagCNN3ZxJsYapFj+JXbmaI5rtAdSf
SvzPuBCh+ARHBmWuNo1UzVVdHXrl8ePL4cccqlazIJdC4QEjrF+Sn4IxBQzTZsL9y
9TP5FsZYzHvDqbInkTNigBcE9cKOYNFCn4D/WM7F6TNuZO9EgtzepLWcjTymlHzK7
aXq6Am6sfOrpIC49yXjj3ae6HRalVc/g==:
{"hello": "world"}
少なくとも method, authority, path, content-digest, content-length, content-type の各エントリが署名され, 検証時に署名作成タイムスタンプが十分新しいという追加要件があれば, 検証は成功する.