<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-meunier-web-bot-auth-architecture-05" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="HTTP Message Signatures for Bots">HTTP Message Signatures for automated traffic Architecture</title>
    <seriesInfo name="Internet-Draft" value="draft-meunier-web-bot-auth-architecture-05"/>
    <author fullname="Thibault Meunier">
      <organization>Cloudflare</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <author fullname="Sandor Major">
      <organization>Google</organization>
      <address>
        <email>ietf@sandormajor.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="02"/>
    <area>Web and Internet Transport</area>
    <workgroup>Web Bot Auth</workgroup>
    <keyword>not-yet</keyword>
    <abstract>
      <?line 48?>

<t>This document describes an architecture for identifying automated
traffic using <xref target="HTTP-MESSAGE-SIGNATURES"/>. The goal
is to allow automated HTTP clients to cryptographically sign outbound
requests, allowing HTTP servers to verify their identity with confidence.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://thibmeu.github.io/http-message-signatures-directory/draft-meunier-web-bot-auth-architecture.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-meunier-web-bot-auth-architecture/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Web Bot Auth Working Group mailing list (<eref target="mailto:web-bot-auth@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/web-bot-auth/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/web-bot-auth/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/thibmeu/http-message-signatures-directory"/>.</t>
    </note>
  </front>
  <middle>
    <?line 56?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Agents are increasingly used in business and user workflows, including AI assistants,
search indexing, content aggregation, and automated testing. These agents need to reliably identify
themselves to origins for several reasons:</t>
      <ol spacing="normal" type="1"><li>
          <t>Regulatory compliance requiring transparency of automated systems</t>
        </li>
        <li>
          <t>Origin resource management and access control</t>
        </li>
        <li>
          <t>Protection against impersonation and reputation management</t>
        </li>
        <li>
          <t>Service level differentiation between human and automated traffic</t>
        </li>
      </ol>
      <t>Current identification methods such as IP allowlisting, User-Agent strings, or shared API keys have
significant limitations in security, scalability, and manageability. This document defines an
architecture enabling agents to cryptographically identify themselves using <xref target="HTTP-MESSAGE-SIGNATURES"/>.
It proposes that every request from bots to be signed by a private key owned by its provider.
This way, every origin can validate the service identity.</t>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>There is an increase in agent traffic on the Internet. Many agents
choose to identify their traffic today via IP Address lists and/or unique
User-Agents. This is often done to demonstrate trust and safety claims, support
allowlisting/denylisting the traffic in a granular manor, and enable sites to
monitor and rate limit per agent operator. However, these mechanisms have drawbacks:</t>
      <ol spacing="normal" type="1"><li>
          <t>User-Agent, when used alone, can be spoofed meaning anyone may attempt to
act as that agent. It is also overloaded - an agent may be using Chromium and
wish to present itself as such to ensure rendering works, yet it still wants to
differentiate its traffic to the site.</t>
        </li>
        <li>
          <t>IP blocks alone can present a confusing story. IPs on cloud plaforms have
layers of ownership - the platform owns the IP and registers it in their
published IP blocks, only to be re-published by the agent with little to bind
the publication to the actual service provider that may be renting infra. Purchasing
dedicated IP blocks is expensive, time consuming, and requires significant
specialist knowledge to set up. These IP blocks may have prior reputation
history that needs to be carefully inspected and managed before purchase and
use.</t>
        </li>
        <li>
          <t>An agent may go to every website on the Internet and share a secret with
them like a Bearer from  <xref target="OAUTH-BEARER"/>. This is impractical to scale for any
agent beyond select partnerships, and insecure, as key rotation is challenging
and becomes less secure as the consumers scale.</t>
        </li>
      </ol>
      <t>Using well-established cryptography, we can instead define a simple and secure
mechanism that empowers small and large agents to share their identity.</t>
      <section anchor="http-layer-choice">
        <name>HTTP layer choice</name>
        <t>This architecture operates solely at the HTTP layer.
It allows signatures to be generated and
verified without modifying the transport layer or TLS stack. It enables
flexible deployment across proxies, gateways, and origin servers, and aligns
with existing tooling and infrastructure that already inspect and manipulate
HTTP headers.</t>
        <t>Because the signature is embedded in the request itself, it travels with the
