<?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.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-webbotauth-httpsig-protocol-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="HTTP Message Signatures for Bots">HTTP Message Signatures for automated traffic</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-webbotauth-httpsig-protocol-01"/>
    <author fullname="Thibault Meunier">
      <organization>Cloudflare</organization>
      <address>
        <email>ot-ietf@thibault.uk</email>
      </address>
    </author>
    <author fullname="Sandor Major">
      <organization>Google</organization>
      <address>
        <email>ietf@sandormajor.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="29"/>
    <area>Web and Internet Transport</area>
    <workgroup>Web Bot Auth</workgroup>
    <keyword>not-yet</keyword>
    <abstract>
      <?line 66?>

<t>This document describes a protocol 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>
      <t>It defines the <tt>Signature-Agent</tt> header field for in-band key discovery, a
key directory format based on JWKS, and a well-known URI at which that
directory is served.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://webbotauth.github.io/draft-ietf-webbotauth-httpsig-protocol/draft-ietf-webbotauth-httpsig-protocol.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-webbotauth-httpsig-protocol/"/>.
      </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/webbotauth/draft-ietf-webbotauth-httpsig-protocol"/>.</t>
    </note>
  </front>
  <middle>
    <?line 78?>

<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</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 a
protocol enabling agents to cryptographically identify themselves using <xref target="HTTP-MESSAGE-SIGNATURES"/>.
It proposes that every request from bots be signed by a private key owned by its provider.
This way, every origin can validate the service identifier. <xref target="trust-model"/>
defines what that identifier is and what validation it establishes.</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 platforms 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="objectives">
        <name>Objectives and Constraints</name>
        <t>This protocol has two objectives:</t>
        <ol spacing="normal" type="1"><li>
            <t>Continuity of bot trust, so that an origin can tell it is dealing with the
same party it dealt with before.</t>
          </li>
          <li>
            <t>Optional binding to another anchor, such as a domain.</t>
          </li>
        </ol>
        <t>It works under two constraints:</t>
        <ol spacing="normal" type="1"><li>
            <t>Preserve the simplicity of usage for bots, and the simplicity of action for
websites.</t>
          </li>
          <li>
            <t>Require no pre-established relationship between the two.</t>
          </li>
        </ol>
        <t>The second constraint is what rules out shared secrets and per-site
onboarding. The first is a statement about operational cost on both ends: a
site today greps its logs for an IP address and a User-Agent, and with this
protocol it greps for a handle it can verify.</t>
      </section>
      <section anchor="http-layer-choice">
        <name>HTTP Layer Choice</name>
        <t>This protocol 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="trust-model">
      <name>Identifiers and Trust Model</name>
      <t>This section defines the identifiers produced by this protocol and what a
verifier can conclude from a valid signature.</t>
      <section anchor="url-is-identifier">
        <name>The Signature-Agent URL is the identifier</name>
        <t>An Agent identifies itself with the HTTPS URL it publishes its keys at, carried
in <tt>Signature-Agent</tt> (<xref target="signature-agent"/>). A verifier resolves that member
value directly as a JWK Set (<xref target="key-distribution-and-discovery"/>) and checks the
signature against the keys it returns. The identifier is the URL the verifier
fetched. What the verifier ends up with is a pair: that URL, and a key the URL
provides.
Origins can log, rate limit, allowlist, or block the URL the way they do IP
addresses and User-Agent today.</t>
        <t>The URL on its own carries nothing. A client picks the value it sends, so an
unresolved <tt>Signature-Agent</tt> is a claim rather than an identity. It becomes an
identifier once the verifier fetches it and finds that it provides a key that
verifies the request (<xref target="discovery-is-not-trust"/>). Until then, verifiers <bcp14>MUST
NOT</bcp14> attach policy to it.</t>
        <t>A valid signature over a resolved URL proves that a holder of a key that URL
publishes signed the covered message. The message can still be replayed.
Signature lifetimes and covered components bound the duration and scope of that
replay (<xref target="generating-http-message-signature"/>). It says nothing about who
operates the Agent, whether the Agent is benign, or whether the request is
authorized. Those are origin policy.</t>
        <t>Nothing stops an Agent from abandoning a URL and standing up another one, and
the protocol does not try to prevent this. It targets honest clients that want
to be recognised across requests.</t>
      </section>
      <section anchor="rotation">
        <name>Rotation</name>
        <t>Because the identifier is the URL and not the key, an Agent can rotate keys
without losing continuity. It publishes the new key alongside the old one, then
drops the old one (<xref target="key-rotation"/>). The URL does not change, so a verifier
that recognised it before still recognises it after. No name and no third party
are involved.</t>
        <t><tt>keyid</tt> selects which key verifies a given request. Verifiers cannot use it to
carry continuity across a rotation, as that value is derived from the key
material.</t>
      </section>
      <section anchor="no-url">
        <name>When No URL Is Available</name>
        <t>A signed request <bcp14>MUST</bcp14> carry <tt>Signature-Agent</tt> (<xref target="signature-agent"/>). A verifier
can still be left with no URL to attribute to: discovery failed with nothing
cached (<xref target="discovery-failure"/>), redistributed material carried no proof
(<xref target="redistributed-key-material"/>), or the header is absent. The identifier is
then the <tt>keyid</tt> thumbprint defined in
<xref target="generating-http-message-signature"/>. A verifier that already holds that key
verifies the request, and attributes it no further than the holder of that key.</t>
        <t>This mode has no rotation. A new key is a new identifier, and the verifier has
no way to connect the two.</t>
      </section>
      <section anchor="discovery-is-not-trust">
        <name>What the URL Endorses</name>
        <t>Resolving a <tt>Signature-Agent</tt> URL over TLS establishes that the host named in
the URL served this key set at fetch time.
Whoever controls that URL says this key signs for it. That
is what makes the URL usable as an identifier, and all it gives you. It does
not say that the operator of that URL is honest, or that it is the same party
everyone knows about.</t>
        <t>What matters is the association between a URL and the keys published there. A
verifier that already holds the keys does not need to fetch it. A verifier <bcp14>MUST
NOT</bcp14> attribute a request to a <tt>Signature-Agent</tt> URL unless it made this
association. This can be either by resolving the URL itself, at request time or
ahead of it, or from <xref target="redistributed-key-material"/>. Verifiers may refetch a URL
to handle key additions and removals, bounded by <xref target="cache-behaviour"/>.</t>
        <t>Where a verifier obtains the same pair from more than one source, the newer
pair wins, including when it omits a key that older resolution included.
Pairs are ordered by when they were produced, not when the verifier obtained
them: the <tt>created</tt> parameter for a directory response signature
(<xref target="origin-binding-appendix"/>), and the time of the fetch for a directory the
verifier resolved itself.</t>
      </section>
      <section anchor="origin-binding">
        <name>Binding a Key to a Web Origin</name>
        <t>A well-known URL is a special case of the above. When a
<tt>Signature-Agent</tt> value is the well-known URI registered in <xref target="wkuri-reg"/>, the
identifier is still the URL, but that URL now names a domain rather than an
arbitrary path on one. <xref target="WELLKNOWN-URI"/> reserves the path, so the domain
operator stands behind the key set.</t>
        <t>In practice, this is meant to allow additional information to be carried against
a name. That mechanism lives in <xref target="origin-binding-appendix"/>. A verifier that
wants to use this case may also recognise the shape of the URL and apply those
checks itself.</t>
      </section>
      <section anchor="out-of-scope">
        <name>Out of Scope</name>
        <t>This protocol does not authenticate human users, does not provide anonymous
authentication, and does not define authorization or delegation. It does not
define how trust is accrued, held, or exchanged, and it defines no
mechanism for one origin to convey an opinion about an Agent to another. See
<xref target="privacy-considerations"/>.</t>
        <t>A client has a choice whether to sign its requests, and an origin has a choice
how it treats signed and unsigned requests. Multiple factors could influence
either decision, but the decisions themselves are outside the scope of this
document.</t>
      </section>
    </section>
    <section anchor="protocol-overview">
      <name>Protocol Overview</name>
      <figure>
        <name>Web Bot Auth architecture</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="496" viewBox="0 0 496 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,112" fill="none" stroke="black"/>
              <path d="M 56,64 L 56,96" fill="none" stroke="black"/>
              <path d="M 88,96 L 88,160" fill="none" stroke="black"/>
              <path d="M 120,64 L 120,96" fill="none" stroke="black"/>
              <path d="M 144,32 L 144,112" fill="none" stroke="black"/>
              <path d="M 224,144 L 224,176" fill="none" stroke="black"/>
              <path d="M 320,144 L 320,176" fill="none" stroke="black"/>
              <path d="M 416,64 L 416,96" fill="none" stroke="black"/>
              <path d="M 448,96 L 448,160" fill="none" stroke="black"/>
              <path d="M 488,64 L 488,96" fill="none" stroke="black"/>
              <path d="M 8,32 L 144,32" fill="none" stroke="black"/>
              <path d="M 56,64 L 120,64" fill="none" stroke="black"/>
              <path d="M 416,64 L 488,64" fill="none" stroke="black"/>
              <path d="M 120,80 L 184,80" fill="none" stroke="black"/>
              <path d="M 368,80 L 408,80" fill="none" stroke="black"/>
              <path d="M 56,96 L 120,96" fill="none" stroke="black"/>
              <path d="M 416,96 L 488,96" fill="none" stroke="black"/>
              <path d="M 8,112 L 144,112" fill="none" stroke="black"/>
              <path d="M 224,144 L 320,144" fill="none" stroke="black"/>
              <path d="M 88,160 L 104,160" fill="none" stroke="black"/>
              <path d="M 200,160 L 216,160" fill="none" stroke="black"/>
              <path d="M 328,160 L 344,160" fill="none" stroke="black"/>
              <path d="M 432,160 L 448,160" fill="none" stroke="black"/>
              <path d="M 224,176 L 320,176" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="416,80 404,74.4 404,85.6" fill="black" transform="rotate(0,408,80)"/>
              <polygon class="arrowhead" points="336,160 324,154.4 324,165.6" fill="black" transform="rotate(180,328,160)"/>
              <polygon class="arrowhead" points="224,160 212,154.4 212,165.6" fill="black" transform="rotate(0,216,160)"/>
              <g class="text">
                <text x="36" y="52">User</text>
                <text x="88" y="84">Agent</text>
                <text x="220" y="84">signed</text>
                <text x="280" y="84">request</text>
                <text x="320" y="84">+</text>
                <text x="344" y="84">URL</text>
                <text x="452" y="84">Origin</text>
                <text x="152" y="164">publishes</text>
                <text x="272" y="164">Directory</text>
                <text x="388" y="164">resolves</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+----------------+
| User           |
|     +-------+  |                                 +--------+
|     | Agent +--+----- signed request + URL ----->| Origin |
|     +---+---+  |                                 +---+----+
+---------+------+                                     |
          |                                            |
          |                +-----------+               |
          +-- publishes -->| Directory |<-- resolves --+
                           +-----------+
]]></artwork>
        </artset>
      </figure>
      <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 of 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.
How a User directs an Agent is outside the scope of this document.</t>
      <section anchor="deployment-models">
        <name>Deployment Models</name>
        <t>Signature verification can be performed either directly by origins or delegated
