<?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.39 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-meunier-webbotauth-httpsig-protocol-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title abbrev="HTTP Message Signatures for Bots">HTTP Message Signatures for automated traffic</title>
    <seriesInfo name="Internet-Draft" value="draft-meunier-webbotauth-httpsig-protocol-02"/>
    <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="August" day="18"/>
    <area>Web and Internet Transport</area>
    <workgroup>Web Bot Auth</workgroup>
    <keyword>not-yet</keyword>
    <abstract>
      <?line 68?>

<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://thibmeu.github.io/http-message-signatures-directory/draft-meunier-webbotauth-httpsig-protocol.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-meunier-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/thibmeu/http-message-signatures-directory"/>.</t>
    </note>
  </front>
  <middle>
    <?line 80?>

<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 (<xref target="key-distribution-and-discovery"/>) and checks the signature against the
keys it returns. The identifier is the URL the verifier fetched, which for a
<tt>directory</tt> member is the well-known URI rather than the value the client sent.
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 resolves through the <tt>directory</tt> type
(<xref target="key-distribution-and-discovery"/>), 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"/></t>
          </dd>
          <dt><tt>keyid</tt></dt>
          <dd>
            <t><bcp14>MUST</bcp14> be a base64url JWK SHA-256 Thumbprint as defined in <xref section="3.2" sectionFormat="of" target="JWK-THUMBPRINT"/> for RSA and EC, and in <xref section="A.3" sectionFormat="of" target="JWK-OKP"/> for ed25519.</t>
          </dd>
          <dt><tt>tag</tt></dt>
          <dd>
            <t><bcp14>MUST</bcp14> be <tt>web-bot-auth</tt></t>
          </dd>
        </dl>
        <t>The signing key is available to the agent at request time. Algorithms should be registered with IANA as part of HTTP Message Signatures Algorithm registry.</t>
        <t>The creation of the signature is defined in <xref section="3.1" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/>.</t>
        <t>It is <bcp14>RECOMMENDED</bcp14> that expiry be no more than 24 hours.</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 a <xref target="URI"/>, whose scheme <bcp14>MUST</bcp14> be <tt>https</tt>. If dictionary values are
not valid URI-references, the entire header field <bcp14>MAY</bcp14> be ignored.</t>
          <t>Each member carries a <tt>type</tt> parameter, a Token Item as defined in
<xref section="3.3.4" sectionFormat="of" target="STRUCTURED-HEADERS"/>, naming the discovery mechanism that
resolves the value to key material. <xref target="key-distribution-and-discovery"/> defines
the types. When <tt>type</tt> is absent, its value is <tt>directory</tt>. A verifier that
does not support a <tt>type</tt> value <bcp14>MUST</bcp14> ignore that member, and <bcp14>MUST NOT</bcp14> infer the
mechanism from the URI path, media type, or response body.</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><xref section="5" sectionFormat="of" target="HTTP-MESSAGE-SIGNATURES"/> defines the <tt>Accept-Signature</tt> field which can be used to request a Message Signature from a client by an origin.
An Origin <bcp14>MAY</bcp14> choose to request signatures from clients that did not initially
provide them. A resulting signature <bcp14>MUST</bcp14> satisfy this profile. The Origin <bcp14>MAY</bcp14>
request additional parameters defined by <xref target="HTTP-MESSAGE-SIGNATURES"/>, including
<tt>nonce</tt>.
The status code <bcp14>SHOULD</bcp14> be 403 Forbidden as defined in <xref section="15.5.4" sectionFormat="of" target="HTTP"/>.</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"/>. The member's <tt>type</tt> parameter names
how the URL resolves to key material. This protocol defines three types:</t>
        <dl>
          <dt><tt>directory</tt></dt>
          <dd>
            <t>The member value <bcp14>MUST</bcp14> be the ASCII serialization of an origin as defined in
<xref section="6.2" sectionFormat="of" target="ORIGIN"/>, and a verifier <bcp14>MUST</bcp14> ignore a member carrying
anything else (an empty path <tt>/</tt> <bcp14>MAY</bcp14> be accepted though).
Resolve the HTTP Message Signatures Directory at the well-known
URI registered in <xref target="wkuri-reg"/>, at that origin. This is the default when no
<tt>type</tt> parameter is present.</t>
          </dd>
          <dt><tt>jwks_uri</tt></dt>
          <dd>
            <t>Resolve the member value as a direct JWK Set URI.</t>
          </dd>
          <dt><tt>cimd</tt></dt>
          <dd>
            <t>Resolve the member value as a Client ID Metadata Document <xref target="CIMD"/> URI. The