message through intermediaries, preserving end-to-end verifiability even when
requests are forwarded or transformed within the HTTP layer.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<t>The following terms are used throughout this document:</t>
      <dl>
        <dt><strong>User</strong></dt>
        <dd>
          <t>An entity initiating requests through an agent. May be a human operator or another system.</t>
        </dd>
        <dt><strong>Agent</strong></dt>
        <dd>
          <t>An orchestrated user agent (e.g. Chromium, CURL). It implements the HTTP protocol and constructs valid HTTP requests with <xref target="HTTP-MESSAGE-SIGNATURES"/> signatures.</t>
        </dd>
        <dt><strong>Origin</strong></dt>
        <dd>
          <t>An HTTP server receiving signed requests that implements the HTTP protocol and verifies <xref target="HTTP-MESSAGE-SIGNATURES"/> signatures. It acts as a verifier of the signature as defined by <xref target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        </dd>
      </dl>
    </section>
    <section anchor="architecture">
      <name>Architecture</name>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="608" viewBox="0 0 608 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,32 L 8,176" fill="none" stroke="black"/>
            <path d="M 80,32 L 80,176" fill="none" stroke="black"/>
            <path d="M 208,32 L 208,176" fill="none" stroke="black"/>
            <path d="M 288,32 L 288,176" fill="none" stroke="black"/>
            <path d="M 512,32 L 512,176" fill="none" stroke="black"/>
            <path d="M 600,32 L 600,176" fill="none" stroke="black"/>
            <path d="M 8,32 L 80,32" fill="none" stroke="black"/>
            <path d="M 208,32 L 288,32" fill="none" stroke="black"/>
            <path d="M 512,32 L 600,32" fill="none" stroke="black"/>
            <path d="M 296,62 L 336,62" fill="none" stroke="black"/>
            <path d="M 296,66 L 336,66" fill="none" stroke="black"/>
            <path d="M 464,62 L 504,62" fill="none" stroke="black"/>
            <path d="M 464,66 L 504,66" fill="none" stroke="black"/>
            <path d="M 80,96 L 104,96" fill="none" stroke="black"/>
            <path d="M 184,96 L 200,96" fill="none" stroke="black"/>
            <path d="M 288,112 L 312,112" fill="none" stroke="black"/>
            <path d="M 488,112 L 504,112" fill="none" stroke="black"/>
            <path d="M 296,128 L 360,128" fill="none" stroke="black"/>
            <path d="M 448,128 L 512,128" fill="none" stroke="black"/>
            <path d="M 88,144 L 104,144" fill="none" stroke="black"/>
            <path d="M 192,144 L 208,144" fill="none" stroke="black"/>
            <path d="M 8,176 L 80,176" fill="none" stroke="black"/>
            <path d="M 208,176 L 288,176" fill="none" stroke="black"/>
            <path d="M 512,176 L 600,176" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="512,112 500,106.4 500,117.6" fill="black" transform="rotate(0,504,112)"/>
            <polygon class="arrowhead" points="512,64 500,58.4 500,69.6" fill="black" transform="rotate(0,504,64)"/>
            <polygon class="arrowhead" points="304,128 292,122.4 292,133.6" fill="black" transform="rotate(180,296,128)"/>
            <polygon class="arrowhead" points="304,64 292,58.4 292,69.6" fill="black" transform="rotate(180,296,64)"/>
            <polygon class="arrowhead" points="208,96 196,90.4 196,101.6" fill="black" transform="rotate(0,200,96)"/>
            <polygon class="arrowhead" points="96,144 84,138.4 84,149.6" fill="black" transform="rotate(180,88,144)"/>
            <g class="text">
              <text x="396" y="52">Exchange</text>
              <text x="400" y="68">Cryptographic</text>
              <text x="396" y="84">material</text>
              <text x="44" y="100">User</text>
              <text x="144" y="100">Request</text>
              <text x="248" y="100">Agent</text>
              <text x="556" y="100">Origin</text>
              <text x="352" y="116">Request</text>
              <text x="392" y="116">+</text>
              <text x="440" y="116">Signature</text>
              <text x="404" y="132">Response</text>
              <text x="148" y="148">Response</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
+--------+               +---------+                           +----------+
|        |               |         |         Exchange          |          |
|        |               |         |<===== Cryptographic =====>|          |
|        |               |         |         material          |          |
|  User  +--- Request -->|  Agent  |                           |  Origin  |
|        |               |         +--- Request + Signature -->|          |
|        |               |         |<-------- Response --------+          |
|        |<-- Response --+         |                           |          |
|        |               |         |                           |          |
+--------+               +---------+                           +----------+
]]></artwork>
      </artset>
      <t>A User initiates an action requiring the Agent to perform an HTTP request.
The Agent constructs the request, generates a signature using its signing key,
and includes it in the request as defined in <xref section="3.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>
along with the <tt>Signature-Agent</tt> header for discovery for its
verification key.
Upon receiving the request, the Origin ensures it has the verification key for the Agent,
validates the signature, and processes the request if the signature is valid.</t>
      <section anchor="deployment-models">
        <name>Deployment Models</name>
        <t>Signature verification can be performed either directly by origins or delegated
to a fronting proxy. Direct verification by origins provides simplicity and
control. Proxy verification offloads processing and enables shared caching across
multiple origins. The choice depends on traffic volume and operational
requirements.</t>
      </section>
      <section anchor="generating-http-message-signature">
        <name>Generating HTTP Message Signature</name>
        <t><xref target="HTTP-MESSAGE-SIGNATURES"/> defines components to be signed.</t>
        <t>Agents <bcp14>MUST</bcp14> include at least one of the following components:</t>
        <dl>
          <dt><tt>@authority</tt></dt>
          <dd>
            <t>as defined in <xref section="2.2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>@target-uri</tt></dt>
          <dd>
            <t>as defined in <xref section="2.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
        </dl>
        <t>Agents <bcp14>MUST</bcp14> include the following <tt>@signature-params</tt> as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
        <dl>
          <dt><tt>created</tt></dt>
          <dd>
            <t>as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>expires</tt></dt>
          <dd>
            <t>as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>keyid</tt></dt>
          <dd>
            <t><bcp14>MUST</bcp14> be a base64url JWK SHA-256 Thumbprint as defined in <xref section="3.2" sectionFormat="of" target="JWK-THUMBPRINT"/> for RSA and EC, and in <xref section="A.3" sectionFormat="of" target="JWK-OKP"/> for ed25519.</t>
          </dd>
          <dt><tt>tag</tt></dt>
          <dd>
            <t><bcp14>MUST</bcp14> be <tt>web-bot-auth</tt></t>
          </dd>
        </dl>
        <t>The signing key is available to the agent at request time. Algorithms should be registered with IANA as part of HTTP Message Signatures Algorithm registry.</t>
        <t>The creation of the signature is defined in <xref section="3.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> the expiry to be no more than 24 hours.</t>
        <section anchor="signature-agent">
          <name>Signature-Agent</name>
          <t><tt>Signature-Agent</tt> is an HTTP Method context header defined in Section 4.1 of <xref target="DIRECTORY"/>.
It is <bcp14>RECOMMENDED</bcp14> that the Agent sends requests with <tt>Signature-Agent</tt> header, as described in <xref target="sending-request"/>.
If the header is to be sent, one of its members <bcp14>MUST</bcp14> be signed as a component as defined in <xref section="2.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          <t>This results in the following components to be signed</t>
          <artwork><![CDATA[
("@authority" "signature-agent";key="sig1")
]]></artwork>
          <t>It is <bcp14>RECOMMENDED</bcp14> that the <tt>key</tt> matches the signature label.</t>
        </section>
        <section anchor="anti-replay">
          <name>Anti-replay</name>
          <t>Origins <bcp14>MAY</bcp14> want to prevent signatures from being spoofed or used multiple times by bad actors and thus require a <tt>nonce</tt> to be added to the <tt>@signature-params</tt>.