to a fronting proxy. Direct verification by origins provides simplicity and
control. Proxy verification offloads processing and enables shared caching across
multiple origins. The choice depends on traffic volume and operational
requirements.</t>
      </section>
      <section anchor="generating-http-message-signature">
        <name>Generating HTTP Message Signature</name>
        <t><xref target="HTTP-MESSAGE-SIGNATURES"/> defines components to be signed.</t>
        <t>Agents <bcp14>MUST</bcp14> include at least one of the following components:</t>
        <dl>
          <dt><tt>@authority</tt></dt>
          <dd>
            <t>as defined in <xref section="2.2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>@target-uri</tt></dt>
          <dd>
            <t>as defined in <xref section="2.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
        </dl>
        <t>Agents <bcp14>MUST</bcp14> include the following <tt>@signature-params</tt> as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
        <dl>
          <dt><tt>created</tt></dt>
          <dd>
            <t>as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>expires</tt></dt>
          <dd>
            <t>as defined in <xref section="2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>. It is <bcp14>RECOMMENDED</bcp14> that <tt>expires</tt> be no more than 24 hours after <tt>created</tt>.</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>The components above bind the signature to an authority, not to a request. A
signature covering <tt>@authority</tt> alone verifies against any method, path, or body
sent to that authority until it expires, so anyone who observes one request can
reuse it against the same origin until then.
<tt>expires</tt> bounds how long that lasts; the covered components bound what it
reaches. <xref target="field-compression"/> covers what that costs on the wire.</t>
        <t>Agents that want to narrow the scope of their signature <bcp14>SHOULD</bcp14> also cover the
following components. A signer that omits them remains conformant.</t>
        <dl>
          <dt><tt>@method</tt></dt>
          <dd>
            <t>narrows the signature to one method. Defined in <xref section="2.2.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/></t>
          </dd>
          <dt><tt>@path</tt></dt>
          <dd>
            <t>narrows the signature to one resource. <xref target="example-multiple-signatures"/> shows
it in use. Defined in <xref section="2.2.6" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          </dd>
          <dt><tt>@target-uri</tt></dt>
          <dd>
            <t>narrows the signature to one resource, including the query string. The
signature is invalidated by intermediary reordering, which might happen for
caching purposes for instance. Defined in <xref section="2.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          </dd>
          <dt><tt>@query-param</tt></dt>
          <dd>
            <t>narrows the signature to individual query parameters. This is a more robust
alternative to cover query parameters. Defined in <xref section="2.2.8" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
          </dd>
        </dl>
        <t>No component covers the body. An Agent that needs one <bcp14>MUST</bcp14> send and cover
<tt>Content-Digest</tt> <xref target="DIGEST-FIELDS"/>. This document does not require it. Most
automated traffic is <tt>GET</tt>, and a mandatory digest would force every Agent to
buffer request bodies it would otherwise stream.</t>
        <section anchor="signature-agent">
          <name>Signature-Agent</name>
          <t><tt>Signature-Agent</tt> is a Dictionary Structured Header as defined in
<xref section="3.2" sectionFormat="of" target="STRUCTURED-HEADERS"/>. Its member values <bcp14>MUST</bcp14> be String Items
that contain an absolute <xref target="URI"/>, whose scheme <bcp14>MUST</bcp14> be <tt>https</tt>. Dictionary
members <bcp14>MUST NOT</bcp14> carry parameters. A verifier <bcp14>MUST</bcp14> ignore a member that carries
parameters. If dictionary values are not valid URIs, the entire header field
<bcp14>MAY</bcp14> be ignored.</t>
          <t>Earlier versions of this protocol defined <tt>Signature-Agent</tt> as a bare String,
and deployments still send it (<xref target="example-legacy"/>). A verifier <bcp14>MAY</bcp14> accept that
form and treat it as a dictionary with a single member whose key is the label
of the signature covering it. Signers <bcp14>MUST</bcp14> send the dictionary form. The two
are distinguishable on the wire: a String Item begins with a double quote <tt>"</tt>
while a Dictionary member key does not.</t>
          <t>A signed request <bcp14>MUST</bcp14> carry the <tt>Signature-Agent</tt> header, as described in <xref target="sending-request"/>.
Its member keyed to the signature label <bcp14>MUST</bcp14> be signed as a component as defined in <xref section="2.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
The <tt>Signature-Agent</tt> member identifies where candidate key material can be found.
The key used to verify the signature is selected by the <tt>keyid</tt> parameter of the
corresponding <tt>Signature-Input</tt> member.</t>
          <t>This results in the following components to be signed</t>
          <artwork><![CDATA[
("@authority" "signature-agent";key="sig1")
]]></artwork>
        </section>
        <section anchor="multiple-signatures">
          <name>Multiple Signatures</name>
          <t>A request <bcp14>MAY</bcp14> contain more than one Web Bot Auth signature. Each signature is
identified by its HTTP Message Signatures label. Each signer <bcp14>MUST</bcp14> provide a
<tt>Signature-Agent</tt> member for its label. A verifier <bcp14>MUST NOT</bcp14> attribute a
signature to a member that signature does not cover.</t>
          <t>A signer <bcp14>MAY</bcp14> cover members from another signature label, which preserves
evidence that another signer contributed to the request. A signer that covers
<tt>"signature";key=X</tt> <bcp14>MUST</bcp14> also cover <tt>"signature-input";key=X</tt>, and <bcp14>MUST</bcp14> cover
every component identifier listed in <tt>"signature-input";key=X</tt>.</t>
          <t>A signature value on its own does not identify the message it was computed
over, which is why <xref section="7.3.7" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> recommends
against signing one. Covering <tt>signature-input</tt> is not sufficient:
it lists component identifiers, whose values resolve against whatever
message the verifier holds. An outer signature that named those identifiers
without covering them would still verify after the whole header set was lifted
onto a different message, the ambiguity
<xref section="7.3.7" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> describes. Covering the union
addresses this: the outer signer commits to a message on which the inner signature
is checkable, under which key, and over which validity window.</t>
          <t>A signer that cannot cover one of those components, because it changed the
value the inner signature was computed over, <bcp14>MUST NOT</bcp14> cover the inner
<tt>signature</tt> member. It signs the request on its own terms, and the inner
signature is left untouched.</t>
          <t>Verifiers <bcp14>MUST</bcp14> validate each signature independently against its own covered
components and its own key. An outer signature that covers an inner one is
evidence that those bytes, over that set of components, were present. It does
not make the inner signature valid, and it does not express authorization,
delegation, or consent. Those meanings are deployment policy, or are carried in
separately signed fields.</t>
        </section>
        <section anchor="replay-protection">
          <name>Replay Protection</name>
          <t>Replay protection, including use of the <tt>nonce</tt> signature parameter, is
described in <xref section="7.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>. This document defines
no additional nonce requirements.</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.</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

GET /path/to/resource HTTP/1.1
Host: origin.example.com
Signature: sig=abc==
Signature-Input: sig=("@authority" "signature-agent";key="sig");\
                 created=1700000000;\
                 expires=1700011111;\
                 keyid="ba3e64==";\
                 tag="web-bot-auth"
Signature-Agent: sig="https://signer.example.com"
]]></artwork>
          <t>A signed request carries three 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>
            <li>
              <t><tt>Signature-Agent</tt> defined in <xref target="signature-agent"/></t>
            </li>
          </ol>
          <t>The Origin learns the URL from the request, so it resolves keys after the
first request rather than before it. Later requests verify from cache
(<xref target="cache-behaviour"/>).</t>
          <figure>
            <name>Key resolution follows the first request</name>
            <artset>
              <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="272" width="456" viewBox="0 0 456 272" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                  <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
                  <path d="M 40,64 L 40,256" fill="none" stroke="black"/>
                  <path d="M 72,32 L 72,64" fill="none" stroke="black"/>
                  <path d="M 232,32 L 232,64" fill="none" stroke="black"/>
                  <path d="M 232,128 L 232,208" fill="none" stroke="black"/>
                  <path d="M 264,64 L 264,112" fill="none" stroke="black"/>
                  <path d="M 264,144 L 264,200" fill="none" stroke="black"/>
                  <path d="M 264,216 L 264,256" fill="none" stroke="black"/>
                  <path d="M 304,32 L 304,64" fill="none" stroke="black"/>
                  <path d="M 352,32 L 352,64" fill="none" stroke="black"/>
                  <path d="M 400,64 L 400,112" fill="none" stroke="black"/>
                  <path d="M 400,144 L 400,200" fill="none" stroke="black"/>
                  <path d="M 400,216 L 400,256" fill="none" stroke="black"/>
                  <path d="M 448,32 L 448,64" fill="none" stroke="black"/>
                  <path d="M 448,128 L 448,208" fill="none" stroke="black"/>
                  <path d="M 8,32 L 72,32" fill="none" stroke="black"/>
                  <path d="M 232,32 L 304,32" fill="none" stroke="black"/>
                  <path d="M 352,32 L 448,32" fill="none" stroke="black"/>
                  <path d="M 8,64 L 72,64" fill="none" stroke="black"/>
                  <path d="M 232,64 L 304,64" fill="none" stroke="black"/>
                  <path d="M 352,64 L 448,64" fill="none" stroke="black"/>
                  <path d="M 40,94 L 56,94" fill="none" stroke="black"/>
                  <path d="M 40,98 L 56,98" fill="none" stroke="black"/>
                  <path d="M 240,94 L 256,94" fill="none" stroke="black"/>
                  <path d="M 240,98 L 256,98" fill="none" stroke="black"/>
                  <path d="M 232,128 L 248,128" fill="none" stroke="black"/>
                  <path d="M 432,128 L 448,128" fill="none" stroke="black"/>
                  <path d="M 264,160 L 288,160" fill="none" stroke="black"/>
                  <path d="M 368,160 L 392,160" fill="none" stroke="black"/>
                  <path d="M 272,176 L 304,176" fill="none" stroke="black"/>
                  <path d="M 360,176 L 400,176" fill="none" stroke="black"/>
                  <path d="M 232,208 L 448,208" fill="none" stroke="black"/>
                  <path d="M 48,238 L 112,238" fill="none" stroke="black"/>
                  <path d="M 48,242 L 112,242" fill="none" stroke="black"/>
                  <path d="M 200,238 L 264,238" fill="none" stroke="black"/>
                  <path d="M 200,242 L 264,242" fill="none" stroke="black"/>
                  <polygon class="arrowhead" points="400,160 388,154.4 388,165.6" fill="black" transform="rotate(0,392,160)"/>
                  <polygon class="arrowhead" points="280,176 268,170.4 268,181.6" fill="black" transform="rotate(180,272,176)"/>
                  <polygon class="arrowhead" points="264,96 252,90.4 252,101.6" fill="black" transform="rotate(0,256,96)"/>
                  <polygon class="arrowhead" points="56,240 44,234.4 44,245.6" fill="black" transform="rotate(180,48,240)"/>
                  <g class="text">
                    <text x="40" y="52">Agent</text>
                    <text x="268" y="52">Origin</text>
                    <text x="400" y="52">Directory</text>
                    <text x="92" y="100">Signed</text>
                    <text x="152" y="100">request</text>
                    <text x="192" y="100">+</text>
                    <text x="216" y="100">URL</text>
                    <text x="268" y="132">if</text>
                    <text x="300" y="132">keys</text>
                    <text x="336" y="132">not</text>
                    <text x="388" y="132">resolved</text>
                    <text x="328" y="164">Resolve</text>
                    <text x="332" y="180">Keys</text>
                    <text x="156" y="244">Response</text>
                  </g>
                </svg>
              </artwork>
              <artwork type="ascii-art"><![CDATA[
+-------+                   +--------+     +-----------+
| Agent |                   | Origin |     | Directory |
+---+---+                   +---+----+     +-----+-----+
    |                           |                |
    +== Signed request + URL ==>|                |
    |                           |                |
    |                       .-- if keys not resolved --.
    |                       |   |                |     |
    |                       |   +--- Resolve --->|     |
    |                       |   |<---- Keys -----+     |
    |                       |   |                |     |
    |                       '--------------------------'
    |                           |                |
    |<======== Response ========+                |
    |                           |                |
]]></artwork>
            </artset>
          </figure>
        </section>
      </section>
      <section anchor="requesting-message-signature">
        <name>Requesting a Message Signature</name>
        <t>An Origin that expects a signature <bcp14>SHOULD</bcp14> request one from clients that did not