document then provides key material through <tt>jwks</tt> or <tt>jwks_uri</tt>.</t>
          </dd>
        </dl>
        <t>Each 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>All three types produce an identifier: the URL the verifier resolved, with any
query and fragment discarded. For <tt>directory</tt> that is the well-known URI, one
per origin. For <tt>jwks_uri</tt> and <tt>cimd</tt> it is the member value; the verifier
fetches that 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>The types differ in what additional information the verifier learns from the URL.
TLS authenticates the host but not the path, and nothing reserves the <tt>jwks_uri</tt> or <tt>cimd</tt> path to the host's operator. The well-known URI is reserved, so <tt>directory</tt>
additionally names a domain (<xref target="origin-binding"/>).</t>
        <t>For all types, 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><tt>jwks_uri</tt> and <tt>cimd</tt> resolve to key sets that 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"
Signature-Agent: sig1="https://signature-agent.test/jwks.json";type=jwks_uri
Signature-Agent: sig1="https://signature-agent.test/card";type=cimd
]]></artwork>
        <section anchor="configuration">
          <name>Directory format</name>
          <t>All three types resolve to a JSON Web Key Set (JWKS) as defined in
<xref section="5" sectionFormat="of" target="JWK"/>. The <tt>alg</tt> parameter is restricted to algorithms
registered in 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 agent implementer has two agents they want to differentiate,
these should use distinct signing keys and signing key directories.</t>
      </section>
      <section anchor="reverse-proxy">
        <name>Reverse proxy consideration</name>
        <t>An origin may be placed behind a reverse proxy, which means the proxy will see
the <tt>Signature</tt> and <tt>Signature-Agent</tt> headers before the origin does.
A proxy <bcp14>SHOULD NOT</bcp14> strip the <tt>Signature</tt> or <tt>Signature-Agent</tt> headers from
requests.</t>
        <t>A proxy <bcp14>SHOULD NOT</bcp14> replay signatures against other reverse proxies used by the
origin, as this allows impersonation of the principal signature agent.</t>
        <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>Most HTTP requests carry no signature. A verifier that sees none has learned
nothing about the sender: not that it is automated, not that it is human, not
that it is evading anything. Absence of a signal is not evidence about the
party that did not send it, in the same way that a failed fetch
(<xref target="discovery-failure"/>) is not evidence about the signer.</t>
        <t>What an origin does with a request it cannot attribute is its own decision, as
it was before this protocol existed. This document neither requires an origin
to treat unsigned requests differently nor gives it grounds to.</t>
      </section>
    </section>
    <section anchor="privacy-considerations">
      <name>Privacy Considerations</name>
      <section anchor="public-identity">
        <name>Public Identity</name>
        <t>This protocol assumes that automated clients identify themselves
explicitly using digital signatures. The identity associated with a signing
key is expected to be publicly discoverable for verification purposes. This
reduces anonymity and allows receivers to associate requests with specific
agents. If an agent wishes not to identify itself, this is not the right
choice of protocol for it.</t>
      </section>
      <section anchor="no-human-correlation">
        <name>No Human Correlation</name>
        <t>A key tied to a specific human individual exposes personally identifiable
information and makes the key usable for user tracking or profiling. A key that
represents a role, company, or automation identity (e.g., "news-aggregator-bot",
"example-crawler-v1") avoids this.</t>
      </section>
      <section anchor="minimizing-tracking-risks">
        <name>Minimizing Tracking Risks</name>
        <t>To limit tracking risks, implementations <bcp14>SHOULD</bcp14> avoid long-lived, globally