This is described in <xref section="7.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          <t>Agents <bcp14>SHOULD</bcp14> extend <tt>@signature-parameters</tt> defined in <xref target="generating-http-message-signature"/> as follows:</t>
          <dl>
            <dt><tt>nonce</tt></dt>
            <dd>
              <t>base64url encoded random byte array. It is <bcp14>RECOMMENDED</bcp14> to use a 64-byte array.</t>
            </dd>
          </dl>
          <t>Client <bcp14>MUST</bcp14> ensure that this <tt>nonce</tt> is unique for the validity window of the signature, as defined by created and expires attributes.</t>
        </section>
        <section anchor="additional-headers">
          <name>Additional headers</name>
          <t>Agents <bcp14>MAY</bcp14> include additional components, such as specific HTTP headers, in the signature.
This can be prompted by the origin requesting additional headers, as described in <xref target="requesting-message-signature"/>,
or initiated by the agent to provide more information within the signature scope.
For example, an agent might include an HTTP header expressing its intent and sign it.</t>
          <t>Origins <bcp14>MAY</bcp14> ignore certain headers at their own discretion,
and request a new signature, as described in <xref target="requesting-message-signature"/>.</t>
        </section>
        <section anchor="sending-request">
          <name>Sending a request</name>
          <t>An Agent <bcp14>SHOULD</bcp14> send a request with the signature generated above. Updating the architecture diagram, the flow looks as follow.</t>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="848" viewBox="0 0 848 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,160" fill="none" stroke="black"/>
                <path d="M 88,32 L 88,160" fill="none" stroke="black"/>
                <path d="M 136,112 L 136,256" fill="none" stroke="black"/>
                <path d="M 680,112 L 680,256" fill="none" stroke="black"/>
                <path d="M 752,32 L 752,160" fill="none" stroke="black"/>
                <path d="M 840,32 L 840,160" fill="none" stroke="black"/>
                <path d="M 8,32 L 88,32" fill="none" stroke="black"/>
                <path d="M 752,32 L 840,32" fill="none" stroke="black"/>
                <path d="M 96,62 L 352,62" fill="none" stroke="black"/>
                <path d="M 96,66 L 352,66" fill="none" stroke="black"/>
                <path d="M 496,62 L 744,62" fill="none" stroke="black"/>
                <path d="M 496,66 L 744,66" fill="none" stroke="black"/>
                <path d="M 136,112 L 680,112" fill="none" stroke="black"/>
                <path d="M 88,128 L 128,128" fill="none" stroke="black"/>
                <path d="M 688,128 L 744,128" fill="none" stroke="black"/>
                <path d="M 8,160 L 88,160" fill="none" stroke="black"/>
                <path d="M 752,160 L 840,160" fill="none" stroke="black"/>
                <path d="M 136,256 L 680,256" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="752,128 740,122.4 740,133.6" fill="black" transform="rotate(0,744,128)"/>
                <polygon class="arrowhead" points="752,64 740,58.4 740,69.6" fill="black" transform="rotate(0,744,64)"/>
                <polygon class="arrowhead" points="104,64 92,58.4 92,69.6" fill="black" transform="rotate(180,96,64)"/>
                <g class="text">
                  <text x="420" y="52">Exchange</text>
                  <text x="424" y="68">Cryptographic</text>
                  <text x="420" y="84">material</text>
                  <text x="48" y="100">Agent</text>
                  <text x="796" y="100">Origin</text>
                  <text x="160" y="132">GET</text>
                  <text x="248" y="132">/path/to/resource</text>
                  <text x="188" y="148">Signature:</text>
                  <text x="256" y="148">abc==</text>
                  <text x="212" y="164">Signature-Input:</text>
                  <text x="352" y="164">sig=("@authority"</text>
                  <text x="548" y="164">"signature-agent";key="sig");\</text>
                  <text x="364" y="180">created=1700000000;\</text>
                  <text x="364" y="196">expires=1700011111;\</text>
                  <text x="356" y="212">keyid="ba3e64==";\</text>
                  <text x="356" y="228">tag="web-bot-auth"</text>
                  <text x="212" y="244">Signature-Agent:</text>
                  <text x="412" y="244">sig="https://signer.example.com"</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+---------+                                                                                  +----------+
|         |                                     Exchange                                     |          |
|         |<================================  Cryptographic  ===============================>|          |
|         |                                     material                                     |          |
|  Agent  |                                                                                  |  Origin  |
|         |     .-------------------------------------------------------------------.        |          |
|         +-----| GET /path/to/resource                                             |------->|          |
|         |     | Signature: abc==                                                  |        |          |
+---------+     | Signature-Input: sig=("@authority" "signature-agent";key="sig");\ |        +----------+
                |                  created=1700000000;\                             |
                |                  expires=1700011111;\                             |
                |                  keyid="ba3e64==";\                               |
                |                  tag="web-bot-auth"                               |
                | Signature-Agent: sig="https://signer.example.com"                 |
                '-------------------------------------------------------------------'
]]></artwork>
          </artset>
          <t>The Agent <bcp14>SHOULD</bcp14> send requests with two headers</t>
          <ol spacing="normal" type="1"><li>
              <t><tt>Signature</tt> defined in <xref target="generating-http-message-signature"/></t>
            </li>
            <li>
              <t><tt>Signature-Input</tt> defined in <xref target="generating-http-message-signature"/></t>
            </li>
          </ol>
          <t>Mentioned in <xref target="signature-agent"/>, the Agent <bcp14>MAY</bcp14> send requests with <tt>Signature-Agent</tt> header.</t>
        </section>
      </section>
      <section anchor="requesting-message-signature">
        <name>Requesting a Message signature</name>
        <t><xref section="5" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> defines the <tt>Accept-Signature</tt> field which can be used to request a Message Signature from a client by an origin.
An Origin <bcp14>MAY</bcp14> choose to request signatures from clients that did not initially provide them. If requesting, Origins <bcp14>MUST</bcp14> use the same parameters as those defined by the <xref target="generating-http-message-signature"/>.
The status code <bcp14>SHOULD</bcp14> be 403 Forbidden as defined in <xref section="15.5.4" sectionFormat="of" target="HTTP"/>.</t>
        <t>Origin <bcp14>MAY</bcp14> request a new signature with tag "web-bot-auth" even if a nonce is provided, for example if it believes the nonce is a replay, or if it doesn't store nonces and thus requests new signatures every time.