provide it, using the <tt>Accept-Signature</tt> field defined in
<xref section="5" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
If an Agent signs in response, the signature <bcp14>MUST</bcp14> satisfy the requirements in
<xref target="generating-http-message-signature"/>. The Origin <bcp14>MAY</bcp14>
request additional parameters defined by <xref target="HTTP-MESSAGE-SIGNATURES"/>, including
<tt>nonce</tt>.</t>
        <t>Signature requests <bcp14>MUST</bcp14> be consistent with the requirements in
<xref target="generating-http-message-signature"/>. Agents <bcp14>MAY</bcp14> ignore
signature requests that do not fit their signing policy, as described in
<xref section="5.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        <t>An Origin can refuse requests without valid signatures using an appropriate HTTP
status code, usually 403 (Forbidden) (<xref section="15.5.4" sectionFormat="of" target="HTTP"/>). The Origin
<bcp14>SHOULD</bcp14> include <tt>Accept-Signature</tt> in that response to indicate its signature
requirements. A valid signature does not guarantee that the request will be
accepted; acceptance remains subject to the Origin's policy.</t>
        <t>An Origin can also accept a request without a valid signature and send
<tt>Accept-Signature</tt> in the successful response to indicate that a signed request
would receive different treatment.</t>
        <t>Origins that do not send <tt>Accept-Signature</tt> in either case <bcp14>SHOULD NOT</bcp14> rely on
clients sending signatures unless the parties have a private arrangement. Such
arrangements need to specify when and how signatures are sent.</t>
        <t>An Origin that detects a signature or nonce has been used more often than its
policy permits <bcp14>MAY</bcp14> request a new signature and respond with 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 it does not know the <tt>keyid</tt> for the <tt>Signature-Agent</tt> URL the signature covers.</t>
          </li>
          <li>
            <t>During step 5, if the <tt>keyid</tt> is not known for that URL, the Origin <bcp14>MAY</bcp14> fetch key material as indicated by the <tt>Signature-Agent</tt> header defined in <xref target="signature-agent"/>. Fetching key material affects only whether verification is possible, not what a valid signature means (<xref target="discovery-is-not-trust"/>).</t>
          </li>
        </ul>
        <t>Key lookup <bcp14>MUST</bcp14> be keyed on the (URL, key) pair, not on the key alone. A
verifier that indexes by <tt>keyid</tt> alone will verify a request as coming from one URL
that provides a key it learned from another, and attribute that request to the URL the client
asserted. The party whose URL is asserted cannot detect or stop this: its own
directory is never fetched, so no rotation or removal has any effect.</t>
      </section>
      <section anchor="key-distribution-and-discovery">
        <name>Key Distribution and Discovery</name>
        <t>This section describes how a verifier resolves a <tt>Signature-Agent</tt> URL to key
material. <xref target="discovery-is-not-trust"/> covers what the fetch does and does not
establish.</t>
        <t>The reference for discovery is an HTTPS URL, carried in a <tt>Signature-Agent</tt>
member as defined in <xref target="signature-agent"/>. A verifier fetches that URL directly
and interprets the response as a JWK Set.</t>
        <t>The resource fetched under this section <bcp14>MUST</bcp14> be served with a <tt>200 (OK)</tt> HTTP
status code. A verifier <bcp14>MUST</bcp14> treat all other HTTP status codes as discovery
failures and <bcp14>MUST NOT</bcp14> automatically follow HTTP redirects.</t>
        <t>The URL the verifier resolved is the identifier, with any query discarded. The
verifier fetches the member value as sent, so the query is dropped from the
identifier and not from the request. Otherwise one key set would yield an
identifier per spelling, and an Agent could mint them at will.</t>
        <t>Identifiers are compared after normalization as described in
<xref section="6.2.2" sectionFormat="of" target="URI"/> and <xref section="6.2.3" sectionFormat="of" target="URI"/>. Two identifiers are the
same when their normalized forms are equal octet for octet.</t>
        <t>TLS authenticates the host but not the path. An arbitrary path does not name
the host's operator. The well-known URI is reserved, so that URL additionally
names a domain (<xref target="origin-binding"/>).</t>
        <t>The key is selected using the <tt>keyid</tt> parameter in <tt>Signature-Input</tt>.</t>
        <t>Note: when a JWK set is served at the well-known URI registered in
<xref target="wkuri-reg"/>, JWK <bcp14>MAY</bcp14> carry a <tt>kid</tt>. In this case, it <bcp14>MUST</bcp14> be set to the
thumbprint defined in <xref target="generating-http-message-signature"/>, so a verifier
selects a key by matching <tt>keyid</tt> against <tt>kid</tt>. Deriving <tt>kid</tt> from the key
material keeps it globally unique and lets a verifier check the directory's own
labelling rather than trusting it.</t>
        <t>A JWK Set at another URL may serve other consumers, where <tt>kid</tt> is an
operator-chosen label. A verifier that cannot match <tt>keyid</tt> against <tt>kid</tt> there
computes thumbprints instead.</t>
        <artwork><![CDATA[
Signature-Agent: sig1="https://signature-agent.test/jwks.json"
]]></artwork>
        <section anchor="configuration">
          <name>Directory Format</name>
          <t>The resource <bcp14>MUST</bcp14> be a JSON Web Key Set (JWKS) as defined in <xref section="5" sectionFormat="of" target="JWK"/>. A JWK <tt>alg</tt> member, when present, follows <xref section="4.4" sectionFormat="of" target="JWK"/>. The
<tt>alg</tt> signature parameter, when present, follows the HTTP Signature Algorithms
section of <xref target="HTTP-MESSAGE-SIGNATURES-IANA"/>.</t>
          <t>The directory <bcp14>MUST</bcp14> be served over HTTPS. A directory served at the well-known
URI registered in <xref target="wkuri-reg"/> <bcp14>MUST</bcp14> be served with media type
<tt>application/http-message-signatures-directory+json</tt>.</t>
          <t>A verifier <bcp14>SHOULD</bcp14> validate the directory format and reject malformed entries.</t>
          <artwork><![CDATA[
GET /.well-known/http-message-signatures-directory HTTP/1.1
Host: example.com
Accept: application/http-message-signatures-directory+json

HTTP/1.1 200 OK
Content-Type: application/http-message-signatures-directory+json
Cache-Control: max-age=86400
{
  "keys": [{
    "kty": "OKP",
    "crv": "Ed25519",
    "kid": "NFcWBst6DXG-N35nHdzMrioWntdzNZghQSkjHNMMSjw",
    "x": "JrQLj5P_89iXES9-vFgrIy29clF9CC_oPPsw3c5D0bs",
    "use": "sig",
    "nbf": 1712793600,
    "exp": 1715385600
  }]
}
]]></artwork>
        </section>
        <section anchor="key-rotation">
          <name>Key Rotation</name>
          <t>Directory operators <bcp14>SHOULD</bcp14> rotate keys by publishing the old and the new key
together, then removing the old one:</t>
          <ol spacing="normal" type="1"><li>
              <t>Add the new key to the directory before its intended use date</t>
            </li>
            <li>
              <t>Continue to include the old key until its expiration date</t>
            </li>
            <li>
              <t>Remove expired keys from the directory</t>
            </li>
          </ol>
          <t>Removing a key from the directory deactivates it. Verifiers stop accepting it
once their cached copy expires, so the directory's cache lifetime bounds how
long a removed key keeps verifying. Verifiers <bcp14>SHOULD</bcp14> cache the directory
contents and refresh upon expiration, as described in <xref target="cache-behaviour"/>.</t>
          <t>It is not a revocation mechanism, and this document does not define any.</t>
        </section>
        <section anchor="redistributed-key-material">
          <name>Redistributed Key Material</name>
          <t>IP addresses and user-agent have been aggregated and distributed via lists.
This section says what a verifier may conclude from key material it did not
fetch itself.
Defining a format for redistribution is out of scope.</t>
          <t>A verifier <bcp14>MUST NOT</bcp14> attribute a request to a <tt>Signature-Agent</tt> URL on the basis
of redistributed key material unless it carries, for the key in question, a
valid directory response signature as described in <xref target="origin-binding-appendix"/>
whose <tt>expires</tt> has not passed. Without that proof the material stays usable
for verifying signatures, but it carries no URL, so the identifier falls back
to the key thumbprint (<xref target="no-url"/>).</t>
          <t>The main requirement is to terminate the TLS connection.
A verifier polling a directory on its own schedule is resolving it. So is a
control plane polling on behalf of the verifiers it serves. None of these options
constitute redistribution. Nor is a list that names directory URLs rather than embedding
keys. For instance, <xref target="REGISTRY"/> works that way, and the verifier still resolves them.</t>
        </section>
      </section>
      <section anchor="sessions">
        <name>Session Considerations</name>
        <t>Per-request signing and verification costs CPU; uncached key discovery adds
latency. For high request rates, an origin can verify a request-specific
signature once and issue a session credential for later requests. This can
amortize asymmetric verification and reduce bytes, but adds the risks of token
theft and replay.</t>
        <t>A reused signature already has token semantics until <tt>expires</tt>. A session
established from one extends that window past <tt>expires</tt> unless the credential is
bounded to it: no longer-lived, and no wider in scope than the components the
signature covered. Session establishment and binding are out of scope.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="use-of-tls">
        <name>Use of TLS</name>
        <t>We reassess <xref section="7.1.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.
Clients <bcp14>SHOULD</bcp14> use TLS <xref target="RFC8446"/>
(https) or equivalent transport security when making requests with
Message signatures. Failing to do so exposes the Message signature to numerous
attacks that could give attackers unintended access.</t>
        <t>This include reverse proxy and their consideration presented in <xref target="reverse-proxy"/>.</t>
        <t>An origin <bcp14>SHOULD</bcp14> refuse Signature headers when communicated over an unsecured channel.</t>
      </section>
      <section anchor="performance-impact">
        <name>Performance Impact</name>
        <t>Origins should account for the overhead of signature verification in their operations. A local cache of public keys reduces network requests and verification latency. The choice of signing algorithm impacts CPU requirements. Origins should monitor verification latency and set appropriate timeouts to maintain service levels under load.