unique key identifiers unless strictly necessary. Key rotation <bcp14>SHOULD</bcp14> be
supported, and clients <bcp14>SHOULD</bcp14> take care to avoid signing information that
could be used to correlate activity across contexts, especially where
sensitive user data is involved.</t>
      </section>
      <section 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="CIMD">
          <front>
            <title>OAuth Client ID Metadata Document</title>
            <author fullname="Aaron Parecki" initials="A." surname="Parecki">
              <organization>Okta</organization>
            </author>
            <author fullname="Emelia Smith" initials="E." surname="Smith">
         </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   This specification defines a mechanism through which an OAuth client
   can identify itself to authorization servers, without prior dynamic
   client registration or other existing registration.  This is through
   the usage of a URL as a client_id in an OAuth flow, where the URL
   refers to a document containing the necessary client metadata,
   enabling the authorization server to fetch the metadata about the
   client as needed.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-oauth-client-id-metadata-document-02"/>
        </reference>
        <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="ORIGIN">
          <front>
            <title>The Web Origin Concept</title>
            <author fullname="A. Barth" initials="A." surname="Barth"/>
            <date month="December" year="2011"/>
            <abstract>
              <t>This document defines the concept of an "origin", which is often used as the scope of authority or privilege by user agents. Typically, user agents isolate content retrieved from different origins to prevent malicious web site operators from interfering with the operation of benign web sites. In addition to outlining the principles that underlie the concept of origin, this document details how to determine the origin of a URI and how to serialize an origin into a string. It also defines an HTTP header field, named "Origin", that indicates which origins are associated with an HTTP request. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6454"/>
          <seriesInfo name="DOI" value="10.17487/RFC6454"/>
        </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="26" month="June" year="2026"/>
            <abstract>
              <t>   This document defines the "Signature Agent Card", a JSON metadata
   document that a signature agent using [DIRECTORY] publishes to
   describe itself: its identity, purpose, rate expectations, and
   cryptographic keys.  Its parameters are drawn from the OAuth Dynamic
   Client Registration Metadata registry [DCR], the same namespace used
   by [CIMD], 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-03"/>
        </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 1000?>

<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 to the
<tt>directory</tt> type in <xref target="key-distribution-and-discovery"/>. 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 key is unknown.</t>
          </dd>
        </dl>
        <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="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/thibmeu/http-message-signatures-directory/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="agent2": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="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: agent2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="oD0HwocPBSfpNy5W3bpJeyFGY_IQ_YpqxSjQ3Yd-CLA"\
 ;alg="rsa-pss-sha512"\
 ;expires=4889289600\
 ;nonce="wcfPQPh7SzkvrIVvhD00vNk9PkxJNY2NVbYl2PVBB4zmUoluSwE7W6bPtF60QA3k8g06FU7PPCD+J58YofY1zg=="\
 ;tag="web-bot-auth"
Signature: sig2=:gHzpLNeHaHIO19NaJH9YMW5dcVSi2s0wOMBr6p18vcofS106sfC4KBIS0/szPlBBd1vIcyQ88B6CTEWIhRAiVrb9zfX0mx1aG12CSGWcYkSirHeyTxhbuJvXd27ed6skWoy4PjXItq38936ivUQjfdIwXh1aX6HxkAC3vRnEdSNfntkLWeEuIQ5BLIOBGE39fSwg27Qjq6OVWYas/9/aFUr3HA34MXWYdp+//cvlEKDp3kRoLOw9ro0AOr6srHrTeEtxon2afcws1aZVSlPdd2fZSEIGmw9HAHLDCEkFTERu1gH2k/zIEqgy7CAYXI9E5slog0cLg/Vc6+f8gih33g==:
]]></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="agent2": "https://signature-agent.test"
"@signature-params": ("@authority" "signature-agent";key="agent2")\
 ;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: agent2="https://signature-agent.test"
Signature-Input: sig2=("@authority" "signature-agent";key="agent2")\
 ;created=1735689600\
 ;keyid="poqkLGiymh_W0uP6PZFw-dvez3QJT5SolqXBCW38r0U"\
 ;alg="ed25519"\
 ;expires=4889289600\
 ;nonce="n9p433xm+NJ3ph3upfBIGmsuwHw387YV7Q/F+6BSpGCVjYCqQw6rznNA8PVVLySrAWsv0hQtFioQb6E1YsauiA=="\
 ;tag="web-bot-auth"
