跳到主要内容

3.1. Creating a Signature (创建签名)

3.1. Creating a Signature (创建签名)

创建 HTTP 消息签名的过程以签名上下文 (含目标消息) 与应用需求为输入. 输出为签名值与可通过将其加入消息传递给验证者的签名参数集合.

为创建签名, 签名者必须应用下列算法:

  1. 签名者从潜在签名算法集合中选择 HTTP 签名算法与用于签名的密钥材料. 潜在算法集合由应用确定, 不在本文档范围. 签名者必须选择与签名算法匹配且符合算法所定义要求 (如密钥长度或格式) 的密钥材料. 签名者选择算法与密钥材料的机制不在本文档范围.

  2. 签名者将签名的创建时间设为当前时间.

  3. 若适用, 签名者将签名的过期时间属性设为签名应过期的时间. 过期是对验证者的提示, 表示签名者在该时间后不再为该签名担保. 适当的过期长度及此参数的处理要求属于应用特定.

  4. 签名者创建表示签名将覆盖的消息组成部分的有序组成部分标识符集合, 并将签名元数据参数附加到此集合. 此集合的序列化值稍后用作第 4.1 节所述 Signature-Input 字段的值.

    • 一旦被覆盖组成部分顺序选定, 在签名整个生命周期内不得更改.

    • 每个被覆盖组成部分标识符必须是 (1) 签名上下文中的 HTTP 字段 (第 2.1 节) 或 (2) 第 2.2 节或 "HTTP Signature Derived Component Names" 注册表中列出的派生组成部分.

    • 请求签名者应将被覆盖组成部分中包含部分或全部消息控制数据, 例如 @method, @authority, @target-uri 或其某种组合.

    • 签名者应包含 created 签名元数据参数以指示签名创建时间.

    • @signature-params 派生组成部分标识符不得出现在被覆盖组成部分标识符列表中. 该派生组成部分必须始终为签名基最后一行, 确保签名始终覆盖其自身元数据且元数据不能被替换.

    • 关于此集合应包含内容及顺序的进一步指导不在本文档范围.

  5. 签名者使用这些参数与签名基创建算法 (第 2.5 节) 创建签名基.

  6. 签名者使用 HTTP_SIGN 原语函数以所选签名算法与所选密钥材料对签名基签名. HTTP_SIGN 原语与若干具体签名算法应用定义于第 3.3 节.

  7. 签名函数输出的字节数组为要按第 4.2 节纳入 Signature 字段的 HTTP 消息签名输出值.

例如, 给定第 2.5 节示例中的 HTTP 消息与签名参数, 示例签名基使用 test-key-rsa-pss 密钥 (见附录 B.1.2) 与第 3.3.1 节所述 RSASSA-PSS 算法签名, 产生下列 Base64 编码的消息签名输出值:

NOTE: '' line wrapping per RFC 8792

HIbjHC5rS0BYaa9v4QfD4193TORw7u9edguPh0AW3dMq9WImrlFrCGUDih47vAxi4L2
YRZ3XMJc1uOKk/J0ZmZ+wcta4nKIgBkKq0rM9hs3CQyxXGxHLMCy8uqK488o+9jrptQ
+xFPHK7a9sRL1IXNaagCNN3ZxJsYapFj+JXbmaI5rtAdSfSvzPuBCh+ARHBmWuNo1Uz
VVdHXrl8ePL4cccqlazIJdC4QEjrF+Sn4IxBQzTZsL9y9TP5FsZYzHvDqbInkTNigBc
E9cKOYNFCn4D/WM7F6TNuZO9EgtzepLWcjTymlHzK7aXq6Am6sfOrpIC49yXjj3ae6H
RalVc/g==

       Figure 2: Non-normative Example Signature Value (图 2: 非规范性示例签名值)

注意此处使用的 RSA-PSS 算法为非确定性, 即每次运行算法将产生不同签名值. 此处提供的签名值可相对给定密钥校验, 但新生成的签名值预计与示例不匹配. 见第 7.3.5 节.