See <xref target="sessions"/>: a session amortizes that cost by replacing verification with a
bearer credential. <xref target="field-compression"/> covers the byte cost.</t>
      </section>
      <section anchor="key-compromise-response">
        <name>Key Compromise Response</name>
        <t>This document defines no revocation. Removing a compromised key from the
directory is the only remedy, and it takes effect at each verifier on its next
refresh, so the key can keep verifying for as long as <xref target="key-rotation"/> allows.
The protocol carries no channel back to verifiers, so an
Agent cannot reach them sooner. Signature lifetimes
(<xref target="generating-http-message-signature"/>) are the only lever that acts faster.</t>
        <t>Agents <bcp14>SHOULD</bcp14> remove a compromised key and publish a replacement immediately.
Origins 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 rotation if
needed.</t>
      </section>
      <section anchor="key-reuse-considered-harmful">
        <name>Key Reuse Considered Harmful</name>
        <t>Implementations <bcp14>SHOULD NOT</bcp14> reuse a signing key for different purposes. For
example, if an operator wants origins to distinguish between a crawler and user-directed
agent platform, these <bcp14>SHOULD</bcp14> use distinct <tt>Signature-Agent</tt> URLs, signing keys, and
signing key directories.</t>
      </section>
      <section anchor="reverse-proxy">
        <name>Reverse Proxy Consideration</name>
        <t>An origin may be placed behind a reverse proxy, which means the proxy will see
the <tt>Signature</tt> and <tt>Signature-Agent</tt> headers before the origin does.
A proxy <bcp14>SHOULD NOT</bcp14> strip the <tt>Signature</tt> or <tt>Signature-Agent</tt> headers from
requests.</t>
        <t>A proxy <bcp14>SHOULD NOT</bcp14> replay signatures against other reverse proxies used by the
origin, as this allows impersonation of the principal signature agent.</t>
        <section anchor="signature-agent-labeling">
          <name>Signature-Agent Labeling</name>
          <t><xref section="7.2.5" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> allows an intermediary to relabel
a signature, because the label of a <tt>Signature</tt> dictionary member is not part
of the signature base. The key of a <tt>Signature-Agent</tt> member is different: when
a signature covers <tt>"signature-agent";key="agent2"</tt>, that key appears in the
signature base, so changing it invalidates the signature. Only the holder of
the signing key can produce a signature over the new member key.</t>
          <t>An intermediary <bcp14>MUST NOT</bcp14> alter the key of a <tt>Signature-Agent</tt> member that is
covered by a signature it is not able to recompute. Relabeling the <tt>Signature</tt>
dictionary member remains permitted.</t>
          <t>A signer acting as an intermediary on its own signature is not restricted by
this, since it can sign the result.</t>
        </section>
      </section>
      <section anchor="ssrf">
        <name>Server-Side Request Forgery (SSRF)</name>
        <t>As described in <xref target="key-distribution-and-discovery"/>, verifiers may fetch key directories based on
the value conveyed in <tt>Signature-Agent</tt> when included in a request. Since
clients control the <tt>Signature-Agent</tt> header value, this introduces a risk of
server-side request forgery (SSRF) attacks by malicious clients.</t>
        <t>Verifiers <bcp14>SHOULD</bcp14> take appropriate precautions as follows:</t>
        <dl>
          <dt><tt>Response size</tt></dt>
          <dd>
            <t>a directory can be arbitrarily large. Verifiers <bcp14>SHOULD</bcp14> reject responses
exceeding a defined byte limit after content decoding.</t>
          </dd>
          <dt><tt>Key count</tt></dt>
          <dd>
            <t>a JWKS with many keys forces O(n) key search. Verifiers <bcp14>SHOULD</bcp14> enforce
a maximum key count.</t>
          </dd>
          <dt><tt>Fetch latency</tt></dt>
          <dd>
            <t>no timeout allows slowloris-style exhaustion. Verifiers <bcp14>SHOULD</bcp14> apply
a wall-clock timeout to directory fetches.</t>
          </dd>
          <dt><tt>Redirect chains</tt></dt>
          <dd>
            <t>unbounded HTTP redirects can be used to amplify requests. Verifiers
<bcp14>SHOULD</bcp14> limit redirect depth.</t>
          </dd>
          <dt><tt>Network address ranges</tt></dt>
          <dd>
            <t>no address filtering can target internal services. Verifiers <bcp14>SHOULD</bcp14>
prevent directory fetches to private, loopback, and link-local
address ranges.</t>
          </dd>
        </dl>
        <t>Further recommendations can be found in the Open Worldwide Application
Security Project (OWASP) SSRF Prevention Cheat Sheet <xref target="OWASP-SSRF"/>.</t>
      </section>
      <section anchor="test-and-demonstration-keys">
        <name>Test and Demonstration Keys</name>
        <t>Test keys, including the example keys in <xref target="HTTP-MESSAGE-SIGNATURES"/>, <bcp14>MUST NOT</bcp14>
be used in production. Verifiers <bcp14>SHOULD</bcp14> reject known test keys when they are
detected in key directories or out-of-band configuration.</t>
      </section>
      <section anchor="static-signatures">
        <name>Static Signatures</name>
        <t>Deployments <bcp14>MUST NOT</bcp14> treat a precomputed Web Bot Auth signature as a long-lived
access credential. A reusable static signature has bearer-token semantics and can
be replayed until the covered signature parameters, key, or verifier policy make
it unusable.</t>
        <t>Agents <bcp14>SHOULD</bcp14> generate signatures for the request being sent, with bounded
<tt>created</tt> and <tt>expires</tt> values. Long expiration windows increase replay risk.</t>
      </section>
      <section anchor="discovery-failure">
        <name>Discovery Failure</name>
        <t>Resolving a <tt>Signature-Agent</tt> URL can fail in several ways: the name does not
resolve, the connection or TLS handshake fails, the response is not a directory
or contains no key matching <tt>keyid</tt>, or the fetch is refused by the verifier's
own limits (<xref target="ssrf"/>). All have the same outcome for the request in hand. The
verifier holds no association between that URL and the signing key, so under
<xref target="discovery-is-not-trust"/> it <bcp14>MUST NOT</bcp14> attribute the request to that URL. It may
still verify the signature if it holds the key by other means, in which case the
identifier is the thumbprint (<xref target="no-url"/>); otherwise the request is unverified.</t>
        <t>They differ in what they say about cached state, and verifiers <bcp14>MUST</bcp14> keep them
apart. A directory that resolves and does not contain the key is evidence: it is
newer than whatever the verifier holds, and under <xref target="discovery-is-not-trust"/>
replaces it. That is how a removed key stops verifying. A directory that fails
to resolve is not evidence and <bcp14>MUST NOT</bcp14> evict a cached entry, or an
operator's outage revokes its keys at every verifier at once.</t>
        <t>A failed fetch says nothing about the signer. It does not prove the signer is
malicious, and it does not make the request trusted. What an origin does with
an unverified request is local policy, and treating it as a distinct outcome
rather than as success or failure is discussed in <xref target="verifier-outcomes"/>.
Verifiers should also expect failures to be correlated: a single operator's
directory going down takes out every request naming it at once, across every
verifier whose cache expires in the same window.</t>
      </section>
      <section anchor="unsigned-requests">
        <name>Unsigned Requests</name>
        <t>An unsigned request does not establish whether the sender is human or automated,
or whether it is evading identification. Origins decide how to handle unsigned
requests and can request a signature as described in
<xref target="requesting-message-signature"/>.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <section anchor="identification-and-correlation">
        <name>Identification and Correlation</name>
        <t>This protocol enables receivers to recognise requests that carry the same
identifier and to correlate them, including across origins. Key rotation does
not prevent this correlation when the identifier remains unchanged
(<xref target="rotation"/>). This protocol is unsuitable for agents that need to avoid such
identification.</t>
        <t>Agents whose identifier would be associated with an individual human, rather
than a service or role, expose that person to the same correlation. This
protocol is not suited to such deployments.</t>
      </section>
      <section anchor="directory-content-and-access-patterns">
        <name>Directory Content and Access Patterns</name>
        <t>A key directory should only contain keys actively used for signing. Additional
keys or metadata expose more about the signing service than verification
requires. Verifiers fetching a directory also reveal something about their
verification patterns, so directory servers should avoid logging personally
identifiable information from directory requests.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This section contains considerations for IANA.</t>
      <section anchor="wkuri-reg">
        <name>Well-Known 'http-message-signatures-directory' URI</name>
        <t>This document updates the "Well-Known URIs" Registry <xref target="WellKnownURIs"/> with the
following values.</t>
        <table anchor="wellknownuri-values">
          <name>'http-message-signatures-directory' Well-Known URI</name>
          <thead>
            <tr>
              <th align="left">URI Suffix</th>
              <th align="left">Change Controller</th>
              <th align="left">Reference</th>
              <th align="left">Status</th>
              <th align="left">Related information</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">http-message-signatures-directory</td>
              <td align="left">IETF</td>
              <td align="left">this document</td>
              <td align="left">permanent</td>
              <td align="left">None</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="media-types">
        <name>Media Types</name>
        <t>The following entries should be added to the IANA "media types"
registry:</t>
        <ul spacing="normal">
          <li>
            <t>"application/http-message-signatures-directory+json"</t>
          </li>
        </ul>
        <t>The templates for these entries are listed below and the
reference should be this RFC.</t>
        <section anchor="applicationhttp-message-signatures-directoryjson-media-type">
          <name>"application/http-message-signatures-directory+json" Media Type</name>
          <dl spacing="compact">
            <dt>Type name:</dt>
            <dd>
              <t>application</t>
            </dd>
            <dt>Subtype name:</dt>
            <dd>
              <t>http-message-signatures-directory</t>
            </dd>
            <dt>Required parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Optional parameters:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Encoding considerations:</dt>
            <dd>
              <t>"binary"</t>
            </dd>
            <dt>Security considerations:</dt>
            <dd>
              <t>see <xref target="security-considerations"/></t>
            </dd>
            <dt>Interoperability considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Published specification:</dt>
            <dd>
              <t>this specification</t>
            </dd>
            <dt>Applications that use this media type:</dt>
            <dd>
              <t>Services that implement the signer role for HTTP Message
