<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-meunier-web-bot-auth-architecture-02" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.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-02"/>
    <author fullname="Thibault Meunier">
      <organization>Cloudflare</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <date year="2025" month="June" day="19"/>
    <area>Web and Internet Transport</area>
    <workgroup>Web Bot Auth</workgroup>
    <keyword>not-yet</keyword>
    <abstract>
      <?line 44?>

<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 52?>

<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 architectures 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 <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 the following component:</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>
        </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 RECOMMEND 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, it <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")
]]></artwork>
        </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 follow</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="736" viewBox="0 0 736 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 568,112 L 568,256" fill="none" stroke="black"/>
                <path d="M 640,32 L 640,160" fill="none" stroke="black"/>
                <path d="M 728,32 L 728,160" fill="none" stroke="black"/>
                <path d="M 8,32 L 88,32" fill="none" stroke="black"/>
                <path d="M 640,32 L 728,32" fill="none" stroke="black"/>
                <path d="M 96,62 L 296,62" fill="none" stroke="black"/>
                <path d="M 96,66 L 296,66" fill="none" stroke="black"/>
                <path d="M 440,62 L 632,62" fill="none" stroke="black"/>
                <path d="M 440,66 L 632,66" fill="none" stroke="black"/>
                <path d="M 136,112 L 568,112" fill="none" stroke="black"/>
                <path d="M 88,128 L 128,128" fill="none" stroke="black"/>
                <path d="M 576,128 L 632,128" fill="none" stroke="black"/>
                <path d="M 8,160 L 88,160" fill="none" stroke="black"/>
                <path d="M 640,160 L 728,160" fill="none" stroke="black"/>
                <path d="M 136,256 L 568,256" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="640,128 628,122.4 628,133.6" fill="black" transform="rotate(0,632,128)"/>
                <polygon class="arrowhead" points="640,64 628,58.4 628,69.6" fill="black" transform="rotate(0,632,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="364" y="52">Exchange</text>
                  <text x="368" y="68">Cryptographic</text>
                  <text x="364" y="84">material</text>
                  <text x="48" y="100">Agent</text>
                  <text x="684" 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="344" y="164">sig=(@authority</text>
                  <text x="484" y="164">signature-agent);\</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="396" y="244">"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);\ |        +----------+
                |                  created=1700000000;\               |
                |                  expires=1700011111;\               |
                |                  keyid="ba3e64==";\                 |
                |                  tag="web-bot-auth"                 |
                | Signature-Agent: "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 Forbidden as defined in <xref section="15.5.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>We add one field to the directory defined in the other draft:
"purpose": Ideally matches some IANA registry for preferences</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
  },
  "signature_agent": "https://directory.test",
  "purpose": "rag"
}
]]></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 cryptographically secured protocol.
See <xref target="signature-agent"/> for more details.</t>
        </section>
      </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>MUST 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. This means that the proxy is seeing the signature before the origin.</t>
        <t>It implies that the proxy sees the Signature before the origin does, may strip it, or even attempt to replay it against other reverse proxies used by the origin.</t>
        <t>Origins may require a specific nonce policy to prevent such malicious behaviour and decide to validate the signature themselves.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <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>
            <date day="15" month="April" year="2025"/>
            <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-00"/>
        </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 415?>

<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 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">
          <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=1735693200\
 ;nonce="yT+sZR1glKOTemVLbmPDFwPScbB1Zj/sMNPEFZcjwJW5jK/taa7HviOXovVwiZOfrrLHS2SbLFUQBxPYZChf7g=="\
 ;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=1735693200\
 ;nonce="yT+sZR1glKOTemVLbmPDFwPScbB1Zj/sMNPEFZcjwJW5jK/taa7HviOXovVwiZOfrrLHS2SbLFUQBxPYZChf7g=="\
 ;tag="web-bot-auth"
