メインコンテンツまでスキップ

2.5. 署名ベースの作成

2.5. 署名ベースの作成

署名ベース (signature base) は, 署名によって被覆される HTTP メッセージコンポーネントを正規化した ASCII 文字列 [ASCII] である. 署名ベース作成アルゴリズムへの入力は, 被覆コンポーネント識別子の順序付き集合とそれに関連する値, および 2.3 節で述べる追加の署名パラメータである.

コンポーネント識別子は [STRUCTURED-FIELDS] の 4 節で定義される厳密な直列化規則を用いて直列化される. コンポーネント識別子はコンポーネント名を持ち, それは sf-string ABNF 規則を用いて直列化された String Item 値である. コンポーネント識別子は, parameters ABNF 規則を用いて直列化される定義済みパラメータを含んでもよい (MAY). 2.3 節で定義される署名パラメータ行も同じパターンに従うが, コンポーネント識別子は固定値でパラメータのない String Item であり, コンポーネント値は常にパラメータ任意の Inner List である.

これは, コンポーネント名自体の直列化が二重引用符で囲まれ, パラメータがセミコロン区切りのリストとして後に続くことを意味する. 例: "cache-control", "@authority", "@signature-params", または "example-dictionary";key="foo".

出力は署名ベースを形成するバイトの順序付き集合であり, 次の ABNF に適合する:

signature-base = *( signature-base-line LF ) signature-params-line signature-base-line = component-identifier ":" SP ( derived-component-value / *field-content ) ; no obs-fold nor obs-text component-identifier = component-name parameters component-name = sf-string derived-component-value = *( VCHAR / SP ) signature-params-line = DQUOTE "@signature-params" DQUOTE ":" SP inner-list

署名ベースを作成するために, 署名者または検証者は次のアルゴリズムを用いて, 署名の被覆コンポーネントごとに (それらのパラメータを含む) 各コンポーネント識別子のエントリを連結する. 記載どおりに生成されたすべてのエラーは, 署名ベースを出力せずに直ちにアルゴリズムを失敗させなければならない (MUST).

  1. 出力を空文字列とする.

  2. 被覆コンポーネント集合内の各メッセージコンポーネント項目について (順序どおり):

    2.1. コンポーネント識別子 (そのパラメータを含む) が既に署名ベースに追加されている場合, エラーを出す.

    2.2. component-identifier ABNF 規則に従って直列化された被覆コンポーネントのコンポーネント識別子を追加する. この直列化はコンポーネント名を二重引用符内に置き, 引用符の外に任意のパラメータを追加する.

    2.3. 単一のコロン (:) を追加する.

    2.4. 単一のスペース (" ") を追加する.

    2.5. コンポーネント識別子のコンポーネント値を決定する.

      *  コンポーネント識別子に理解できないパラメータがある場合, エラーを出す.

    * コンポーネント識別子に相互に両立しないパラメータ (bs と sf など) がある場合, エラーを出す.

    * コンポーネント識別子に req パラメータが含まれ, 対象メッセージがリクエストである場合, エラーを出す.

    * コンポーネント識別子に req パラメータが含まれ, 対象メッセージがレスポンスである場合, コンポーネント値のコンテキストは対象レスポンスメッセージに関連するリクエストメッセージである. それ以外の場合, コンポーネント値のコンテキストは対象メッセージである.

    * コンポーネント名が "at" (@) 文字で始まる場合, 2.2 節で示すとおり既知の有効なパラメータの処理を含め, 派生コンポーネントに定義された特定の規則に従ってメッセージからコンポーネントの値を導出する. 派生コンポーネント名が不明であるか値を導出できない場合, エラーを出す.

    * コンポーネント名が "at" (@) 文字で始まらない場合, 2.1 節で述べるとおり既知の有効なパラメータの処理を含め HTTP フィールド値を正規化する. メッセージにフィールドが見つからないか, コンテキストで値を取得できない場合, エラーを出す.

    2.6. 正規化された被覆コンポーネントのコンポーネント値を追加する.

    2.7. 単一の改行 (\n) を追加する.

  3. 次のとおり signature-params-line 規則に従い署名パラメータコンポーネント (2.3 節) を追加する:

    3.1. component-identifier 規則に従って署名パラメータのコンポーネント識別子を追加する. すなわち, 正確に "@signature-params" (二重引用符を含む).

    3.2. 単一のコロン (:) を追加する.

    3.3. 単一のスペース (" ") を追加する.

    3.4. 2.3 節で定義されるとおり署名パラメータの正規化されたコンポーネント値を追加する. すなわち, パラメータ付きの Inner List 構造化フィールド値.

  4. 出力文字列に非 ASCII 文字 [ASCII] が含まれる場合はエラーを出す.

  5. 出力文字列を返す.

被覆コンポーネントがメッセージ内のコンポーネント値に解決できないコンポーネント識別子を参照する場合, 実装はエラーを出し署名ベースを作成してはならない (MUST). そのような状況には次が含まれるがこれに限られない:

  • 署名者または検証者が派生コンポーネント名を理解しない.

  • コンポーネント名がメッセージに存在しないフィールド, または値が不正なフィールドを指す.

  • コンポーネント識別子に, 不明なパラメータが含まれるか, 付属先のコンポーネント識別子に適用されないパラメータが含まれる.

  • コンポーネント識別子が構造化フィールド直列化 (sf パラメータ経由) を用いることを示すが, 当該フィールドが構造化フィールドでないことが分かっているか, 構造化フィールドの型が実装に不明である.

  • コンポーネント識別子が Dictionary メンバー識別子であり, メッセージに存在しないフィールド, Dictionary 構造化フィールドでないフィールド, または値が不正なフィールドを参照する.

  • コンポーネント識別子が Dictionary メンバー識別子または名前付きクエリパラメータ識別子であり, コンポーネント値に存在しないメンバー, または値が不正なメンバーを参照する. 例: 識別子が "example-dict";key="c" で, Example-Dict ヘッダフィールドの値が a=1, b=2 であり c 値がない.

次の非規範的例では, 署名対象の HTTP メッセージが次のリクエストである:

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

{"hello": "world"}

被覆コンポーネントは, 順に @method, @authority, @path 派生コンポーネントの後に Content-Digest, Content-Length, Content-Type HTTP ヘッダフィールドからなる. 署名パラメータは作成タイムスタンプ 1618884473 と鍵識別子 test-key-rsa-pss からなる. 検証者は識別された鍵に基づき RSA-PSS アルゴリズムを用いることがアプリケーションにより既知であるため, ここでは明示的な alg パラメータは与えられていない. これらのパラメータを伴うこのメッセージの署名ベースは次のとおり:

NOTE: '' line wrapping per RFC 8792

"@method": POST "@authority": example.com "@path": /foo "content-digest": sha-512=:WZDPaVn/7XgHaAy8pmojAkGWoRx2UFChF41A2svX
+TaPm+AbwAgBWnrIiYllu7BNNyealdVLvRwEmTHWXvJwew==: "content-length": 18 "content-type": application/json "@signature-params": ("@method" "@authority" "@path"
"content-digest" "content-length" "content-type")
;created=1618884473;keyid="test-key-rsa-pss"

        Figure 1: Non-normative Example Signature Base

上の例の署名ベースには, 表示例を終える最終改行は含まれないことに注意すること. 本仕様の他箇所に示す他の例の署名ベースも同様である.