Signatures and verifiers that interact with the signer for
the purpose of validating signatures.</t>
            </dd>
            <dt>Fragment identifier considerations:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Additional information:</dt>
            <dd>
              <dl spacing="compact">
                <dt>Magic number(s):</dt>
                <dd>N/A</dd>
                <dt>Deprecated alias names for this type:</dt>
                <dd>N/A</dd>
                <dt>File extension(s):</dt>
                <dd>N/A</dd>
                <dt>Macintosh file type code(s):</dt>
                <dd>N/A</dd>
              </dl>
            </dd>
            <dt>Person and email address to contact for further information:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Intended usage:</dt>
            <dd>
              <t>COMMON</t>
            </dd>
            <dt>Restrictions on usage:</dt>
            <dd>
              <t>N/A</t>
            </dd>
            <dt>Author:</dt>
            <dd>
              <t>see Authors' Addresses section</t>
            </dd>
            <dt>Change controller:</dt>
            <dd>
              <t>IETF</t>
            </dd>
          </dl>
        </section>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="DIGEST-FIELDS">
          <front>
            <title>Digest Fields</title>
            <author fullname="R. Polli" initials="R." surname="Polli"/>
            <author fullname="L. Pardue" initials="L." surname="Pardue"/>
            <date month="February" year="2024"/>
            <abstract>
              <t>This document defines HTTP fields that support integrity digests. The Content-Digest field can be used for the integrity of HTTP message content. The Repr-Digest field can be used for the integrity of HTTP representations. Want-Content-Digest and Want-Repr-Digest can be used to indicate a sender's interest and preferences for receiving the respective Integrity fields.</t>
              <t>This document obsoletes RFC 3230 and the Digest and Want-Digest HTTP fields.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9530"/>
          <seriesInfo name="DOI" value="10.17487/RFC9530"/>
        </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-MESSAGE-SIGNATURES-IANA" target="https://www.iana.org/assignments/http-message-signature/http-message-signature.xhtml">
          <front>
            <title>HTTP Message Signatures</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </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">
          <front>
            <title>JSON Web Key (JWK)</title>
            <author fullname="M. Jones" initials="M." surname="Jones"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>A JSON Web Key (JWK) is a JavaScript Object Notation (JSON) data structure that represents a cryptographic key. This specification also defines a JWK Set JSON data structure that represents a set of JWKs. Cryptographic algorithms and identifiers for use with this specification are described in the separate JSON Web Algorithms (JWA) specification and IANA registries established by that specification.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7517"/>
          <seriesInfo name="DOI" value="10.17487/RFC7517"/>
        </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="STRUCTURED-HEADERS">
          <front>
            <title>Structured Field Values for HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <author fullname="P-H. Kamp" surname="P-H. Kamp"/>
            <date month="September" year="2024"/>
            <abstract>
              <t>This document describes a set of data types and associated algorithms that are intended to make it easier and safer to define and handle HTTP header and trailer fields, known as "Structured Fields", "Structured Headers", or "Structured Trailers". It is intended for use by specifications of new HTTP fields.</t>
              <t>This document obsoletes RFC 8941.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9651"/>
          <seriesInfo name="DOI" value="10.17487/RFC9651"/>
        </reference>
        <reference anchor="URI">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="WellKnownURIs" target="https://www.iana.org/assignments/well-known-uris/well-known-uris.xhtml">
          <front>
            <title>Well-Known URIs</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </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="HPACK">
          <front>
            <title>HPACK: Header Compression for HTTP/2</title>
            <author fullname="R. Peon" initials="R." surname="Peon"/>
            <author fullname="H. Ruellan" initials="H." surname="Ruellan"/>
            <date month="May" year="2015"/>
            <abstract>
              <t>This specification defines HPACK, a compression format for efficiently representing HTTP header fields, to be used in HTTP/2.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7541"/>
          <seriesInfo name="DOI" value="10.17487/RFC7541"/>
        </reference>
        <reference anchor="HTTP-BEST-PRACTICES">
          <front>
            <title>Building Protocols with HTTP</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>Applications often use HTTP as a substrate to create HTTP-based APIs. This document specifies best practices for writing specifications that use HTTP to define new application protocols. It is written primarily to guide IETF efforts to define application protocols using HTTP for deployment on the Internet but might be applicable in other situations.</t>
              <t>This document obsoletes RFC 3205.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="56"/>
          <seriesInfo name="RFC" value="9205"/>
          <seriesInfo name="DOI" value="10.17487/RFC9205"/>
        </reference>
        <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="QPACK">
          <front>
            <title>QPACK: Field Compression for HTTP/3</title>
            <author fullname="C. Krasic" initials="C." surname="Krasic"/>
            <author fullname="M. Bishop" initials="M." surname="Bishop"/>
            <author fullname="A. Frindell" initials="A." role="editor" surname="Frindell"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>This specification defines QPACK: a compression format for efficiently representing HTTP fields that is to be used in HTTP/3. This is a variation of HPACK compression that seeks to reduce head-of-line blocking.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9204"/>
          <seriesInfo name="DOI" value="10.17487/RFC9204"/>
        </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>
        <reference anchor="REGISTRY">
          <front>
            <title>Registry and Signature Agent card for Web bot auth</title>
            <author fullname="Maxime Guerreiro" initials="M." surname="Guerreiro">
              <organization>Cloudflare</organization>
            </author>
            <author fullname="Ulas Kirazci" initials="U." surname="Kirazci">
              <organization>Amazon</organization>
            </author>
            <author fullname="Thibault Meunier" initials="T." surname="Meunier">
              <organization>Cloudflare</organization>
            </author>
            <date day="27" month="October" year="2026"/>
            <abstract>
              <t>   This document defines the "Signature Agent Card", a JSON metadata
   document that a signature agent using HTTP Message Signatures for
   bots publishes to describe itself: its identity, purpose, rate
   expectations, and cryptographic keys.  Its parameters are drawn from
   the OAuth Dynamic Client Registration Metadata registry, the same
   namespace used by OAuth Client ID Metadata Documents, extended with a
   single web_bot_auth object.  This document registers that object with
   IANA and establishes a registry for its members.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-meunier-webbotauth-registry-04"/>
        </reference>
        <reference anchor="OWASP-SSRF" target="https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_Sheet.html">
          <front>
            <title>OWASP Server-Side Request Forgery Prevention Cheat Sheet</title>
            <author>
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="USE-CASES">
          <front>
            <title>Use Cases for Authentication of Web Bots</title>
            <author fullname="Mark Nottingham" initials="M." surname="Nottingham">
         </author>
            <date day="1" month="April" year="2026"/>
            <abstract>
              <t>   This draft outlines use cases for authentication for bot clients on
   the Web, to help inform discussions regarding the scope and intent of
   the WebBotAuth Working Group.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-nottingham-webbotauth-use-cases-02"/>
        </reference>
        <reference anchor="WELLKNOWN-URI">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
            <abstract>
              <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
              <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
      </references>
    </references>
    <?line 975?>

<section anchor="use-cases">
      <name>Use Cases and What They Need</name>
      <t><xref target="USE-CASES"/> collects the use cases this group has discussed. Most are served
by the URL alone. The table below records which ones need the domain binding in
<xref target="origin-binding-appendix"/>, and why.</t>
      <table>
        <name>Use cases and the identifier they need</name>
        <thead>
          <tr>
            <th align="left">Use case</th>
            <th align="left">What the origin does</th>
            <th align="left">Needs</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Mitigating volumetric abuse</td>
            <td align="left">Rate limit per URL</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">Controlling access by bots</td>
            <td align="left">Set policy per URL</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">Providing different content to bots</td>
            <td align="left">Recognise a given URL</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">Auditing bot behaviour</td>
            <td align="left">Group logs by URL</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">Classifying traffic</td>
            <td align="left">Correlate observed behaviour with a URL</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">IP address mobility and sharing</td>
            <td align="left">Nothing: the signature does not depend on the IP</td>
            <td align="left">URL</td>
          </tr>
          <tr>
            <td align="left">Robots.txt alignment</td>
            <td align="left">Match the crawler against a name in the file</td>
            <td align="left">Domain</td>
          </tr>
          <tr>
            <td align="left">Conveying contextual information</td>
            <td align="left">Read signed headers alongside the identifier</td>
            <td align="left">Domain</td>
          </tr>
        </tbody>
      </table>
      <t>The last two are the pattern from <xref target="origin-binding"/>. Both consume something
held against a name rather than against the key: a robots.txt file names
crawlers, and contextual assertions are only worth as much as the party making
them. End-user authentication and anonymous authentication are out of scope.</t>
    </section>
    <section anchor="origin-binding-appendix">
      <name>Validating the Domain Binding</name>
      <t>This appendix describes what a verifier checks when it wants the domain a key
is published under, rather than the URL on its own. It applies when the
<tt>Signature-Agent</tt> value is the well-known URI registered in <xref target="wkuri-reg"/>.
Verification, rotation, and continuity do not depend on any of it, and a
verifier that only needs the URL as an identifier can skip the whole appendix.</t>
      <t>Authority over the domain comes from the TLS connection to the directory.
Nothing below adds to that.</t>
      <section anchor="possession-proof-on-the-directory-response">
        <name>Possession Proof on the Directory Response</name>
        <t>It is <bcp14>RECOMMENDED</bcp14> that a directory server construct and include one HTTP
Message Signature per key with the response, as defined in
<xref target="HTTP-MESSAGE-SIGNATURES"/>. Each key <bcp14>SHOULD</bcp14> be used to provide one signature.
These signatures prove possession of the advertised keys and, by covering
<tt>@authority</tt>, prevent the key set from being re-served under a different
authority. This matters for a domain-bound identifier, where the verifier is
about to consume information it holds against the name: it distinguishes a key set
the key holders assembled from one that was copied.</t>
        <t>Directory server <bcp14>MUST</bcp14> include the following covered components:</t>
        <dl>
          <dt><tt>@authority</tt></dt>
          <dd>
            <t>as defined in <xref section="2.2.3" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>. <tt>req</tt> flag defined in <xref section="2.4" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> <bcp14>MUST</bcp14> be set.</t>
          </dd>
          <dt><tt>content-digest</tt></dt>
          <dd>
            <t>as defined in <xref target="DIGEST-FIELDS"/>.</t>
          </dd>
        </dl>
        <t>Directory server <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>
        </dl>
        <t>Without them the signature is a permanent assertion that these keys were bound
to this authority at some unstated time, of no use to a verifier
consuming it through <xref target="redistributed-key-material"/>.</t>
        <dl>
          <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>http-message-signatures-directory</tt></t>
          </dd>
        </dl>
        <t>A verifier using a corresponding directory response signature as proof <bcp14>MUST</bcp14>
validate it using the key provided by the directory and <bcp14>MUST</bcp14> validate the
<tt>Content-Digest</tt> field against the response body. If either validation fails,
the proof is invalid. A verifier <bcp14>MAY</bcp14> use a key obtained by resolving the
directory itself whether or not it has valid proof. Attribution from
redistributed key material is governed by <xref target="redistributed-key-material"/>. A
verifier <bcp14>MUST</bcp14> reject a directory response signature whose <tt>created</tt> is in the
future, as it would a certificate that is not yet valid.
<xref target="discovery-is-not-trust"/> orders competing evidence by <tt>created</tt>, so a
future-dated signature would outrank every later fetch.</t>
      </section>
      <section anchor="what-the-binding-attaches-to">
        <name>What the Binding Attaches To</name>
        <t>The binding is not exclusive. Several domains may publish the same key, and the
binding attaches to the pair the verifier validated, not to the key on its own.
A verifier that recognises a key under one domain has learned nothing about the
same key served under another.</t>
      </section>
    </section>
    <section anchor="deployment-guidance">
      <name>Deployment Guidance</name>
      <t>This appendix is operational guidance. It does not define new protocol
requirements.</t>
      <section anchor="verifier-outcomes">
        <name>Verifier Outcomes</name>
        <t>Verifiers should keep three outcomes distinct:</t>
        <dl>
          <dt><tt>verified</tt></dt>
          <dd>
            <t>the signature and key material validate.</t>
          </dd>
          <dt><tt>invalid</tt></dt>
          <dd>
            <t>the signature, covered components, key, or freshness checks fail.</t>
          </dd>
          <dt><tt>unverified</tt></dt>
          <dd>
            <t>the verifier cannot obtain enough information to decide, for example because