Signature: sig1=:ppXhcGjVp7xaoHGIa7V+hsSxuRgFt8i04K4FWz9ORJtn57t8duD3cyavsnh9grdWWOJHER8ITNBaqe4mKmPq193S+7hSW31IzXSH4/9WfsdrjUBwyJ0fhBU7oNn3UGDqwdhr5TMgVI2/EX8saV5GrOunM09zMEA+d4QWYyKRFJmg+asCs253l2IYPpVp4N55H0uRK7qhb7acng8LNiEPTQZD2s+Kha95LgeciKQSO0jgR/h59fX/dXqLdFIvRMn8Ggs2VUzF/f/MMEXH83gufVnh4SYl/rKMSKWDBsK+OiLpobAVIuIz+HLCVlMnxlkXkhCW2J/Pmo8jht9N5k/y1A==:
]]></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 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=1735693200\
 ;nonce="mYotfW3CUjI68sbGw6oKd7kyXqPjZEtU8xFPGWFrqOAf5qC6MDe3pys3SWWCudB0MvwslHy32WXUpkR7u0lt/w=="\
 ;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=1735693200\
 ;nonce="mYotfW3CUjI68sbGw6oKd7kyXqPjZEtU8xFPGWFrqOAf5qC6MDe3pys3SWWCudB0MvwslHy32WXUpkR7u0lt/w=="\
 ;tag="web-bot-auth"
Signature: sig1=:+NA/cssf4Y2bQTMTkyvTGRCaVzp9quyUevdwwMtMOWhhOOZ2T1subBj0BtvdnrpDEuwSAbiTeElXDzHL3WWKCw==:
]]></artwork>
        </section>
        <section anchor="signature-agent-included-present-on-the-request-1">
          <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": "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 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/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></t>
          </li>
          <li>
            <t><eref target="https://github.com/nomadium/linzer/blob/master/spec/integration/cloudflare_example_research.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>
        </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_v1.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>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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