The status code <bcp14>SHOULD</bcp14> be 429 Too Many Requests as defined in <xref section="4" sectionFormat="of" target="HTTP-MORE-STATUS-CODE"/>.</t>
      </section>
      <section anchor="validating-message-signature">
        <name>Validating Message signature</name>
        <t>Upon receiving an HTTP request, the origin has to verify the signature. The algorithm is provided in <xref section="3.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
Similar to a regular User-Agent check, this happens at the HTTP layer, once headers are received.</t>
        <t>Additional requirements are placed on this validation:</t>
        <ul spacing="normal">
          <li>
            <t>During step 1 to 3 included, if the Origin fails to parse the provided <tt>Signature</tt>, <tt>Signature-Input</tt>, or <tt>Signature-Agent</tt> headers, it <bcp14>MAY</bcp14> respond with status code 400 Bad Request as defined in <xref section="15.5.1" sectionFormat="of" target="HTTP"/>.</t>
          </li>
          <li>
            <t>During step 4, the Origin <bcp14>MAY</bcp14> discard signatures for which the <tt>tag</tt> is not set to <tt>web-bot-auth</tt>.</t>
          </li>
          <li>
            <t>During step 5, the Origin <bcp14>MAY</bcp14> discard signatures for which they do not know the <tt>keyid</tt>.</t>
          </li>
          <li>
            <t>During step 5, if the keyid is unknown to the origin, they <bcp14>MAY</bcp14> fetch the provider directory as indicated by <tt>Signature-Agent</tt> header defined in Section 4 of <xref target="DIRECTORY"/>.</t>
          </li>
        </ul>
        <t>Origin <bcp14>MAY</bcp14> require the <tt>nonce</tt> to satisfy certain constraint: be globally unique using a global nonce store, be unique to a specific location or time window using a local cache, or not constraint at all.</t>
      </section>
      <section anchor="key-distribution-and-discovery">
        <name>Key Distribution and Discovery</name>
        <t>This section describes the discovery mechanism for the agent directory.</t>
        <t>The reference for discovery is a FQDN. It <bcp14>SHOULD</bcp14> provide a directory hosted on the well known registered in Section 4 of <xref target="DIRECTORY"/>.</t>
        <t>Example:</t>
        <sourcecode type="json"><![CDATA[
{
  "keys": {
    "kty": "OKP",
    "crv": "Ed25519",
    "kid": "NFcWBst6DXG-N35nHdzMrioWntdzNZghQSkjHNMMSjw",
    "x": "JrQLj5P_89iXES9-vFgrIy29clF9CC_oPPsw3c5D0bs",
    "use": "sig",
    "nbf": 1712793600,
    "exp": 1715385600
  }
}
]]></sourcecode>
        <section anchor="out-of-band-communication-between-client-and-origin">
          <name>Out-of-band communication between client and origin</name>
          <t>A service submitting their key to an origin, or the origin manually adding a service to their trusted list.</t>
        </section>
        <section anchor="public-list">
          <name>Public list</name>
          <t>Could be a GitHub repository like the public suffix list. The issue is the gating of such repositories, and therefore its governance.</t>
        </section>
        <section anchor="signature-agent-header">
          <name>Signature-Agent header</name>
          <t>This allows for backward compatibility with existing header agent filtering, and an upgrade to a cryptographically secured protocol.
See <xref target="signature-agent"/> for more details.</t>
        </section>
      </section>
      <section anchor="session-protocol-considerations">
        <name>Session Protocol Considerations</name>
        <t>Per-request signature generation and verification may incur computational overhead from cryptographic operations and key discovery. For high-frequency interactions, origins might establish sessions to reduce repeated verification.</t>
        <t>One approach: after successful signature verification, an origin issues a session credential (e.g., an HTTP cookie) that subsequent requests present in lieu of a full signature. This trades cryptographic verification costs for the security properties of bearer tokens, including susceptibility to credential theft and replay within the session lifetime.</t>
        <t>The design of session protocols, including appropriate session lifetimes and binding mechanisms, is out of scope for this document.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="use-of-tls">
        <name>Use of TLS</name>
        <t>We reassess <xref section="7.1.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
Clients <bcp14>SHOULD</bcp14> use TLS <xref target="RFC8446"/>
(https) or equivalent transport security when making requests with
Message signatures. Failing to do so exposes the Message signature to numerous
attacks that could give attackers unintended access.</t>
        <t>This include reverse proxy and their consideration presented in <xref target="reverse-proxy"/>.</t>
        <t>An origin <bcp14>SHOULD</bcp14> refuse Signature headers when communicated over an unsecured channel.</t>
      </section>
      <section anchor="performance-impact">
        <name>Performance Impact</name>
        <t>Origins should account for the overhead of signature verification in their operations. A local cache of public keys reduces network requests and verification latency. The choice of signing algorithm impacts CPU requirements. Origins should monitor verification latency and set appropriate timeouts to maintain service levels under load.</t>
      </section>
      <section anchor="nonce-validation">
        <name>Nonce validation</name>
        <t>Clients are the one controlling the nonce. While <xref target="anti-replay"/> mandates that clients <bcp14>MUST</bcp14> provide a globally unique nonce, it is the origin's responsibility to enforce it.</t>
        <t>Different validation policies have different performance and operational considerations. Global uniqueness requires a global nonce store. Some origins may find that their use case can tolerate sharding on location, timing, or other properties.</t>
      </section>
      <section anchor="key-compromise-response">
        <name>Key Compromise Response</name>
        <t>An agent signing key might get compromised.</t>
        <t>If that happens, the agent <bcp14>SHOULD</bcp14> cease using the compromised key as soon as possible, notify affected origins if possible, and generate a new key pair.</t>
        <t>To minimise the impact of a key compromise, the origin should support rapid key rotation and monitor for suspicious signature patterns.</t>
      </section>
      <section anchor="shared-secrets-considered-harmful">
        <name>Shared Secrets Considered Harmful</name>
        <t>Implementations <bcp14>MUST NOT</bcp14> use shared HMAC defined in <xref section="3.3.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