directory discovery failed or the resolved directory does not provide the key.</t>
          </dd>
        </dl>
        <t>Whether the verifier has seen the Signature-Agent URL before does not change the
outcome. A request that passes verification with a key that a resolved URL provides
is verified, even when the verifier has no prior record of that URL. Whether the
URL appears on a list the origin maintains is a separate input to origin policy.</t>
        <t>Origins can apply local policy to each outcome. During deployment, treating
<tt>unverified</tt> as one bot-management signal is safer than treating it as either
<tt>verified</tt> or <tt>invalid</tt>.</t>
      </section>
      <section anchor="directory-availability">
        <name>Directory Availability</name>
        <t>Directory resources are bootstrap material. Operators serving a directory should
make it reachable without requiring Web Bot Auth on the directory request. They
should also avoid bot protection rules that block ordinary verifier fetches of
the well-known resource.</t>
        <t>The directory endpoint should support <tt>GET</tt>. Supporting <tt>HEAD</tt>, <tt>ETag</tt>,
<tt>Last-Modified</tt>, <tt>Cache-Control</tt>, and conditional requests can reduce fetch
load. Cache is specifically discussed in <xref target="cache-behaviour"/>.</t>
      </section>
      <section anchor="bounded-directory-fetches">
        <name>Bounded Directory Fetches</name>
        <t>Verifiers fetch directories named by untrusted requests, and should bound those
fetches as described in <xref target="ssrf"/>.</t>
        <t>Verifiers should also coalesce concurrent fetches for the same directory and
apply per-directory or per-origin concurrency limits. This avoids a fetch storm
when many requests reference the same uncached directory.</t>
      </section>
      <section anchor="cache-behaviour">
        <name>Cache Behaviour</name>
        <t>Verifiers should use normal HTTP caching semantics <xref target="HTTP-CACHE"/> for key
directories. In particular, verifiers should respect <tt>Cache-Control</tt>, <tt>Expires</tt>,
<tt>Date</tt>, <tt>ETag</tt>, and <tt>Last-Modified</tt> when present.</t>
        <t>A verifier should not fetch the directory for every request. It should refresh
cached directories when they become stale, and can use background refresh with
jitter to avoid synchronized refetches.</t>
      </section>
      <section anchor="negative-caching-and-retry">
        <name>Negative Caching and Retry</name>
        <t>Verifiers can cache unsuccessful discovery outcomes for a short period to reduce
repeated fetches. Negative cache entries should expire after no more than five
minutes. They are operational throttling state, not proof that a signature is
invalid.</t>
        <t>Network failures, TLS failures, and <tt>5xx</tt> responses should be treated as
transient unless local policy says otherwise. Verifiers should retry with bounded
exponential backoff and jitter. When a directory response includes
<tt>Retry-After</tt>, verifiers should respect it as described by <xref target="HTTP"/> and
<xref target="HTTP-BEST-PRACTICES"/>.</t>
      </section>
      <section anchor="freshness-and-replay">
        <name>Freshness and Replay</name>
        <t>Shorter signature lifetimes reduce replay risk but increase sensitivity to clock
skew and signing failures. Whether a verifier requires and enforces nonces is
deployment policy. Rejecting duplicate nonces requires an atomic check-and-record
across the enforcement scope. Verifiers need to bound retention and admission of
nonce state. If that state is unavailable, the verifier should not treat
signature validation as evidence that replay was detected or prevented. Replay
protection is described in
<xref section="7.2.2" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        <t>Verifiers should avoid accepting signatures with freshness windows longer than
their risk model permits.</t>
      </section>
      <section anchor="field-compression">
        <name>Field Compression</name>
        <t>Covering per-request components costs bytes when a connection is reused. HPACK
<xref target="HPACK"/> and QPACK <xref target="QPACK"/> can index a repeated <tt>Signature</tt>,
<tt>Signature-Input</tt>, or <tt>Signature-Agent</tt> value, so a signature reused across
requests on one connection is sent once and referenced afterwards. A per-request
value cannot be referenced; it is sent as a literal every time. Huffman coding
and an indexed field name reduce that literal, they do not replace the
reference.</t>
        <t>This is not a reason to widen the covered components. The bytes saved are the
bytes of a credential anyone who observes it can replay until <tt>expires</tt>
(<xref target="generating-http-message-signature"/>), and one static signature for many
requests is an anti-pattern (<xref target="deployment-anti-patterns"/>). An encoder that
treats a signature as a credential may also decline to index it
(<xref section="7.1.3" sectionFormat="of" target="HPACK"/>).</t>
      </section>
      <section anchor="directory-response-signature-lifetimes">
        <name>Directory Response Signature Lifetimes</name>
        <t>Where the key set is redistributed, revocation latency is already floored by
how often the redistributor republishes, so a short <tt>expires</tt> on a directory
response signature (<xref target="origin-binding-appendix"/>) buys nothing and costs
availability: at expiry every consumer drops that operator's keys to unverified
at once, with no serving stale. Operators should set <tt>expires</tt> well beyond the
republication interval of any list they expect to appear in. The lever for
faster revocation is publishing more often, not signing shorter.</t>
      </section>
      <section anchor="signing-conditionally">
        <name>Signing Conditionally</name>
        <t>Agents can sign every request or sign only when an origin requests a signature
(<xref target="requesting-message-signature"/>). Conditional signing adds a round trip when
the origin requires a signature. Non-idempotent requests cannot be automatically
retried without additional protocol mechanisms; see <xref section="9.2.2" sectionFormat="of" target="HTTP"/>.</t>
      </section>
      <section anchor="rollout-and-fallback">
        <name>Rollout and Fallback</name>
        <t>Web Bot Auth deployments will coexist with existing bot identification signals
during rollout. Verifiers can continue to use existing methods such as IP-based
checks, forward-confirmed reverse DNS, local allowlists, and reputation systems.</t>
        <t>Fallback should not turn an unsupported or unverifiable Web Bot Auth signature
into a trusted identity. It should leave the request in the origin's existing
bot-management path.</t>
      </section>
      <section anchor="proxies-and-intermediaries">
        <name>Proxies and Intermediaries</name>
        <t>Proxies and intermediaries need to preserve the fields covered by a signature if
the origin will verify that signature. If a proxy rewrites the authority, path,
or signed header fields, the origin may no longer see the message that was
signed.</t>
        <t>A deployment can instead verify at the proxy and pass the result to the origin
through a deployment-local trusted channel. That assertion is local policy; it is
not a replacement for the original HTTP Message Signature.</t>
      </section>
      <section anchor="cors">
        <name>CORS</name>
        <t>Key directories contain public key material. If browser-based verifiers need to
fetch them cross-origin, a directory server can use a permissive CORS policy such
as <tt>Access-Control-Allow-Origin: *</tt> without credentials. CORS is not key
authentication and does not replace signature validation.</t>
      </section>
      <section anchor="deployment-anti-patterns">
        <name>Deployment Anti-Patterns</name>
        <t>Deployments should avoid:</t>
        <ul spacing="normal">
          <li>
            <t>using test or demonstration keys in production</t>
          </li>
          <li>
            <t>issuing one static signature for many requests</t>
          </li>
          <li>
            <t>asking users to copy long-lived signatures into third-party tools</t>
          </li>
          <li>
            <t>sharing one signing key across unrelated agents or purposes</t>
          </li>
          <li>
            <t>relying on manual key rotation as the only revocation mechanism</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <section anchor="delegation-and-chaining">
        <name>Delegation and Chaining</name>
        <t>Delegation and chaining are out of scope for this document and are expected
to be specified separately. Input is welcome on the associated
<eref target="https://github.com/webbotauth/draft-ietf-webbotauth-httpsig-protocol/issues/27">GitHub issue</eref>.</t>
      </section>
      <section anchor="example-multiple-signatures">
        <name>Multiple Signatures with a Remote Browser</name>
        <t>This example shows Alice's agent using a remote browser to fetch a resource. The
agent signs selected request fields. The remote browser signs the request it
sends to the origin and also covers the agent's signature fields. The signature
values are illustrative; this is not a test vector.</t>
        <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

GET /resource HTTP/1.1
Host: origin.example
Signature-Agent: agent="https://agent.alice.example",\
 browser="https://browser.example"
Signature-Input: agent=("@method" "@authority" "@path"\
 "signature-agent";key="agent");created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;tag="web-bot-auth",\
 browser=("@method" "@authority" "@path"\
 "signature-agent";key="browser"\
 "signature-agent";key="agent"\
 "signature-input";key="agent"\
 "signature";key="agent");created=1735689601\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;tag="web-bot-auth"
Signature: agent=:YWdlbnQtc2lnbmF0dXJl:,\
 browser=:YnJvd3Nlci1zaWduYXR1cmU=:
]]></artwork>
        <t>The origin verifies each signature on its own. The <tt>agent</tt> signature covers the
fields selected by Alice's agent. The <tt>browser</tt> signature covers the request
sent by the remote browser, its own <tt>Signature-Agent</tt> member, and all three of
the <tt>agent</tt> label's fields, as <xref target="multiple-signatures"/> requires. This records
that the remote browser forwarded a request carrying the agent's signature. It
does not say that Alice's agent authorized the remote browser to act for it.</t>
      </section>
    </section>
    <section anchor="test-vectors">
      <name>Test Vectors</name>
      <t>Except where noted, these vectors exercise the minimum this document requires:
<tt>@authority</tt> and a <tt>Signature-Agent</tt> member and nothing else, with an <tt>expires</tt>
far enough out that they do not age. That combination is a parsing and
verification exercise, not a
configuration to copy: as <xref target="generating-http-message-signature"/> explains, a
signature covering <tt>@authority</tt> alone is reusable against that authority for
any method, path, and body until it expires. Deployments should cover more and
expire sooner.</t>
      <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="example-signature-agent-included">
          <name>Signature-Agent Included Present on the Request</name>
          <t>This example presents a minimal signature using the rsa-pss-sha512 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority": example.com
"signature-agent";key="sig2": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="sig2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="wcfPQPh7SzkvrIVvhD00vNk9PkxJNY2NVbYl2PVBB4zmUoluSwE7W6bPtF60QA3k8g06FU7PPCD+J58YofY1zg=="\
 ;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: sig2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="sig2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="wcfPQPh7SzkvrIVvhD00vNk9PkxJNY2NVbYl2PVBB4zmUoluSwE7W6bPtF60QA3k8g06FU7PPCD+J58YofY1zg=="\
 ;tag="web-bot-auth"
Signature: sig2=:iOCCPgZeV5D5KlfZLXIFQOZR2njqFiCMZIrb5HRRLrFZR5Wtpsn7HwbKfWYHqW3dYU7HV/RohjNg7fuyQ1Mdy2J4mya9JnQCZtCcIcOK/LM9Yc6g6ZTw0onurllrzEzuNQIFFkBTgPJZlA3rHioFrmDmn+nnN7HaC+it/PA2iGfENHYq9D3Ud7ZeDICmF1s5bsMgc+y+MxTPFQHxOEyhbCDjZbT5yeSkGP1Czczg7Cpf0Fz/wuF3mJJ7TL1mzQk3PPizXFr/EnjdUWri1/W8M/f93d389BFF+qbkISzAvOHEk5TqOoyrzzotTn3xmYN6SCGTHG42fK4rA4Ei0qCnnA==:
]]></artwork>
        </section>
        <section anchor="example-legacy">
          <name>Legacy Signature-Agent, sf-string</name>
          <t>Retained for implementers migrating to the dictionary form (<xref target="signature-agent"/>). Do not copy it into new deployments.</t>
          <t>This example presents a minimal signature using the rsa-pss-sha512 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

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

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