819/ZtSBNwMMHVKNP6yme9Rguzt7cPr5Wst9lkvSw53lmkV4YKE2891fLfZv
WR3EZm17d297YwOv6mqE4HDjZBbYnYPeMLyY1243B+GpmB8d339sXX28D5+e
ew9Xm/dOsXFeX8PXgGjv1xYJSdezIgmYZG+zqiYhOPB+bd5flx+6lZF3dtkX
k5vzwaRzeDTr9OzBQeXDQ1m2LzrNow/2w+z0tvZwVo453zmZupd3wfRm5n64
HEbR+Umv2hucH11fHTx37j80xsOd0fv3NPPrcghTbPC1+taltBSpn+Vwigp6
S118ulAuapp+lZePVzw+EB77BCdS+fRD57uqJqby/l/HuJZRRtNkPwzvxvbx
w02488yDk+MW37lZH8vec9IdHcW77sbW2dbR7cveZfc09ms78a6THG7acz6V
/nhvFDm3t5enJ83ubqt/ccCfxNbkbNJ5quxt9tZ3xr3bzUrr5a53slXeux1K
J3q4PpjNTzeG44PrneDC37w+PnyaOeOo1m+PblrVcvNuV/Kb2nF0mfjtjb2X
drO+7mxd3d7Pz7pHp5PROpcNWa1tetXWfSe8CbcuarWTjaR7tvM0Huxw2x/t
nl+4zU7/6sNhVa6fjfle7XwE5ujsqne58TDqlse1veFd2bl7OneOWtNu2989
HsnqzfXLUXlYbrebdye7m6NkeOOPt3r3Xjk6a/fObg8P5Nn6pXseBoP6TStp
vayfnDduvLb/7D3ePY4bt9XTcmcS7D6M472L2mN5Xqm/f7+fFWwvK2CTAE6/
PxL4/zhFrPWv/KdRwMuV70tFVblbKlPzHSp7RTn9P4f0g2zEH24a/XGvVX+U
d/Jk7/ZAbtfj5/iusSGujt2WfX3cC05lfCR3vfotf3wYR8PZy/l4/hBPRM29
a3+YTo5unw6bctvub54O1w8GV/+sSrz6R5X4quK613ywSulX3/+LEb5tBqrv
91uVq9uLl+M7p1PhW05veokq7vKS+837k8PH9Q/y5rm91z6/K4dbj8H23mh8
NuvWmpdx/XBve7Qz2jq+7ex4k7BdfjiqD/eedptH3cN+5/zh+m7em7WnW/ed
ER9Mq+dX7rh/elyd7/LqZLt17MXzKJldXbhPvdOb66TLj/fWB5WdxvGk3j76
MN7cuNs+vjt3rk6jRr0biv5TZxZWDxvrfHfMD5vlm2atGSVPLw/1Wrk6OZtN
o8eXx96TuK3Flzfx0ey22z1pXbrOUzIs756K7cf23mQ8ehxt8Shxzuu13vnW
bD6/b1YerrutkX3p7fJRNHROa4diWN08bHVj9/K8y3cf+nt22D8/qidHJxfr
k+hDvXx+sjfeGPVao4rdGaxv2O16T4ha8phUzh5u7SMR7Tzc5s0AazqHvbp2
QxpJBIhfOJjBlJRV/wGPROfhv+GRbP3/6pHobsJ/uSKovMLg6fH82J1Pxh9v
N5LOdufD0azoTMXL5tVpv9YLvKe7g8bt5m60cZ0pL03Bb2utyX0QD283G9cP
re1dOTiebQdnzs7j/O6p8/ChGV/vPh91jm+PoqfL+rD21NhuH4rNcC43e7e3
jcQ52GhPZ9I7mW9Wb++uw8fuTrLhxeXZP6v5+kf4IP+zzu+V87F+US/bUg63
7quDq367/zif9o+7DX7zEu49JfNrMXVms3bcvrwdjy8vP1T7FZkMDh42DuKp
40fhYTOZ9eoDty+a3t3hy8n55u3tWWP2fx98/7DO+Rfq/kfwu9i92OlV20dO
+SlytvvV7mbsDOtJUr/wR2etnfOj+Oy+VZ4Gs5fHLa/+4Z47rbvt2W211p4d
7xw2+nvd67P66cbTzeP1xqQpzpvebeXpnzZm8v8m3P6fxQGvcPaD87TRe7qc
nTjzk2hvPao9zDbd+w8n2/zi+Mx9uA/LTcD4W92r/pXj1i5q9/dn0eH6pNGv
nNQr/odD6W77p2fJyfO1W6715uFmdH57kMOZbCnhbKLoWD5KIXTsdE/o4yLD
5SwFlhNln8ZF6Ka/qoXvDbCkUX2EULHfXwx7vPU1d6NfUIVitrBkp9+SR51T
/o9f/t4R3qn8boIA1Khgo7nT2iVT6zRP89p/HDQjjtclRpb1K/sLfQxNsPbN
ZrYZ/SF/XF+23IV/PuAd+6U/D0XPjtwwfqcGSp9k+C8ZiEj+nQMeJy8vntDf
WAc3Q6wcL/DckM99UR7R44v/lED2LozfOemogTtzkG7gDJorG/RF+H7JEdNy
MJ88lnkUu7YnZHlva2tje0/UhOPY1R01wrnrv4ho5Xr8YMIdN5mUPXqmPPCC
QXnCsbS6jHmlMtYGjhRz5ojxUR/6x5RRogGsuZsM5mrKLn7jeeD69PnIH6Qs
vvtOVdKoT2qqAwM1PGehl4xc/wcHPA7+O878J53+mpr016+s5bO/nPYuL5jK
6/3I6Ibyrl8Ouf0IcikX76MNoP/7iAk9vPcR7n3Eex/zpQEfp5USVpq/ozRf
3Taf+aWqQevzvvo3RcAYrA25J8XaF4V6hEMlTjNVLImfnFYFygF94+RxyYhm
yWrJfsGSZSXc3AvHYA3VZ3ODCCzkO0r4DoVwMGWIHyeQmGDXX6pZdFvp0wr5
BGTRavNoxn12xEEFFuCvZ+x+OE4EIDQ3CgpWzw7imJ2APolc+1FiT/4pflUf
P8tyEsw9mAVfix7ZRUDF32M+KVjNBEyjG7AO9wWOcp6ASw1/RU4i8HEPXOrr
gQc3ghH3OTZ43QhvCpuOcIY+9+ccrsARq6+VUuu5F4xWU3e6UcW+pLrjmOLE
hZ4yfYsDkWa5hgmsVcCSNaqE4o7+xqp+eLHwB5tQ8HMGrz/coB9P0vLn/Of4
l0oY9bO5BK6WcbhBnwrAHHT6zeiJ+pCM+gck8DN4Zt1Yl7dk5fYZ6LICU3qs
wFBJ4P8D9C+yI7ADS5DFQDb61yP0pwjMZz3SD+Y6GqLpIRYDJ/rZpWF1E9bq
AaiXI56HgcQDq5gDU8WpWK5vrBvQcdnBwa9+mLqboXFg9AALCxvSF7RzX2jg
fva54qVRM6ob+5ojxUCYGI+eZvWZ4pceknixyisbdzae58vD3mjazJ73l2p/
6QO8xuCPlstfcWGL7EKU3UDKtlQjrMJI8PcJNokFVHMcIbZ+41Nphs+N45i+
mLU75svJsdVMfew6r0ep/5S+6B2EQof7Ft6IMBCnutGUu4mf6so+0YWzggbT
/xxH2nSANDAVXUty9X8AdIF2fJFqAAA=

-->

</rfc>