Shared secrets break non-repudiation and make auditing
difficult. Each automated client <bcp14>SHOULD</bcp14> use a unique asymmetric keypair to
ensure attribution, support key rotation, and enable effective revocation if
needed.</t>
      </section>
      <section anchor="key-reuse-considered-harmful">
        <name>Key Reuse Considered Harmful</name>
        <t>Implementations <bcp14>SHOULD NOT</bcp14> reuse a signing key for different purposes. For
example, if an agent implementor has two agents they want to differentiate,
these should use distinct signing keys and signing key directories.</t>
      </section>
      <section anchor="reverse-proxy">
        <name>Reverse proxy consideration</name>
        <t>An origin may be placed behind a reverse proxy, which means the proxy will see
the <tt>Signature</tt> and <tt>Signature-Agent</tt> headers before the origin does.
A proxy <bcp14>SHOULD NOT</bcp14> strip the <tt>Signature</tt> or <tt>Signature-Agent</tt> headers from
requests.</t>
        <t>A proxy <bcp14>SHOULD NOT</bcp14> replay signatures against other reverse proxies used by the
origin, as this allows impersonation of the principal signature agent.</t>
        <t>Origins <bcp14>MAY</bcp14> require a specific nonce policy to prevent such malicious behaviour
and decide to validate the signature themselves. This has to be done in
accordance with <xref target="nonce-validation"/>. For example, an origin could
require a nonce derived from public information (such as the current date),
mandate nonce chaining (where each nonce is the hash of the previous one),
or provide its own nonce in an <tt>Accept-Signature</tt> response to challenge the agent.</t>
        <t>Such policies <bcp14>MAY</bcp14> incur additional round-trip between the client and the origin
to convey <tt>accept-signature</tt> header, or deployment specific exchanges.</t>
        <section anchor="signature-agent-labeling">
          <name>Signature-Agent labeling</name>
          <t>An intermediary is allowed to relabel an existing signature when processing the
message, per <xref section="7.2.5" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          <t>This <bcp14>MAY</bcp14> apply to <tt>Signature-Agent</tt>, when included in the request as defined in
<xref target="signature-agent"/>,
An intermediary updating the member key <bcp14>MUST</bcp14> update the components of the
associated signatures accordingly.</t>
          <t>For instance, an intermediary updating the <tt>Signature-Agent</tt> from <tt>sig2</tt> to
<tt>sig3</tt> on the example provided in <xref target="example-signature-agent-included"/> would
result in the following <tt>Signature</tt>, <tt>Signature-Input</tt>, and <tt>Signature-Agent</tt>
header.</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: sig3="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="sig3")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=1735693200\
 ;nonce="XSHtZVCThSIAksXsH9WBs6AtxtXC0eQGiIcUGSoJstFs8lAWakjhrfwzLhyjtme5iXMZvmFWqDEs6cT3Jf+BbQ=="\
 ;tag="web-bot-auth"
Signature: sig2=:I1QWNzGXdP1a4dSvOHLCVOOanEYHDk+ZsVxM9MLX/p4ko69ghKwR5EOtAD96g7g4GWP7lmpM/jFAf9q8EFRDTPLjUXySwMv4YPgabv2LQihTJG2y8a2m6IGltyruwQNiqSJVUuRaG9+b17CGmAMFZh30X6GXLdQJrCARpeTqPwp2DC+a8haDE/VE5EruqzjA5/2mKwvrkzkSqeW5tOVtFwWRRHIOidquf/8Je6kM9mhgkg4arudLA5SL4wyyYE1jURIgcOl8agrfdJ5Def23DIRtiOLRa8jT9cpTLFAuFHN+mrZA/LH9h0gSIg1cPb+0cMASee5uku1KjWcFer7jWA==:
]]></artwork>
          <t><tt>Signature</tt> is unchanged as the base is similar. Both <tt>Signature-Agent</tt> and
<tt>Signature-Input</tt> reflect the update from <tt>sig2</tt> to <tt>sig3</tt>.
.
# Privacy Considerations</t>
        </section>
      </section>
      <section anchor="public-identity">
        <name>Public Identity</name>
        <t>This architecture assumes that automated clients identify themselves
explicitly using digital signatures. The identity associated with a signing
key is expected to be publicly discoverable for verification purposes. This
reduces anonymity and allows receivers to associate requests with specific
agents. If an agent wishes not to identify itself, this is not the right
choice of protocol for it.</t>
      </section>
      <section anchor="no-human-correlation">
        <name>No Human Correlation</name>
        <t>The key used for signing <bcp14>MUST NOT</bcp14> be tied to a specific human individual.