"@authority": example.com
"signature-agent";key="sig2": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="sig2")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="n9p433xm+NJ3ph3upfBIGmsuwHw387YV7Q/F+6BSpGCVjYCqQw6rznNA8PVVLySrAWsv0hQtFioQb6E1YsauiA=="\
 ;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: sig2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="sig2")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="n9p433xm+NJ3ph3upfBIGmsuwHw387YV7Q/F+6BSpGCVjYCqQw6rznNA8PVVLySrAWsv0hQtFioQb6E1YsauiA=="\
 ;tag="web-bot-auth"
Signature: sig2=:CGokAoY/FrPpyuzTe1Fb2kLTAH9Idw6qSFd1+D77r1firsMRCxeuLu5e6O+ek3zQgDMAzjiXtLVfqE00xnABCQ==:
]]></artwork>
        </section>
        <section anchor="legacy-signature-agent-sf-string">
          <name>Legacy Signature-Agent, sf-string</name>
          <t>Retained for implementers migrating to the dictionary form (<xref target="signature-agent"/>). Do not copy it into new deployments.</t>
          <t>This example presents a minimal signature using the ed25519 algorithm over test-request. The request contains
a <tt>Signature-Agent</tt> header.</t>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

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

Signature-Agent: "https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=1735693200\
 ;nonce="e8N7S2MFd/qrd6T2R3tdfAuuANngKI7LFtKYI/vowzk4lAZYadIX6wW25MwG7DCT9RUKAJ0qVkU0mEeLElW1qg=="\
 ;tag="web-bot-auth"
Signature: sig2=:jdq0SqOwHdyHr9+r5jw3iYZH6aNGKijYp/EstF4RQTQdi5N5YYKrD+mCT1HA1nZDsi6nJKuHxUi/5Syp3rLWBA==:
]]></artwork>
        </section>
        <section anchor="signed-directory-response">
          <name>Signed Directory Response</name>
          <t>This example presents the possession proof described in
<xref target="origin-binding-appendix"/>, using the ed25519 algorithm. The directory server
signs its own response with the key it publishes. The signature covers
<tt>@authority</tt> from the request that fetched the directory, so the key set cannot
be re-served under another authority, and <tt>content-digest</tt> over the response
body, so the key set cannot be swapped under a captured signature.</t>
          <t>The proof is bound to the request that fetched the directory:</t>
          <artwork><![CDATA[
GET /.well-known/http-message-signatures-directory HTTP/1.1
Host: signature-agent.test
Accept: application/http-message-signatures-directory+json
]]></artwork>
          <t>The response body is the following JSON Web Key Set, signed exactly as shown,
with no trailing newline:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

{"keys":[{"kty":"OKP","crv":"Ed25519","kid":"poqkLGiymh_W0uP6PZFw-\
 dvez3QJT5SolqXBCW38r0U","x":"JrQLj5P_89iXES9-vFgrIy29clF9CC_oPPsw\
 3c5D0bs","use":"sig"}]}
]]></artwork>
          <t>Those bytes give the following <tt>Content-Digest</tt> field value:</t>
          <artwork><![CDATA[
Content-Digest: sha-256=:CADMT2aBdV/rqQr/NIru64ERQkCobVvllA4V0fLFDu0=:
]]></artwork>
          <t>The corresponding signature base is:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

"@authority";req: signature-agent.test
"content-digest": sha-256=:CADMT2aBdV/rqQr/NIru64ERQkCobVvllA4V0fLFDu0=:
"@signature-params": ("@authority";req "content-digest")\
 ;created=1735689600\
 ;expires=4889289600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;tag="http-message-signatures-directory"
]]></artwork>
          <t>This results in the following Content-Digest, Signature-Input and Signature