Signature: sig2=:RdNFx5Bj6au3YgAMQL/RzmUlZE8QZLIaXGRpw985hWnwPfMxT228NMk6ehRS1PSl4e8PhbNZACSanGdhEwYCCg==:
]]></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-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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
e6Sj3tJMvis886Qq1R98w1MUkw/qHj8rc+EoXi5Vj4c+l+v3cuPFi+018xIK
7oCM7vUv3l4Mn3e+3t5lx+/vhnsrK3dnt9sXt/evzz6unb3vfozXLt6/erXx
dfQujcvOZP/59Vb3ojjYWnnbXr99MVjZOnj3/OJid+/Z680XH9P+x9Wvg5cv
F2kBIre5BwxILINxY1OJa4oeMRTro634QCRTvVJarJ0eupewRuy9geNYu/kp
6pmvzK79eLdF0VTxzS//D3E8ShyOikhbtjM4+jo+OQuP/KPj89XtM//10fbH
0+vNoPe+E63lK5Pz01fZ1nj1xV0v7XdWV7by/u7Gm1fHnZXl/OtF/OpVsHp3
3Ju+ffHi1dbu1f718fCyHb3Puttf+x9WRver/uHq2m7n8Lr38bYTZUfh9Op+
2C1f330I1p6HwVZ+e51ONy4+fzguvqy/2F7fiu7evf3cD44nH4ar/oeto/vb
9u763WWyH3TO+klxe3Id7pfHbzdfnRyfvzrcX9/udyaDtedvP3/ZOn9//dHP
l7eX/YN32fpRe33j9MP1x2D8bHm5dxfvv9kbr99epifnk+0sXWmfZ1t5dpRd
hfvFfZqs+f3eJF/1f3/fiS+CYK3/e2f/+HA02T5qH53s7e7fHlztX5arg6O1
2+Wvx/tfBtPnu+2PH4639zfzOB2s9E4Gy+97W8/6LwbRcH0dDmDH9tw7CQcI
8FMj9YaX95sYpKBCKy1KYvotARdKfjHpbBbFPQfRMcikZEuX+RjEZEwYJOy/
KulTJGgvFWi48ZQxp7GPSjhxfeqt/yOwKhzjv0RG/X/Peegl2+trFc7zoXNU
/P5+92rYOW7f5h/yo+3rV/lWu7gvPuyuhG8Po+Peu8NO+jovDvIXcfvav/08
zPqTryfD6ediFG5GH05/vxsdXH/Z28+3elfrr/vPXnXf/quKpf8KefT/U0KY
EUHHq2+vz74efgguVv2NoHN3fnSy+/783E/2Px7t3T77PX9/f7p9evJhebxx
m25tD4ZvJpeb++dFe297a/B8sHF4ffE8Ho1Plz8ftPvbX17sH1zuXV2cfH73
YdqZnN5tfLwY+N27tZO30fDq9eHa9IW/Nto6PoyLaVZO3p5FXzqv378rL/3D
7Wfd1ee7h6P26cHvw/WVD1uHH06Ct6+z3fblOLz6cjEZr+3tPvNfDP29/eX3
+5v7Wfnl6+f25vLa6M3kLrv9etv5El5vFufvi4PJ9eUliNQo+FL2l1+8Drdu
T7dHw8HtYMPPyuCkvdk52ZhMpx/3Vz+/uzwe9M7jF/4g6wevN/fC/tr63vFl
EZ2fXPovPl9t98ZXJwft8uDo7Nko+729fHK0PVwZdI4Hq72L7rOV3mm7E4ab
5W25+ubzde8gzJ5/vm47IsjbD/Y6bbHtdksMs4UBJXtQVdBPmHnSCfcRM+/h
urn5Zt5/UyvvzwlEKbf6F5KE/+1Mt591GxNrlHN5XC1Ptscb6+v3o2dnr9fH
w/Vy3H8F6mBeTo4m6y+ef3z//O3ywbOtV53x4e77zx93v7ydbGVfk7P2i4v3
70+mnax9nd+tDN8WB1H6tru1v/ox98uo/a8qHP/72Gz/WlQxIykvg7OD+81X
n7f8cv3joH369mT5EuzC+Pf9F29/Pzn2PxxejifbLzaH18nkon96f7W29uLs
9HYrHF52Vi868Ub44mLYPfu9vdvxk8NguD/5uLv7k8bK/yzT5F+PE/9vskn+
aTdrrg4avjh73lk7PQiWv2TB1tXa5XoR9Ntl2T5LBm+On58cFG8+Hi/fpZOv
txtx+/ePfnD8YWtyvbZ5Ojl8vrd7tX357k379cqX97fvVkb74cl+fL365V/W
R/a/xxj516KAGd76Ofiy0vlyPjkKpkfZ9rNs8/NkPfr4+9GWf3b4Jvr8cby8
DxbQxuXbq7dBtHm2+fHjm2zv2Wj3avWovZr8vpdHW8nrN+XR/btoebMzHa9n
J9ev2hXe2uEcs3mYKvN5GyWI1ZFZatn4D2B9PcAGmenVU6oU51Lo2KnJgzVw
LFRDWhisnnqahARpq/E/A1JjAO4J6J9KhoJqeVWlbygmr3LaOXc6ac6rUnZz
+aiOp4bCYYFzzF5j5GzBiyhtZ4JbaBFZev4Yl+YkOwn/N2ABUjmY/uAi5e5T
ykfLFnA+nsxTzwuZd/tVmworKuiXP4ilaQP+FdQE3Q3DcsbXnfMzyjbF5L9O
iMoBEzbQL2Ep+xR7nCQNpROVi0xaPINUR1b3U/zv2xJmsy3t/AP+gfJx6fzN
xVJjqZfdwb/FIoW/b6MA/p7LpYAHLGBUjaV7eOh19vbk8+bFpxfb0Yf9znbz
7mCQHU/Xtnvxwfbu7qf04iKfwBjrvc29lW4OD4EVCo/Bspe+//t3vXGImMDV
A9SCurppC8AqKK9IdqP6ix3MnEO4kJc7u+2906s1/1Xwfjn78jZbPjvOyq2N
/cu3t7tp9/1dHLc33q/0Tw72yhU3b+O/SkH5DWh8AfUtVa/f0p9exONKDM7C
q7/vASk2X7P/zyQhPXqtfkjPqJ5642G9Qz2qd5i7O6N4iIT4Od3jn0STMyqJ
TObl/7wjdRQHvYideOvixeXW82K0flt+bt93j66j9Hkcr6x+yfZ/Xwne7C1f
X8eHw7OP+6Or5OD30xfXxcr7t9tfvxz279LnV8vvTm9f3cPrvu4OT1cPx1+f
D87fv3LsMq/WJlhDeGd+n8FksD6tRNXBdmyvIeVTr51KirBkUXOjsTARY4sp
6R9aw1y0IdpEQU2FWhX24rQM+rGfkdmybNNW/+wImLB6TODDuVFfTLqp5BEb
7OCpZBXn/wmvJCW1M6i/UrS1MO0yQewRUB1Bc0RCpfwfeH1Tw5g0V1YwF/sf
u8MMs3lP36/Pzdi1i1t29dCn3hMEre6AQjcunvJA5pfY6+8W1Kn/5ICXJbZm
QxyJKPzZsfDZp3N2w/ymiUcXYa0oXu6VdXrjRQn7XoSYm0vzmPvSvJiCcoRj
VF6q6QJe/tq/892FHJZfv8aYfBYEcTiB2c4dN42jsT9NwuUB/bw6W/ssjH9x
dMEDX0yBAyUzk/0aJkkrCO+W0+nodplgCeIwX97e2FjZ2g43wyDorT3Hcehx
HuoVvKldKRSYv+PTLhwsYjUEaTEql/UE7WO1cZFuI2yIXYKy/5OH6I6Dahus
08dmBt4T+td0mUBKN/zo6T9pru9O22e6sCrw2scetxKcOzp1StFI6MvUC6Wp
C96afsTKRe0FJ1HyNczmDpekIz+IytFyTL9Z7sZpd3lE1WnLmJC/jPVHA+aA
zpZ9Eqr7pLnRJ/xxK+vSHehOnzr9f/8Ud/inXuqfvI67oCBM/xzpHKa84+0x
4TmM0qCM51+7gZ9NoziewgWpToiehKF2n9oGo3c67/QviPjxDzIoGOvoZ+an
DzdKluElt0Ap1Xcvo0pK/+8TNiHB7z7Bd5/wu0/uRn26W2uhBfSU2nS0e2iP
xWFA4PG5+rbD8O6gfiz1/Rg0f0EbDoMIy0snFv4ljm5DwVVNbmt6nm3wAxdP
WiRgUUI8HoJ+hlcpZhy0pwy1HoYBN5GNsLXUUDBma/Etwr5wc3Cb6tTPJn7i
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
HQEA

-->

</rfc>