Keys <bcp14>SHOULD</bcp14> represent a role, company, or automation identity (e.g., "news-aggregator-
bot", "example-crawler-v1"). This avoids accidental exposure of personally
identifiable information and prevents the misuse of keys for user tracking or
profiling.</t>
      </section>
      <section anchor="minimizing-tracking-risks">
        <name>Minimizing Tracking Risks</name>
        <t>To limit tracking risks, implementations <bcp14>SHOULD</bcp14> avoid long-lived, globally
unique key identifiers unless strictly necessary. Key rotation <bcp14>SHOULD</bcp14> be
supported, and clients <bcp14>SHOULD</bcp14> take care to avoid signing information that
could be used to correlate activity across contexts, especially where
sensitive user data is involved.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="DIRECTORY">
          <front>
            <title>HTTP Message Signatures Directory</title>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Sandor Major" initials="S." surname="Major">
              <organization>Google</organization>
            </author>
            <date day="2" month="March" year="2026"/>
            <abstract>
              <t>   This document describes a method for clients using
   [HTTP-MESSAGE-SIGNATURES] to advertise their signing keys.

   It defines a key directory format based on JWKS as defined in
   Section 5 of [JWK], as well as new HTTP Method Context to allow for
   in-band key discovery.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-meunier-http-message-signatures-directory-05"/>
        </reference>
        <reference anchor="HTTP-MESSAGE-SIGNATURES">
          <front>
            <title>HTTP Message Signatures</title>
            <author fullname="A. Backman" initials="A." role="editor" surname="Backman"/>
            <author fullname="J. Richer" initials="J." role="editor" surname="Richer"/>
            <author fullname="M. Sporny" initials="M." surname="Sporny"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document describes a mechanism for creating, encoding, and verifying digital signatures or message authentication codes over components of an HTTP message. This mechanism supports use cases where the full HTTP message may not be known to the signer and where the message may be transformed (e.g., by intermediaries) before reaching the verifier. This document also describes a means for requesting that a signature be applied to a subsequent HTTP message in an ongoing HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9421"/>
          <seriesInfo name="DOI" value="10.17487/RFC9421"/>
        </reference>
        <reference anchor="HTTP">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="HTTP-CACHE">
          <front>
            <title>HTTP Caching</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document defines HTTP caches and the associated header fields that control cache behavior or indicate cacheable response messages.</t>
              <t>This document obsoletes RFC 7234.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="98"/>
          <seriesInfo name="RFC" value="9111"/>
          <seriesInfo name="DOI" value="10.17487/RFC9111"/>
        </reference>
        <reference anchor="HTTP-MORE-STATUS-CODE">
          <front>
            <title>Additional HTTP Status Codes</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <date month="April" year="2012"/>
            <abstract>
              <t>This document specifies additional HyperText Transfer Protocol (HTTP) status codes for a variety of common situations. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6585"/>
          <seriesInfo name="DOI" value="10.17487/RFC6585"/>
        </reference>
        <reference anchor="JWK-OKP">
          <front>
            <title>CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE)</title>
            <author fullname="I. Liusvaara" initials="I." surname="Liusvaara"/>
            <date month="January" year="2017"/>
            <abstract>
              <t>This document defines how to use the Diffie-Hellman algorithms "X25519" and "X448" as well as the signature algorithms "Ed25519" and "Ed448" from the IRTF CFRG elliptic curves work in JSON Object Signing and Encryption (JOSE).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8037"/>
          <seriesInfo name="DOI" value="10.17487/RFC8037"/>
        </reference>
        <reference anchor="JWK-THUMBPRINT">
          <front>
            <title>JSON Web Key (JWK) Thumbprint</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="N. Sakimura" initials="N." surname="Sakimura"/>
            <date month="September" year="2015"/>
            <abstract>
              <t>This specification defines a method for computing a hash value over a JSON Web Key (JWK). It defines which fields in a JWK are used in the hash computation, the method of creating a canonical form for those fields, and how to convert the resulting Unicode string into a byte sequence to be hashed. The resulting hash value can be used for identifying or selecting the key represented by the JWK that is the subject of the thumbprint.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7638"/>
          <seriesInfo name="DOI" value="10.17487/RFC7638"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="OAUTH-BEARER">
          <front>
            <title>The OAuth 2.0 Authorization Framework: Bearer Token Usage</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <author fullname="D. Hardt" initials="D." surname="Hardt"/>
            <date month="October" year="2012"/>
            <abstract>
              <t>This specification describes how to use bearer tokens in HTTP requests to access OAuth 2.0 protected resources. Any party in possession of a bearer token (a "bearer") can use it to get access to the associated resources (without demonstrating possession of a cryptographic key). To prevent misuse, bearer tokens need to be protected from disclosure in storage and in transport. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6750"/>
          <seriesInfo name="DOI" value="10.17487/RFC6750"/>
        </reference>
        <reference anchor="RFC8446">
          <front>
            <title>The Transport Layer Security (TLS) Protocol Version 1.3</title>
            <author fullname="E. Rescorla" initials="E." surname="Rescorla"/>
            <date month="August" year="2018"/>
            <abstract>
              <t>This document specifies version 1.3 of the Transport Layer Security (TLS) protocol. TLS allows client/server applications to communicate over the Internet in a way that is designed to prevent eavesdropping, tampering, and message forgery.</t>
              <t>This document updates RFCs 5705 and 6066, and obsoletes RFCs 5077, 5246, and 6961. This document also specifies new requirements for TLS 1.2 implementations.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8446"/>
          <seriesInfo name="DOI" value="10.17487/RFC8446"/>
        </reference>
      </references>
    </references>
    <?line 475?>

<section anchor="test-vectors">
      <name>Test Vectors</name>
      <section anchor="rsassa-pss-using-sha-512">
        <name>RSASSA-PSS Using SHA-512</name>
        <t>The test vectors in this section use the RSA-PSS key defined in <xref section="B.1.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
This section includes non-normative test vectors that may be used as test cases to validate implementation correctness.</t>
        <section anchor="signature-agent-absent-from-the-request">
          <name>Signature-Agent absent from the request</name>
          <t>This example presents a minimal signature using the rsa-pss-sha512 algorithm over test-request. The request does not contain
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"@signature-params": ("@authority")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="EfK54mBzFxPqwpmZ430GZRqVGrLT/DplPWuFIM1jLJDjrAIX3yFGidftF1h1+zLHfjoNKhx74yU1psH1XD7BeA=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig1</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Input: sig1=("@authority")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="EfK54mBzFxPqwpmZ430GZRqVGrLT/DplPWuFIM1jLJDjrAIX3yFGidftF1h1+zLHfjoNKhx74yU1psH1XD7BeA=="\
 ;tag="web-bot-auth"
Signature: sig1=:Bqj+UQfJNSRx0Dz/K/4/+Bo1l8UUH5Ps1zYzX6H6nKCyZJ88Hry/KZF2JishxI1h9+LJTmRmDmw2HxbUeZkoUUgmLbg168GWiYFBK0IQRKQvvbnzrONutKNmanvIXNvrN2ZB2h+w9ekSol3XJRncErrwcU2PWltBR+An4H2kIiRBfnBRi85eCVF+s6SYRxoAJvRo6avTCvCZe9Gvw8Ezbj8QnHU37uvTN72+MBDEsFN94ozfAT8MTB4wAwqXYLMf9mnl0mpK2UbnXrzgffRxOhEHVvHNIN8aB7ThM1p4JzaTN1HuXQFPYOWgCojOCv2IovGOygai/j3p4PzMJUp4Lw==:
]]></artwork>
        </section>
        <section anchor="example-signature-agent-included">
          <name>Signature-Agent included present on the request</name>
          <t>This example presents a minimal signature using the rsa-pss-sha512 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"signature-agent";key="agent2": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="zJwYV5pG8TA9NnaOu9RBShBXtiWuyoWthZXQBT2J77XTpW3ADk49DlbOvpqjJqy3SH3lyNVS/Zo0DmKQX8HYuQ=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig2</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: agent2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="zJwYV5pG8TA9NnaOu9RBShBXtiWuyoWthZXQBT2J77XTpW3ADk49DlbOvpqjJqy3SH3lyNVS/Zo0DmKQX8HYuQ=="\
 ;tag="web-bot-auth"