header fields being added to the response under the label <tt>binding</tt>:</t>
          <artwork><![CDATA[
NOTE: '\' line wrapping per RFC 8792

Content-Digest: sha-256=:CADMT2aBdV/rqQr/NIru64ERQkCobVvllA4V0fLFDu0=:
Signature-Input: binding=("@authority";req "content-digest")\
 ;created=1735689600\
 ;expires=4889289600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;tag="http-message-signatures-directory"
Signature: binding=:l6P8R67tm3kujAxbHWio7ll01qrEZ0dKD/WWlGhNYEmTnFZM8Wt0VQ9zqGfvo7T/UMkBxsigzChM1Gpz7gOVBg==:
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="implementations">
      <name>Implementations</name>
      <t>This draft has a couple of public implementations. A demonstration server has been deployed to <eref target="https://http-message-signatures-example.research.cloudflare.com/">https://http-message-signatures-example.research.cloudflare.com/</eref>.</t>
      <t>It uses ed25519 example signing and verifying keys defined in <xref section="B.1.4" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
      <section anchor="clients">
        <name>Clients</name>
        <t>draft-meunier-webbotauth-httpsig-protocol-00</t>
        <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/cloudflare/web-bot-auth">Rust binaries</eref> (Rust)</t>
          </li>
        </ul>
        <t>draft-meunier-web-bot-auth-architecture-03</t>
        <ul spacing="normal">
          <li>
            <t><eref target="https://github.com/stytchauth/web-bot-auth-example">Puppeteer script</eref> (JavaScript)</t>
          </li>
          <li>
            <t><eref target="https://github.com/olipayne/guzzle-web-bot-auth-middleware">Guzzle middleware</eref> (PHP)</t>
          </li>
          <li>
            <t><eref target="https://zenn.dev/oymk/articles/944069e5eddc27">Python script</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cyberstormdotmu/bot-authentication">Bot-Authentication</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">HTTPie plugin</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/cyberstormdotmu/bot-authentication">Web scrapers (scrapy/crawl4ai)</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/HumanSecurity/human-verified-ai-agent">HUMAN Verified AI Agents</eref> (Python)</t>
          </li>
          <li>
            <t><eref target="https://github.com/nomadium/linzer/blob/master/spec/integration/cloudflare_example_research_spec.rb">Linzer</eref> (Ruby)</t>
          </li>
        </ul>
      </section>
      <section anchor="servers">
        <name>Servers</name>
        <t>draft-meunier-webbotauth-httpsig-protocol-00</t>
        <ul spacing="normal">
          <li>
            <t><eref target="https://github.com/cloudflare/web-bot-auth">Cloudflare Workers</eref> (TypeScript)</t>
          </li>
        </ul>
        <t>draft-meunier-web-bot-auth-architecture-03</t>
        <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/garyillyes/web-bot-auth-apache">Apache module</eref> (C)</t>
          </li>
        </ul>
      </section>
      <section anchor="test-vectors-1">
        <name>Test Vectors</name>
        <ul spacing="normal">
          <li>
            <t>In <eref target="https://github.com/cloudflare/web-bot-auth/blob/main/packages/web-bot-auth/test/test_data/web_bot_auth_architecture_v2.json">JSON format</eref></t>
          </li>
        </ul>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The editor would also like to thank the following individuals (listed in alphabetical order) for feedback, insight, and implementation of this document -
Marwan Fayed,
Maxime Guerreiro,
Scott Hendrickson,
Jonathan Hoyland,
Nikhil Kandoi,
Akshat Mahajan,
Mark Nottingham,
Eugenio Panero,
Lucas Pardue,
Malte Ubl,
Loganaden Velvindron,
Tanya Verma.</t>
    </section>
    <section numbered="false" anchor="changelog">
      <name>Changelog</name>
      <t>draft-ietf-webbotauth-httpsig-protocol-01</t>
      <ul spacing="normal">
        <li>
          <t>Make every <tt>Signature-Agent</tt> value a direct JWK Set URI. Remove the
<tt>directory</tt>, <tt>jwks_uri</tt>, and <tt>cimd</tt> types.</t>
        </li>
        <li>
          <t>Recommend that an Origin expecting a signature request one with
<tt>Accept-Signature</tt>. Describe signing only on request.</t>
        </li>
        <li>
          <t>Separate the JWK <tt>alg</tt> from the signature <tt>alg</tt>.</t>
        </li>
        <li>
          <t>Use distinct <tt>Signature-Agent</tt> URLs for a crawler and a user-directed agent.</t>
        </li>
        <li>
          <t>State that identifiers allow correlation across origins.</t>
        </li>
      </ul>
      <t>draft-meunier-webbotauth-httpsig-protocol-02</t>
      <ul spacing="normal">
        <li>
          <t>Require <tt>Signature-Agent</tt> on every signed request, and require each signature
to cover the member keyed to its own label. Drop the test vectors that omitted
the header. Recast the no-URL identifier as a verifier state, not an Agent
mode.</t>
        </li>
        <li>
          <t>Defer <tt>Signature-Key</tt> to draft-hardt-httpbis-signature-key.</t>
        </li>
        <li>
          <t>List the components an Agent may cover beyond the required set.</t>
        </li>
        <li>
          <t>Drop the 2119 keywords from the human binding guidance in Privacy
Considerations.</t>
        </li>
        <li>
          <t>Require discovery to return <tt>200 (OK)</tt> and prohibit redirects.</t>
        </li>
        <li>
          <t>Make directory response signatures optional for directly resolved keys.</t>
        </li>
        <li>
          <t>Defer replay protection, including nonce handling, to
<xref target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        </li>
        <li>
          <t>Add a signed directory response test vector.</t>
        </li>
        <li>
          <t>Redraw the figures. The overview figure now shows the architecture, naming
who publishes and who resolves, rather than a message order, and places the
Agent inside the User. The sending figure shows key resolution following the
first request, conditional on the keys not already being resolved, and the
request example moves out of it.</t>
        </li>
      </ul>
      <t>draft-meunier-webbotauth-httpsig-protocol-01</t>
      <ul spacing="normal">
        <li>
          <t>Add an Identifiers and Trust Model section: opaque and domain binding modes.</t>
        </li>
        <li>
          <t>Describe the document as a protocol throughout (was: architecture).</t>
        </li>
        <li>
          <t>Fold <tt>draft-meunier-webbotauth-httpsig-directory</tt> into this document with its
IANA registrations, and move to Standards Track.</t>
        </li>
        <li>
          <t>Anchor identity on the resolved <tt>Signature-Agent</tt> URL rather than the key.
Rotation is the same URL serving a new key; the thumbprint identifies only
when no URL is sent. A <tt>directory</tt> value is an origin, identifiers are
normalized before comparison, and <tt>kid</tt> equals the key thumbprint.</t>
        </li>
        <li>
          <t>Define attribution: lookup on the (URL, key) pair, what redistributed key
material must carry, which source wins when two disagree, what a failed
resolution means, a bound on the resolution behind it, and rejection
of directory response signatures dated in the future.</t>
        </li>
        <li>
          <t>When chaining, an outer signature covering an inner <tt>signature</tt> <bcp14>MUST</bcp14> also
cover its <tt>signature-input</tt>, <tt>signature-agent</tt>, and every component the inner
signature covered. Verifiers validate each signature independently.</t>
        </li>
        <li>
          <t>Say what a signature does not reach: not the body without <tt>Content-Digest</tt>,
and not the method or path when only <tt>@authority</tt> is covered. Correct the
relabeling guidance, and note how to migrate from the sf-string form.</t>
        </li>
        <li>
          <t>Move the domain binding to an appendix. Add objectives, the relationship with
anonymous bot authentication, a use case to identifier mapping, what an
unsigned request tells a verifier, and the worst case for a compromised key.</t>
        </li>
        <li>
          <t>Note how field compression treats reused and per-request signatures, and why
that is not a reason to widen coverage.</t>
        </li>
      </ul>
      <t>draft-meunier-webbotauth-httpsig-protocol-00</t>
      <ul spacing="normal">
        <li>
          <t>Rename draft from <tt>draft-meunier-web-bot-auth-architecture</tt>.</t>
        </li>
        <li>
          <t>Add SSRF guidance for <tt>Signature-Agent</tt> directory fetches.</t>
        </li>
        <li>
          <t>Add deployment guidance for verifier outcomes, directory fetches, caching,
retry, rollout, proxies, CORS, and observability.</t>
        </li>
        <li>
          <t>Add guidance for test keys, static signatures, and discovery failures.</t>
        </li>
        <li>
          <t>Add multiple Web Bot Auth signatures and an example.</t>
        </li>
        <li>
          <t>Add typed <tt>Signature-Agent</tt> discovery examples for <tt>directory</tt>, <tt>jwks_uri</tt>,
and <tt>cimd</tt>.</t>
        </li>
        <li>
          <t>Group implementations by the draft version that added them.</t>
        </li>
        <li>
          <t>Clarify that <tt>Signature-Input</tt> <tt>keyid</tt> selects the key and <tt>Signature-Agent</tt>
points to candidate key material.</t>
        </li>
        <li>
          <t>Note <tt>Signature-Key</tt> as an optional discovery header.</t>
        </li>
        <li>
          <t>Align examples with published test-vector fixtures.</t>
        </li>
        <li>
          <t>Fix typos.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-05</t>
      <ul spacing="normal">
        <li>
          <t>Add Sandor Major as an author.</t>
        </li>
        <li>
          <t>Add session protocol considerations.</t>
        </li>
        <li>
          <t>Update HTTP Message Signatures test vectors.</t>
        </li>
        <li>
          <t>Keep legacy <tt>Signature-Agent</tt> string examples for implementers migrating to
dictionary members.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-04</t>
      <ul spacing="normal">
        <li>
          <t>Change <tt>Signature-Agent</tt> to a Structured Fields dictionary.</t>
        </li>
        <li>
          <t>Add a security consideration for intermediaries that relabel
<tt>Signature-Agent</tt> members.</t>
        </li>
        <li>
          <t>Allow <tt>@target-uri</tt> as a replacement for <tt>@authority</tt>.</t>
        </li>
        <li>
          <t>Add contributors.</t>
        </li>
        <li>
          <t>Add implementations.</t>
        </li>
        <li>
          <t>Remove the <tt>purpose</tt> field from the Web Bot Auth example.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-03</t>
      <ul spacing="normal">
        <li>
          <t>Update the Linzer example URL.</t>
        </li>
        <li>
          <t>Fix the section reference and name for status code 429.</t>
        </li>
        <li>
          <t>Fix typos.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-02</t>
      <ul spacing="normal">
        <li>
          <t>Add response status codes.</t>
        </li>
        <li>
          <t>Add references for readability.</t>
        </li>
        <li>
          <t>Add text about signing extra headers.</t>
        </li>
        <li>
          <t>Add TLS guidance to Security Considerations.</t>
        </li>
        <li>
          <t>Add RSASSA-PSS examples.</t>
        </li>
        <li>
          <t>Update acknowledgments.</t>
        </li>
        <li>
          <t>Add PHP, Python, Ruby, and Rust implementations.</t>
        </li>
        <li>
          <t>Fix <tt>Signature-Agent</tt> in the architecture diagram to use Structured Fields.</t>
        </li>
        <li>
          <t>Fix test vectors to use Structured Fields for <tt>Signature-Agent</tt>.</t>
        </li>
        <li>
          <t>Fix typos.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-01</t>
      <ul spacing="normal">
        <li>
          <t>Require clients to sign <tt>Signature-Agent</tt> when it is present.</t>
        </li>
        <li>
          <t>Add test vectors for requests with and without <tt>Signature-Agent</tt>.</t>
        </li>
        <li>
          <t>Fix the example diagram.</t>
        </li>
        <li>
          <t>Add reverse proxy security considerations.</t>
        </li>
        <li>
          <t>Update text about why an origin may request a new signature.</t>
        </li>
        <li>
          <t>Update nonce validation wording and uniqueness requirements.</t>
        </li>
        <li>
          <t>Add acknowledgments.</t>
        </li>
      </ul>
      <t>draft-meunier-web-bot-auth-architecture-00</t>
      <ul spacing="normal">
        <li>
          <t>Initial draft.</t>
        </li>
        <li>
          <t>Describe how to use HTTP Message Signatures to sign requests.</t>
        </li>
        <li>
          <t>Describe signature verification.</t>
        </li>
        <li>
          <t>Define the <tt>web-bot-auth</tt> tag.</t>
        </li>
        <li>
          <t>Derive <tt>keyid</tt> from the JWK Thumbprint.</t>
        </li>
        <li>
          <t>Add initial Security and Privacy Considerations.</t>
        </li>
      </ul>
    </section>
  </back>
  <!-- ##markdown-source:
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
+vnLfrxz/PEw724cnJ8f5fsfzzcu4UjSZweT7pv+5YeDL5fr4Yd3zw7eL59n
w88ng2f9avp29Ticrr1+OpoGW6/Ttzsfy53eYe/0zfLR8daH3uZg8+PFZCVL
qzxJ8q97X6uTt4f7+9cvLwZnrz8m7fX8IM7289HuKH2SpifPDoKdJ3G5fNZe
i1/1904OPnzZ2l1/Fz77GO0e7oz2V4uNbnE86D2ZPjm+vTjbf3twe7o3HXZ3
dj9/7F5sTKPO9auz1Z2vva+DZzvj/sr+1+VJtb8+ev362cXR6ujr2+v1s7P4
6+/7+fJe+jl8d5nHq8uXz4+X+1vr4frzrZf7+0++dK8PO1/bN6cHe9cbF19O
s2n+9WtWXqTrt6MPJ5udnVcXB6+ervXfPM3bT/filS87adp+oXozCpSjaIBY
RTNk3vCLfhOjP1Q7qCIkod8SeKBkx5OupjKL8HnjQS5ViFqkZlCLMd2V8Pfq
hE/Rgt1M4NnGU8Z9xg4o0WQGBuf/CCqHX/yXSKf/7zkPvWRrfa3GeX7vHJQf
3+9cDDuH7evi9+Jg6/Jlsdkub8vfd1ait6/iw967V53sdVHuF8+T9mVw/XmY
9ydfj4bTz+Uo2oh/P/54M9q//LK7V2z2LtZf95+87L79VxVJ/xXS6P+nhDAn
gg5X316efH31e3i2GjwNO8Bpj3ben54G6d6Hg93rJx+L97fHW8dHvy+Pn15n
m1uD4ZvJ+cbeadne3docPBs8fXV59iwZjY+XP++3+1tfnu/tn+9enB19fvf7
tDM5vnn64WwQdG/Wjt7Gw4vXr9amz4O10ebhq6Sc5tXk7Un8pfP6/bvqPHi1
9aS7+mzn1ah9vP9xuL7y++ar34/Ct6/znfb5OLr4cjYZr+3uPAmeD4PdveX3
ext7efXl6+f2xvLa6M3kJr/+et35El1ulKfvy/3J5fn5weFpHH6p+svPX0eb
18dbo+HgevA0yKvwqL3ROXo6mU4/7K1+fnd+OOidJs+DQd4PX2/sRv219d3D
8zI+PToPnn++2OqNL47229X+wcmTUf6xvXx0sDVcGXQOB6u9s+6Tld5xuxNF
G9V1tfrm82VvP8qffb50RZC/F+522mLT7VQYZotCyqKhmrafMO+kh+0D5t39
VZ+Lzbv/ptbdnxOIUiz4LyQJ/1uZbD/rKia2KGfysEqebo2froNy9+Tk9fp4
uF6N+y8PX42KanIwWX/+7MP7Z2+X959svuyMX+28//xh58vbyWb+NT1pPz97
//5o2snbl8XNyvBtuR9nb7ube6sfiqCK2/+qgvG/h632r0URcxJy51V23c4+
LO/nZ+Np9fUiWt3vrl0fXbQPtg7DyeaXzn64+mT32bN8tR/nxfH5zm1UHVUb
0ebpk+h6/evbwe5x++vn+Pfy6H3/y97Kym3afrnz9ueMlP9ZJsm/Hgf+32SL
/NNu1kLdM3p+8qyzdrwfLn/Jw82LtfP1Muy3q6p9kg7eHD472i/ffDhcvskm
X6+fJu2PH4Lw8PfNyeXaxvHk1bPdnYut83dv2q9Xvry/frcy2ouO9pLL1S//
sn6x/z1GyL8WBczx1s/hl5XOl9PJQTg9yLee5BufJ+vxh48Hm8HJqzfx5w/j
5T2wfJ6ev714G8YbJxsfPrzJd5+Mdi5WD9qr6cfdIt5MX7+pDm7fxcsbnel4
PT+6fFl3AHU4t2wREtBi3kaJYRY5h6uHZsob7oGtu4cNMtObTaXyOHdCY6Um
sdiACBGOf2lgp2bTIiQoW4/3GWilWrEy12CF9Xq1WqdPzAbmrFPuMtJcVFvv
5vBRYdQMdoyFe9LFeBgpu+NFlK4zwS20OEK9YIxLc5KchP8biAspxcx+cJFy
9ynFo2UrYh8Gb53NA1l0+702VarUgFx/EBbWBvhrWB8KA2Y54+vO6QllmWLS
XycqG5o0CfTbK5MpQfgPYUkNTzO/y1yaMoNUR1b3U/zv2xJmsS1t/wP+gfJx
6fTN2VJjqZffwL/FEoW/r+MQ/l7IpYAH3MGoGku38NDr/O3R542zT8+34t/3
OlvNm/1Bfjhd2+ol+1s7O5+ys7NiAmOs9zZ2V7oFPATWJzwGy176/u/fdeMQ
54PLMahpdH3T7oBYoTwi2Y36L7YxYw5BbkDta+8eX6wFL8P3y/mXt/nyyWFe
bT7dO397vZN1398kSfvp+5X+0f5uteLmafxXKSi/AY3fQX1L9eu39KcX8bAS
g7PwZ993jxRbrNn/Z5KOHrxWP6Rn1E+9cb/e4T2od5i7O6d4iIT4Od3jn0ST
cyqJTObF/7wjdRQHXcR2snn2/HzzWTlav64+t2+7B5dx9ixJVla/5HsfV8I3
u8uXl8mr4cmHvdFFuv/x+PllufL+7dbXL6/6N9mzi+V3x9cvb+F1X3eGx6uv
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
3RwBAA==

-->

</rfc>
