<?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-03" category="info" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.30.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-03"/>
    <author fullname="Thibault Meunier">
      <organization>Cloudflare</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <date year="2025" month="August" day="29"/>
    <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 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 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 <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, 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 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="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 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>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 a 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="19" month="June" 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-01"/>
        </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 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=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_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>
        </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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
pm9PSBXXxAbL5j77+a8/M+rImwGIDqneH1bTPWqw3Z09OP581eU+yyXr4c5y
9SI8sFCl+e6vFvuPrB6iWtve3dve2MCruiohONw4mQV256A3DC/mtdvqIDwV
86Pj+4+tq4/34dNz7+Gqeu8UG+f1NXwNiPZ+bZGQdD0rloBJ9qqbahLCA+/X
5v11+aFbGXlnl30xuTkfTDqHR7NOzx4cVD48lGX7otM8+mA/zE5vaw9n5Zjz
nZOpe3kXTG9m7ofLYRSdn/Q2e4Pzo+urg+fO/YfGeLgzev+eZn5dFmGKDr5W
6bqUmyL9sxxPUZFvqctQFwpHTROwcvPxiscHwmOf4EQqn37ofFfVxlTe//sY
1zLKaJrsh+Hd2D5+uAl3nnlwctziOzfrY9l7Trqjo3jX3dg62zq6fdm77J7G
fm0n3nWSw6o951Ppj/dGkXN7e3l60uzutvoXB/xJbE3OJp2nyl61t74z7t1W
K62Xu97JVnnvdiid6OH6YDY/3RiOD653ggu/en18+DRzxlGt3x7dtDbLzbtd
yW9qx9Fl4rc39l7azfq6s3V1ez8/6x6dTkbrXDbkZq3qbbbuO+FNuHVRq51s
JN2znafxYIfb/mj3/MJtdvpXHw435frZmO/Vzkdgj86uepcbD6NueVzbG96V
nbunc+eoNe22/d3jkdy8uX45Kg/L7Xbz7mS3OkqGN/54q3fvlaOzdu/s9vBA
nq1fuudhMKjftJLWy/rJeePGa/vP3uPd47hxu3la7kyC3YdxvHdReyzPK/X3
7/ez0u1lBWyywOnnSAL/H6eItf6V/zQKeLkGfqm4KndLJWu+Q2WvKKz/55B+
kI34w02jP+616o/yTp7s3R7I7Xr8HN81NsTVsduyr497wamMj+SuV7/ljw/j
aDh7OR/PH+KJqLl37Q/TydHt02FTbtv96ulw/WBw9c+qxDf/qBJfVWT3mg9W
Kf3N9/9mhG+bgc33+63K1e3Fy/Gd06nwLac3vUQVd3nJ/eb9yeHj+gd589ze
a5/flcOtx2B7bzQ+m3Vrzcu4fri3PdoZbR3fdna8SdguPxzVh3tPu82j7mG/
c/5wfTfvzdrTrfvOiA+mm+dX7rh/erw53+Wbk+3WsRfPo2R2deE+9U5vrpMu
P95bH1R2GseTevvow7i6cbd9fHfuXJ1GjXo3FP2nzizcPGys890xP2yWb5q1
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

-->

</rfc>