Signature: sig2=:ngb8Yuk2zY/O5nyApob/uwIRWNE1md5xrzYSpPfVCWMHMjdQhj8HTPY8lrE8jHDHRtpqUy7jvYM8LzaHb1NGyxPemVMEOoZpBWXxboqSbp1LTAb2o5qbETmSuDM7UZE4WuSDQoIG5GF5AZ8b8lFEWDP1pw0XV1zsZMn8EPU/DbTkFtGgVPdGehjywJRqnXCXEX0wRCGg4+nTJwWs736JqgbBCuafQPCdwITQucMyGA12QOmMc8eQUdjcS/uqzkDxj1+iI3PDCYnscUTHcGuNv6rWxIx0D+rqWhOoLeYwzDPUm3qs2utVCATIgK0ktLWSfGcPK6p3IwJIUj7cSkbVRg==:
]]></artwork>
        </section>
        <section anchor="legacy-signature-agent-sf-string-instead-of-sf-dictionary-included-present-on-the-request">
          <name>Legacy Signature-Agent (sf-string instead of sf-dictionary) included present on the request</name>
          <t>THIS IS A LEGACY EXAMPLE. IF YOU ARE AN IMPLEMENTER, PLEASE UPDATE TO THE ABOVE.</t>
          <t>This example presents a minimal signature using the rsa-pss-sha512 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"signature-agent": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=1735693200\
 ;nonce="XSHtZVCThSIAksXsH9WBs6AtxtXC0eQGiIcUGSoJstFs8lAWakjhrfwzLhyjtme5iXMZvmFWqDEs6cT3Jf+BbQ=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig2</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: "https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=1735693200\
 ;nonce="XSHtZVCThSIAksXsH9WBs6AtxtXC0eQGiIcUGSoJstFs8lAWakjhrfwzLhyjtme5iXMZvmFWqDEs6cT3Jf+BbQ=="\
 ;tag="web-bot-auth"
Signature: sig2=:I1QWNzGXdP1a4dSvOHLCVOOanEYHDk+ZsVxM9MLX/p4ko69ghKwR5EOtAD96g7g4GWP7lmpM/jFAf9q8EFRDTPLjUXySwMv4YPgabv2LQihTJG2y8a2m6IGltyruwQNiqSJVUuRaG9+b17CGmAMFZh30X6GXLdQJrCARpeTqPwp2DC+a8haDE/VE5EruqzjA5/2mKwvrkzkSqeW5tOVtFwWRRHIOidquf/8Je6kM9mhgkg4arudLA5SL4wyyYE1jURIgcOl8agrfdJ5Def23DIRtiOLRa8jT9cpTLFAuFHN+mrZA/LH9h0gSIg1cPb+0cMASee5uku1KjWcFer7jWA==:
]]></artwork>
        </section>
      </section>
      <section anchor="eddsa-using-curve-edwards25519">
        <name>EdDSA Using Curve edwards25519</name>
        <t>The test vectors in this section use the Ed25519 key defined in <xref section="B.1.4" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
This section include non-normative test vectors that may be used as test cases to validate implementation correctness.</t>
        <section anchor="signature-agent-absent-from-the-request-1">
          <name>Signature-Agent absent from the request</name>
          <t>This example presents a minimal signature using the ed25519 algorithm over test-request. The request does not contain
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"@signature-params": ("@authority")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="g0iqFa9e1ffijlyOScDkXpfSmTbYpRNSGPJrQ1It20ahwgzB3jOUcdgLgFxUg7RMtW4V8IILaKKtA+YuSyIgJQ=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig1</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Input: sig1=("@authority")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="g0iqFa9e1ffijlyOScDkXpfSmTbYpRNSGPJrQ1It20ahwgzB3jOUcdgLgFxUg7RMtW4V8IILaKKtA+YuSyIgJQ=="\
 ;tag="web-bot-auth"
Signature: sig1=:FFASViSdcgsyaqqYiCnkHreeZzbNKcTzDvZC5uVlP/dn9IbWj8j0o4wKFTH3rBnUiSUBduwm1Gp5VlIPCp01Ag==:
]]></artwork>
        </section>
        <section anchor="signature-agent-included-present-on-the-request">
          <name>Signature-Agent included present on the request</name>
          <t>This example presents a minimal signature using the ed25519 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"signature-agent";key="agent2": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="XeP72svPKNiGEg3aDE7WJuTpN69H08oMFqC8NLFy1MptpENAT3WZTYwK+MYdsFMlaqHCJGo9ZAhqer1NWY9Epg=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig2</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: agent2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="XeP72svPKNiGEg3aDE7WJuTpN69H08oMFqC8NLFy1MptpENAT3WZTYwK+MYdsFMlaqHCJGo9ZAhqer1NWY9Epg=="\
 ;tag="web-bot-auth"
Signature: sig2=:DGiW2ErlQh0hc8wY2FQdbnFd6CEmonyY8nlvECIJFaUSYYNvNvSsGyP99BUGtq51gA4ouXlkUwjnta084bpjCg==:
]]></artwork>
        </section>
        <section anchor="legacy-signature-agent-sf-string-instead-of-sf-dictionary-included-present-on-the-request-1">
          <name>Legacy Signature-Agent (sf-string instead of sf-dictionary) included present on the request</name>
          <t>THIS IS A LEGACY EXAMPLE. IF YOU ARE AN IMPLEMENTER, PLEASE UPDATE TO THE ABOVE.</t>
          <t>This example presents a minimal signature using the ed25519 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"signature-agent": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=1735693200\
 ;nonce="e8N7S2MFd/qrd6T2R3tdfAuuANngKI7LFtKYI/vowzk4lAZYadIX6wW25MwG7DCT9RUKAJ0qVkU0mEeLElW1qg=="\
 ;tag="web-bot-auth"
]]></artwork>
          <t>This results in the following Signature-Input and Signature header fields being added to the message under the label <tt>sig2</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Signature-Agent: "https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=1735693200\
 ;nonce="e8N7S2MFd/qrd6T2R3tdfAuuANngKI7LFtKYI/vowzk4lAZYadIX6wW25MwG7DCT9RUKAJ0qVkU0mEeLElW1qg=="\
 ;tag="web-bot-auth"
