跳到主要内容

3.2. Verifying a Signature (验证签名)

3.2. Verifying a Signature (验证签名)

验证 HTTP 消息签名的过程以签名上下文 (含目标消息, 特别是其 SignatureSignature-Input 字段) 与应用需求为输入. 验证输出为验证成功或错误.

为验证签名, 验证者必须应用下列算法:

  1. 按第 4.1 与 4.2 节解析 SignatureSignature-Input 字段, 提取待验证的签名及其标签.

    1.1. 若存在多个签名值, 根据验证者的策略与配置确定应处理哪个签名. 若未找到适用签名, 产生错误.

    1.2. 若所选 Signature 字段值没有对应的 Signature-Input 字段值 (即相同标签), 产生错误.

  2. 将所选 Signature-Input 字段的值解析为参数化 Inner List, 获得有序被覆盖组成部分列表与待验证签名的签名参数.

  3. 解析对应 Signature 字段的值以获得待验证签名的字节数组值.

  4. 检查签名参数以确认签名符合本文档及应用定义的任何附加要求 (如哪些消息组成部分必须由签名覆盖) (第 3.2.1 节).

  5. 确定此签名的验证密钥材料. 若密钥材料通过静态配置或外部协议协商等外部方式获知, 验证者使用适用技术从此外部知识获取密钥材料. 若在签名参数中标识密钥, 验证者将密钥标识符解引用为用于签名的适当密钥材料. 验证者必须确定密钥材料对呈现签名的上下文是否可信. 若标识的密钥对此请求未知或不可信或不匹配预配置内容, 验证必须失败.

  6. 确定用于验证的算法:

    6.1. 从应用已知的允许算法集合开始. 若下列任一步骤选择的算法不在此集合中, 签名验证失败.

    6.2. 若算法通过静态配置或外部协议协商等外部方式获知, 验证者使用该算法.

    6.3. 若可从密钥材料确定算法 (例如密钥值本身的 algorithm 字段), 验证者使用该算法.

    6.4. 若算法在签名参数中使用来自 "HTTP Signature Algorithms" 注册表的值显式声明, 验证者使用所引用算法.

    6.5. 若在多个位置指定算法 (例如静态配置, alg 签名参数与密钥材料本身的组合), 解析出的算法必须相同. 若不相同, 验证者必须验证失败.

  7. 使用收到的 HTTP 消息与解析的签名参数按第 2.5 节定义算法重建签名基. @signature-params 输入值为按第 2.3 节规则序列化的此签名的 Signature-Input 字段值. 注意这不包括 Signature-Input 字段中的签名标签.

  8. 若密钥材料适用于算法, 对签名, 重算的签名基, 密钥材料与签名值应用适当的 HTTP_VERIFY 密码学验证算法. HTTP_VERIFY 原语与若干具体算法定义于第 3.3 节.

  9. 验证算法函数的结果为密码学验证函数的最终结果.

若上述任一步骤失败或产生错误, 签名验证失败.

例如, 使用 test-key-rsa-pss 密钥 (附录 B.1.2) 与第 3.3.1 节 RSASSA-PSS 算法验证下列消息中带标签 sig1 的签名:

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 条目, 且验证时签名创建时间戳足够新的条件下, 验证通过.