Signature: sig2=:jdq0SqOwHdyHr9+r5jw3iYZH6aNGKijYp/EstF4RQTQdi5N5YYKrD+mCT1HA1nZDsi6nJKuHxUi/5Syp3rLWBA==:
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="implementations">
      <name>Implementations</name>
      <t>This draft has a couple of public implementations. A demonstration server has been deployed to <eref target="https://http-message-signatures-example.research.cloudflare.com/">https://http-message-signatures-example.research.cloudflare.com/</eref>.</t>
      <t>It uses ed25519 example signing and verifying keys defined in <xref section="B.1.4" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
      <section anchor="clients">
        <name>Clients</name>
        <ul spacing="normal">
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Chrome MV3</eref> (TypeScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Cloudflare Workers</eref> (TypeScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/stytchauth/web-bot-auth-example">Puppeteer script</eref> (JavaScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/olipayne/guzzle-web-bot-auth-middleware">Guzzle middleware</eref> (PHP)</t>
          </li>
          <li>
            <t><eref target="https://zenn.dev/oymk/articles/944069e5eddc27">Python script</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cyberstormdotmu/bot-authentication">Bot-Authentication</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">HTPie plugin</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cyberstormdotmu/bot-authentication">Web scrapers (scrapy/crawl4ai)</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/HumanSecurity/human-verified-ai-agent">HUMAN Verified AI Agents</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/nomadium/linzer/blob/master/spec/integration/cloudflare_example_research_spec.rb">Linzer</eref> (Ruby)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Rust binaries</eref> (Rust)</t>
          </li>
        </ul>
      </section>
      <section anchor="servers">
        <name>Servers</name>
        <ul spacing="normal">
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Caddy plugin</eref> (Go)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Cloudflare Workers</eref> (TypeScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/garyillyes/web-bot-auth-apache">Apache module</eref> (C)</t>
          </li>
        </ul>
      </section>
      <section anchor="test-vectors-1">
        <name>Test vectors</name>
        <ul spacing="normal">
          <li>
            <t>In <eref target="https://github.com/cloudflare/web-bot-auth/blob/main/packages/web-bot-auth/test/test_data/web_bot_auth_architecture_v2.json">JSON format</eref></t>
          </li>
        </ul>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The editor would also like to thank the following individuals (listed in alphabetical order) for feedback, insight, and implementation of this document -
Marwan Fayed,
Maxime Guerreiro,
Scott Hendrickson,
Jonathan Hoyland,
Mark Nottingham,
Eugenio Panero,
Lucas Pardue,
Malte Ubl,
Loganaden Velvindron,
Tanya Verma.</t>
    </section>
    <section numbered="false" anchor="changelog">
      <name>Changelog</name>
      <t>v04</t>
      <ul spacing="normal">
        <li>
          <t>Change Signature-Agent to a sf-dictionary</t>
        </li>
        <li>
          <t>Add security consideration around intermediary re-keying Signature-Agent</t>
        </li>
        <li>
          <t>Add <tt>target-uri</tt> as a valid replacement for <tt>@authority</tt></t>
        </li>
        <li>
          <t>Add more contributors</t>
        </li>
        <li>
          <t>Add new implementations of architecture drafts</t>
        </li>
        <li>
          <t>Remove "purpose" field from web-bot-auth architecture example</t>
        </li>
      </ul>
      <t>v03</t>
      <ul spacing="normal">
        <li>
          <t>Update linzer example url</t>
        </li>
        <li>
          <t>Fix section and name of status code 429</t>
        </li>
        <li>
          <t>Fix typos</t>
        </li>
      </ul>
      <t>v02</t>
      <ul spacing="normal">
        <li>
          <t>Add response status code</t>
        </li>
        <li>
          <t>Add a few reference to improve readability</t>
        </li>
        <li>
          <t>Add consideration to sign additional headers</t>
        </li>
        <li>
          <t>Add use of TLS in security considerations</t>
        </li>
        <li>
          <t>Add RSASSA-PSS example</t>
        </li>
        <li>
          <t>Update acknowledgement section</t>
        </li>
        <li>
          <t>Reference new implementations: PHP, Python, Ruby, Rust</t>
        </li>
        <li>
          <t>Fix signature-agent in the arch diagram to use structured fields</t>
        </li>
        <li>
          <t>Fix test vectors to use signature-agent with structured fields</t>
        </li>
        <li>
          <t>Fix some typos</t>
        </li>
      </ul>
      <t>v01</t>
      <ul spacing="normal">
        <li>
          <t>Add mandatory signing of Signature-Agent by clients if present</t>
        </li>
        <li>
          <t>Add test vectors for request with and without Signature-Agent</t>
        </li>
        <li>
          <t>Update example diagram to be correct</t>
        </li>
        <li>
          <t>Add security consideration about reverse proxy</t>
        </li>
        <li>
          <t>Update why origin may request a new signature</t>
        </li>
        <li>
          <t>Update nonce validation wording and global uniqueness</t>
        </li>
        <li>
          <t>Acknowledgements</t>
        </li>
      </ul>
      <t>v00</t>
      <ul spacing="normal">
        <li>
          <t>Initial draft</t>
        </li>
        <li>
          <t>How to leverage HTTP Message Signature to sign request</t>
        </li>
        <li>
          <t>How to verify these Signature</t>
        </li>
        <li>
          <t>Define web-bot-auth tag to scope this signature</t>
        </li>
        <li>
          <t>Derive keyid using JWK Thumbprint</t>
        </li>
        <li>
          <t>High level Security and Privacy considerations</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
