<?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.31 (Ruby 3.2.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-geng-acme-public-key-05" category="std" consensus="true" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="ACME PK Challenge">Automated Certificate Management Environment (ACME) Extension for Public Key Challenges</title>
    <seriesInfo name="Internet-Draft" value="draft-geng-acme-public-key-05"/>
    <author initials="F." surname="Geng" fullname="Feng Geng">
      <organization>Huawei Technologies</organization>
      <address>
        <email>gengfeng@huawei.com</email>
      </address>
    </author>
    <author initials="P." surname="Wu" fullname="Panyu Wu">
      <organization>Huawei Technologies</organization>
      <address>
        <email>wupanyu3@huawei.com</email>
      </address>
    </author>
    <author initials="L." surname="Xia" fullname="Liang Xia">
      <organization>Huawei Technologies</organization>
      <address>
        <email>frank.xialiang@huawei.com</email>
      </address>
    </author>
    <author initials="X." surname="Chen" fullname="Xin Chen">
      <organization>TrustAsia</organization>
      <address>
        <email>palos.chen@trustasia.com</email>
      </address>
    </author>
    <date year="2026" month="April" day="01"/>
    <workgroup>Automated Certificate Management Environment Working Group</workgroup>
    <keyword/>
    <keyword/>
    <keyword/>
    <abstract>
      <?line 58?>

<t>The current ACME protocol <xref target="RFC8555"/> requires applicants to submit a PKCS#10 Certificate Signing Request (CSR) during the finalization phase. The construction, ASN.1 encoding, and transmission of the CSR impose additional implementation burdens on both the client (especially resource-constrained devices) and the server. Moreover, the CSR cannot prevent a public key from being replaced by an intermediary at the protocol level.</t>
      <t>This document introduces the "pk-01" challenge extension based on the ACME protocol. Its core mechanism is as follows: the applicant declares the public key to be authenticated during the "newOrder" phase and completes the Proof of Possession (PoP) by signing with the private key during the challenge phase. Since the public key is declared when the order is created and verified during the challenge phase, there is no need to submit a CSR during the finalization phase; the ACME server can issue the certificate directly based on the verified public key, thereby eliminating the CSR at the protocol level.</t>
      <t>The "pk-01" challenge supports two verification modes via the <tt>pop_mode</tt> field:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Asynchronous Mode (Async)</strong>: The applicant pre-deploys a signature proof to a designated location (such as a DNS TXT record, HTTP path, or email reply). The ACME server then performs the verification query asynchronously, thereby completing dual verification of both control over the identifier and proof of private key ownership.</t>
        </li>
        <li>
          <t><strong>Synchronous Mode (Sync)</strong>: The ACME server issues a random number (<tt>nonce</tt>) in the challenge object and performs dual verification of identifier control and proof of private key possession through real-time protocol interactions with the applicant (similar to TLS-ALPN handshake). The applicant must remain online during the verification process.</t>
        </li>
      </ol>
      <t>The challenge object declares the available delivery methods via the <tt>supported_delivery</tt> field, and the client selects one of them to choose an authentication method and resource deployment.</t>
    </abstract>
  </front>
  <middle>
    <?line 71?>

<section anchor="intro">
      <name>Introduction</name>
      <section anchor="background-and-motivation">
        <name>Background and Motivation</name>
        <t>In the current ACME process, applicants must separately generate and submit a PKCS#10 CSR during the "finalize" phase, which presents the following issues:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Implementation Burden</strong>: CSR requires clients to implement ASN.1 encoding, DER format construction, and PKCS#10 encapsulation. For standard Domain Validation (DV) certificates and resource-constrained devices, this introduces unnecessary complexity.</t>
          </li>
          <li>
            <t><strong>Semantic Redundancy</strong>: In the ACME certificate scenario, the certificate’s subject information can be provided through existing methods; the CSR serves solely as a carrier for transmitting the public key, and other fields (such as the Subject DN) are typically ignored by the CA.</t>
          </li>
          <li>
            <t><strong>Post-Quantum Migration</strong>: The signature sizes of post-quantum signature algorithms (such as ML-DSA and SLH-DSA) are significantly larger than those of traditional algorithms, and ASN.1 toolchains do not yet fully support the identifiers for these algorithms; as a result, CSR-based processes face higher compatibility risks in post-quantum scenarios. This extension provides a more streamlined migration path for the introduction of post-quantum cryptography by moving the public key declaration to newOrder, transmitting it in the original SPKI format, and using the declared key directly to complete the PoP signature.</t>
          </li>
        </ul>
        <t>The solution proposed in this document is to move the public key declaration to the "newOrder" phase and perform ownership verification during the challenge phase using methods such as private key signatures. As a result, the "finalize" phase does not require a CSR; instead, the ACME server issues the certificate directly using the verified public key and the <tt>identifiers</tt> in the order.</t>
        <t>This extension minimizes changes to the existing ACME infrastructure, adding only three top-level fields — <tt>public_key</tt>, <tt>pop_mode</tt>, and <tt>csr_less</tt> — to the "newOrder" request and introducing a new challenge type, "pk-01". No modifications are required to the behavior during the finalization phase.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key terms used in this document are defined as follows:</t>
      <ul spacing="normal">
        <li>
          <t><strong>End Entity (EE, Applicant)</strong>: The entity that initiates the ACME certificate request and holds the private key to be verified.</t>
        </li>
        <li>
          <t><strong>ACME Server (AS)</strong>: A Certificate Authority (CA) or its delegated service that implements the ACME protocol.</t>
        </li>
        <li>
          <t><strong>Claimed Public Key</strong>: The public key to be authenticated, declared by the applicant in the <tt>public_key</tt> field of the "newOrder" request, in Base64URL-encoded Subject Public Key Information (SPKI) format <xref target="RFC5480"/>. The claimed public key <strong>MUST</strong> correspond to the private key actually held by the applicant; the ACME server <strong>MUST</strong> perform signature verification using the claimed public key and <strong>MUST</strong> perform a byte-by-byte comparison with the public key in the final certificate before issuing it.</t>
        </li>
        <li>
          <t><strong>Proof of Possession (PoP)</strong>: A mechanism whereby an applicant demonstrates, through cryptographic signature operations, that they actually possess the private key corresponding to the declared public key.</t>
        </li>
        <li>
          <t><strong>Extended Key Authorization Value (keyAuthorization)</strong>: An extended version of the challenge-response value defined in this document. It builds upon the standard ACME <tt>keyAuthorization</tt> ( token +  "." +  base64url (JWK_Thumbprint (accountKey) )). It incorporates a domain identifier to defend against UKS attacks and is signed with the declared private key to simultaneously verify both resource control and private key ownership (see Section 4 for details).</t>
        </li>
        <li>
          <t><strong><tt>public_key</tt></strong>: A new top-level extension field added to the "newOrder" request, containing the declared public key (SPKI encoded in Base64URL).</t>
        </li>
        <li>
          <t><strong><tt>pop_mode</tt></strong>: A top-level field added to the newOrder request in this document, used by the client to specify the selected PoP validation mode (<tt>async</tt> or <tt>sync</tt>, or other extensible mode strings).</t>
        </li>
        <li>
          <t><strong><tt>csr_less</tt></strong>: A new top-level boolean field added to the "newOrder" request, the default value is false. Controls whether the CSR submission is omitted during the finalization phase: "true" indicates that the certificate is issued directly using the declared public key; "false" indicates that a standard PKCS#10 CSR must still be submitted during the finalize phase, and the "pk-01" challenge is executed as an additional public key pre-check step.</t>
        </li>
        <li>
          <t><strong>usage context</strong>: A fixed ASCII string "ACME-pk-01" followed by a null byte (<tt>\x00</tt>) serves as a fixed prefix for all "pk-01" signed messages, providing cryptographic domain separation from the signing operations of other protocols.</t>
        </li>
        <li>
          <t><strong><tt>supported_delivery</tt></strong>: A list (array of strings) of available delivery methods declared by the AS in the challenge object. In asynchronous mode, this may include "<tt>dns</tt>", "<tt>http</tt>", and "<tt>email</tt>"; in synchronous mode, it may include "<tt>tls-alpn</tt>".</t>
        </li>
        <li>
          <t><strong><tt>delivery</tt></strong>: A field included by the client in the body of the challenge-response POST request, specifying the selected delivery method.</t>
        </li>
        <li>
          <t><strong><tt>acme-pk/1</tt></strong>: A TLS Application Layer Protocol Negotiation (ALPN, <xref target="RFC7301"/>) identifier defined in this document, intended exclusively for TLS-ALPN delivery in the "pk-01" challenge-synchronization mode. In TLS sessions using this identifier, the requesting server returns the raw <tt>proof</tt> bytes directly as TLS application data after the handshake is established, without constructing an X.509 certificate or embedding the proof in certificate extension fields. "<tt>acme-pk/1</tt>" and "<tt>acme-tls/1</tt>", as defined in <xref target="RFC8737"/>, are two distinct application-layer protocols (they have different formats and cannot be used interchangeably): "<tt>acme-tls/1</tt>" requires the construction of a self-signed certificate containing OID extensions, whereas "<tt>acme-pk/1</tt>" directly transmits the raw signature bytes.</t>
        </li>
      </ul>
      <t>The key words "<strong>MUST</strong>", "<strong>MUST NOT</strong>", "<strong>REQUIRED</strong>", "<strong>SHALL</strong>", "<strong>SHALL NOT</strong>", "<strong>SHOULD</strong>", "<strong>SHOULD NOT</strong>", "<strong>RECOMMENDED</strong>", "<strong>NOT RECOMMENDED</strong>", "<strong>MAY</strong>", and "<strong>OPTIONAL</strong>" 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>
    </section>
    <section anchor="protocol-extension-neworder-fields">
      <name>Protocol Extension: newOrder Fields</name>
      <t>This document introduces minimal extensions to the "newOrder" request: the <tt>identifiers</tt> field retains its standard ACME semantics and carries the certificate subject information; a new top-level field, <tt>public_key</tt>, is added to carry the declared public key; a new top-level field, <tt>pop_mode</tt>, is added for the client to declare the selected validation mode; and a new top-level boolean field, <tt>csr_less</tt>, is added to control whether the CSR submission is omitted during the finalization phase.</t>
      <t>After the ACME server receives a "newOrder" request containing the <tt>public_key</tt> field, it will issue a "pk-01" challenge for each identifier. When <tt>csr_less</tt> is set to "true", the server issues the certificate directly during the finalize phase based on the verified declared public key and the <tt>identifiers</tt>; when <tt>csr_less</tt> is set to "false" (default), the applicant must still submit a CSR during the finalize phase, and the "pk-01" challenge is executed as an additional public key pre-check step.</t>
      <t>If the <tt>public_key</tt> field does not exist, the ACME server <strong>SHOULD</strong> process the request according to the standard ACME procedure; this extension does not apply.</t>
      <t>The <tt>pk-01</tt> authorization is bound to the <tt>public_key</tt> in the order. <xref target="RFC8555"/> permits the reuse of valid authorizations, but this extension imposes a restriction: if the <tt>public_key</tt> declared in the new order does not match byte-for-byte with the public key recorded in the original valid authorization, the ACME server <strong>MUST</strong> reject the reuse of that authorization and issue a new "pk-01" challenge for the new order. When storing authorizations, the server <strong>MUST</strong> bind the raw bytes of the <tt>public_key</tt> field to the authorization record.</t>
      <section anchor="description-of-new-fields">
        <name>Description of New Fields</name>
        <table>
          <thead>
            <tr>
              <th align="left">Field name</th>
              <th align="left">Type</th>
              <th align="left">Existence</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>public_key</tt></td>
              <td align="left">String</td>
              <td align="left">OPTIONAL</td>
              <td align="left">Claimed public key, SPKI <xref target="RFC5480"/> encoded in Base64URL. If present, triggers the "pk-01" challenge and the CSR-less issuance process.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>pop_mode</tt></td>
              <td align="left">String</td>
              <td align="left">OPTIONAL</td>
              <td align="left">PoP verification mode declared by the client: "<tt>async</tt>" (the applicant pre-deploys the proof, and the AS verifies it independently) or "<tt>sync</tt>" (requires online interaction with the applicant). This can be extended to other third-party modes.</td>
            </tr>
            <tr>
              <td align="left">
                <tt>csr_less</tt></td>
              <td align="left">Boolean</td>
              <td align="left">OPTIONAL</td>
              <td align="left">Whether to skip the CSR submission during the finalization phase. "true": Issue directly using the declared public key; "false" (default): A CSR must still be submitted, with "pk-01" serving as a pre-check step.</td>
            </tr>
          </tbody>
        </table>
        <t>The rules for the <tt>pop_mode</tt> field are as follows:</t>
        <ul spacing="normal">
          <li>
            <t>"<tt>async</tt>" (Asynchronous mode): The applicant pre-deploys the PoP signature proof to a specified resource location, and the AS independently queries and verifies it at any time; the applicant does not need to be online during verification. Supported delivery methods are declared by the <tt>supported_delivery</tt> field of the challenge target and can be "<tt>dns</tt>", "<tt>http</tt>", or "<tt>email</tt>".</t>
          </li>
          <li>
            <t>"<tt>sync</tt>" (Synchronous mode): AS performs authentication by interacting directly with the applicant's server via a real-time protocol; the applicant <strong>MUST</strong> remain online during authentication. Supported delivery methods are specified by the <tt>supported_delivery</tt> declaration; a typical implementation is a simplified "tls-alpn" handshake.</t>
          </li>
          <li>
            <t>If <tt>pop_mode</tt> is omitted, CA <strong>SHOULD</strong> use the "<tt>async</tt>" by default.</t>
          </li>
          <li>
            <t>If the CA does not support the scheme declared by the client, it <strong>SHOULD</strong> return an error in the response.</t>
          </li>
        </ul>
      </section>
      <section anchor="neworder-request-example">
        <name>newOrder Request Example</name>
        <section anchor="asynchronous-modedns-identifier">
          <name>Asynchronous Mode—DNS Identifier</name>
          <artwork><![CDATA[
{
  "identifiers": [
    { "type": "dns", "value": "example.com" }
  ],
  "public_key": "<Claimed Public Key, Base64URL-encoded SPKI>",
  "pop_mode": "async",
  "csr_less": true
}
]]></artwork>
        </section>
        <section anchor="synchronization-mode-dns-identifier">
          <name>Synchronization Mode — DNS Identifier</name>
          <artwork><![CDATA[
{
  "identifiers": [
    { "type": "dns", "value": "example.com" }
  ],
  "public_key": "<Claimed Public Key, Base64URL-encoded SPKI>",
  "pop_mode": "sync",
  "csr_less": true
}
]]></artwork>
        </section>
        <section anchor="asynchronous-mode-email-certificate-scenario">
          <name>Asynchronous Mode — Email Certificate Scenario</name>
          <artwork><![CDATA[
{
  "identifiers": [
    { "type": "rfc822name", "value": "user@example.com" }
  ],
  "public_key": "<Claimed Public Key, Base64URL-encoded SPKI>",
  "pop_mode": "async",
  "csr_less": true
}
]]></artwork>
        </section>
      </section>
    </section>
    <section anchor="extended-keyauthorization">
      <name>Extended KeyAuthorization</name>
      <t>The "pk-01" extends the standard ACME certificate format by introducing domain identifier binding and private key signature verification, thereby validating both control over the resource and ownership of the private key.</t>
      <section anchor="base-keyauthorization-value">
        <name>Base KeyAuthorization Value</name>
        <t>The base keyAuthorization value is consistent with <xref target="RFC8555"/>:</t>
        <artwork><![CDATA[
keyAuthorization = token || "." || base64url(JWK_Thumbprint(accountKey))
]]></artwork>
      </section>
      <section anchor="signature-construction-in-asynchronous-mode">
        <name>Signature Construction in Asynchronous Mode</name>
        <t>In asynchronous mode, signed messages (<tt>to_sign</tt>) append a usage context prefix and an identifier string to <tt>keyAuthorization</tt>. The usage context prefix (<tt>ACME-pk-01\x00</tt>) provides cryptographic domain separation from other protocols (see §7.5), while the identifier serves as a defense against UKS attacks (see §7.2):</t>
        <artwork><![CDATA[
to_sign_async = "ACME-pk-01\x00" || keyAuthorization || "." || identifier
]]></artwork>
        <t>Proof of Possession Value:</t>
        <artwork><![CDATA[
proof = base64url(Sign(claimedPrivateKey, to_sign_async))
]]></artwork>
        <t>Here, <tt>identifier</tt> is the string value of the identifier associated with the current authorization (such as "<tt>example.com</tt>" or "<tt>user@example.com</tt>"). For the semantics of <tt>Sign(key, message)</tt>, see §4.4.</t>
        <t>Deployment locations for proofs of each identifier type:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Identifier Types</th>
              <th align="left">Delivery type</th>
              <th align="left">Deployment Location</th>
              <th align="left">Search Method</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>dns</tt></td>
              <td align="left">
                <tt>dns</tt></td>
              <td align="left">DNS TXT record <tt>_acme-challenge.&lt;domain&gt;</tt></td>
              <td align="left">DNS Query</td>
            </tr>
            <tr>
              <td align="left">
                <tt>dns</tt></td>
              <td align="left">
                <tt>http</tt></td>
              <td align="left">HTTP path <tt>/.well-known/acme-challenge/&lt;token&gt;</tt></td>
              <td align="left">HTTP Query</td>
            </tr>
            <tr>
              <td align="left">
                <tt>rfc822name</tt></td>
              <td align="left">
                <tt>email</tt></td>
              <td align="left">Body of the S/MIME email reply</td>
              <td align="left">Email Receipt</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="signature-construction-in-synchronous-mode">
        <name>Signature Construction in Synchronous Mode</name>
        <t>In synchronous mode, the <tt>token</tt> in a signed message is replaced with a new random number (<tt>nonce</tt>) issued by the CA to ensure the timeliness of the signature, and the message is similarly appended with a usage context prefix and identifier.</t>
        <artwork><![CDATA[
keyAuthorization_sync = nonce || "." || base64url(JWK_Thumbprint(accountKey))
to_sign_sync = "ACME-pk-01\x00" || keyAuthorization_sync || "." || identifier
]]></artwork>
        <t>Proof of Possession Value:</t>
        <artwork><![CDATA[
proof = base64url(Sign(claimedPrivateKey, to_sign_sync))
]]></artwork>
        <t>The <tt>nonce</tt> is issued by the CA in the challenge object (see §5.4.1) and has at least 128 bits of entropy. The semantics of <tt>Sign(key, message)</tt> are described in §4.4.</t>
        <t>A typical implementation of the synchronous mode is the TLS-ALPN handshake: the CA initiates a TLS connection to the applicant’s domain (using the ALPN protocol identifier "<tt>acme-pk/1</tt>"), and the applicant’s server returns a <tt>proof</tt> during the handshake. The CA simultaneously verifies both domain reachability (control) and the signature (proof of private key possession). The time-sensitive nature of the <tt>nonce</tt> ensures that the signature cannot be precomputed.</t>
      </section>
      <section anchor="signature-algorithm-convention">
        <name>Signature Algorithm Convention</name>
        <t>In this document, <tt>Sign(key, message)</tt> denotes performing a complete signing operation on the raw bytes of <tt>message</tt> (the algorithm handles the hashing internally; the caller must not perform any additional hashing on <tt>message</tt> beforehand). The specific algorithm is determined by the key type of the declared public key:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Key type</th>
              <th align="left">Signature Algorithm</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">EC P-256</td>
              <td align="left">ECDSA with SHA-256</td>
            </tr>
            <tr>
              <td align="left">EC P-384</td>
              <td align="left">ECDSA with SHA-384</td>
            </tr>
            <tr>
              <td align="left">Ed25519</td>
              <td align="left">Ed25519 (PureEdDSA, RFC 8032)</td>
            </tr>
            <tr>
              <td align="left">RSA</td>
              <td align="left">RSASSA-PSS with SHA-256</td>
            </tr>
          </tbody>
        </table>
        <t>The server <strong>SHOULD</strong> reject signature algorithms that are not included in the table above or do not comply with the current security baseline requirements, and explicitly declare the set of supported algorithms in the metadata of the Directory resource. Clients <strong>MUST</strong> use algorithms that correspond to the declared public key types; algorithm mismatches will result in signature verification failure.</t>
        <section anchor="explanation-of-post-quantum-algorithms">
          <name>Explanation of Post-Quantum Algorithms</name>
          <t>The set of algorithms currently specified in this document consists primarily of traditional cryptographic algorithms. For post-quantum migration scenarios, implementers may refer to NIST post-quantum standardized algorithms (such as ML-DSA/CRYSTALS-Dilithium [FIPS-204] and SLH-DSA/SPHINCS+ [FIPS-205]), whose algorithm identifiers and SPKI formats have been defined by relevant standards. Servers may negotiate the set of supported post-quantum algorithms through Directory metadata.</t>
          <t>The signature sizes of post-quantum signature algorithms are significantly larger than those of traditional algorithms (for example, an ML-DSA-44 signature is approximately 2,420 bytes, an ML-DSA-65 signature is approximately 3,309 bytes, and an SLH-DSA-SHA2-128s signature is approximately 7,856 bytes), all of which significantly exceed the 255-byte limit for a single DNS TXT record. Even when using multi-string concatenation (see §5.1.1), signature data as large as several kilobytes places a practical burden on DNS infrastructure, rendering asynchronous DNS delivery impractical in post-quantum scenarios.</t>
          <t>For post-quantum algorithms, <strong>RECOMMENDED</strong> using synchronous mode (TLS-ALPN delivery, <tt>pop_mode: "sync"</tt>): TLS 1.3 <xref target="RFC8446"/> provides native support for post-quantum key exchange and authentication algorithms; there are no artificial message size limits at the handshake layer; the <tt>nonce</tt> mechanism provides built-in timeliness guarantees; The TLS handshake itself serves as a post-quantum-friendly authentication channel, requiring no additional protocol-level adaptation for post-quantum algorithms.</t>
        </section>
      </section>
    </section>
    <section anchor="the-pk-01-challenge">
      <name>The pk-01 Challenge</name>
      <t>The "pk-01" challenge distinguishes between asynchronous and synchronous modes via the <tt>pop_mode</tt> field in "newOrder". The challenge object declares the list of delivery methods supported by the AS via the <tt>supported_delivery</tt> field, and the client specifies the selected method via the <tt>delivery</tt> field in the POST response. All challenge objects adhere to the structure defined in <xref target="RFC8555"/> §8, and the semantics of the standard fields (<tt>url</tt>, <tt>status</tt>, <tt>validated</tt>, <tt>error</tt>) remain unchanged.</t>
      <section anchor="asynchronous-mode-of-dns">
        <name>Asynchronous mode of DNS</name>
        <section anchor="challenge-object">
          <name>Challenge Object</name>
          <ul spacing="normal">
            <li>
              <t><strong>type</strong>: "pk-01"</t>
            </li>
            <li>
              <t><strong>token</strong>: Unpredictable random challenge token (Base64URL-encoded, with an entropy of at least 128 bits) <xref target="RFC4086"/>.</t>
            </li>
          </ul>
          <artwork><![CDATA[
{
  "type": "pk-01",
  "url": "https://acme.example.com/acme/chall/abc123",
  "status": "pending",
  "token": "evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA",
  "supported_delivery": ["dns", "http"]
}
]]></artwork>
          <t><strong>Note (DNS TXT Record Length)</strong>: The maximum length of a single DNS TXT record is 255 bytes (<xref target="RFC1035"/>). The length of the Base64URL-encoded signature value varies depending on the key type: EC P-256/Ed25519 is approximately 86 characters (well below the limit); RSA-2048 is approximately 342 characters, and RSA-4096 is approximately 683 characters (both exceed the single-string limit). If the signature value exceeds 255 bytes, the client <strong>MUST</strong> split it into multiple strings, each no longer than 255 bytes, and write them into the same TXT resource record ( <xref target="RFC4408"/> §3.1.3), and the server <strong>MUST</strong> concatenate the multiple strings in order to reconstruct the original string before performing signature verification. Servers <strong>SHOULD</strong> declare the supported key types and corresponding signature lengths in the Directory metadata to guide clients in selecting the appropriate key type. For post-quantum algorithms, DNS TXT delivery is not feasible in practice; <strong>SHOULD</strong> instead use the synchronous mode (TLS-ALPN delivery). For details, see §4.4.</t>
        </section>
        <section anchor="client-preparation-steps">
          <name>Client Preparation Steps</name>
          <t>1) Construct the base keyAuthorization using the standard ACME format:</t>
          <artwork><![CDATA[
keyAuthorization = token || "." || base64url(JWK_Thumbprint(accountKey))
]]></artwork>
          <t>2) Construct the signed message (see §4.4 for the <tt>Sign</tt> semantics):</t>
          <artwork><![CDATA[
to_sign = "ACME-pk-01\x00" || keyAuthorization || "." || identifier
]]></artwork>
          <t>Here, <tt>identifier</tt> is a string representing the order association domain (e.g., "example.com").</t>
          <t>3) Calculate the proof using the claimed private key:</t>
          <artwork><![CDATA[
proof = base64url(Sign(claimedPrivateKey, to_sign))
]]></artwork>
          <t>4) Write <tt>proof</tt> to the <tt>_acme-challenge.&lt;domain&gt;</tt> DNS TXT record for the domain:</t>
          <artwork><![CDATA[
_acme-challenge.example.com.  120  IN  TXT  "<proof>"
]]></artwork>
          <t>5) Send a POST request to "url" with the payload <tt>{"delivery": "dns"}</tt> to notify the server that the allocation is complete and specify that DNS delivery is selected.</t>
        </section>
        <section anchor="server-validation-steps">
          <name>Server Validation Steps</name>
          <t>1) Look up the <tt>_acme-challenge.&lt;domain&gt;</tt> TXT resource record to retrieve the <tt>proof</tt>.</t>
          <t>2) Rebuild local signature message:</t>
          <artwork><![CDATA[
keyAuthorization = token || "." || base64url(JWK_Thumbprint(accountKey))
to_sign = "ACME-pk-01\x00" || keyAuthorization || "." || identifier
]]></artwork>
          <t>3) Verify the signature of <tt>proof</tt> using <tt>public_key</tt> (the declared public key) (see §4.4 for the semantics of <tt>Sign</tt>).</t>
          <t>4) If validation passes, set the challenge status to "valid"; if validation fails, set it to "invalid".</t>
          <t>The DNS query itself confirms the applicant's control over the domain's DNS zone, while the signature verification verifies ownership of the private key; both verifications are completed simultaneously in a single operation.</t>
        </section>
      </section>
      <section anchor="asynchronous-mode-of-http">
        <name>Asynchronous mode of HTTP</name>
        <t>The asynchronous mode supports deploying PoP proofs to an HTTP path on a domain, which the AS retrieves independently via a GET request. Unlike DNS delivery, this method does not require DNS write permissions, but the applicant’s HTTP server <strong>MUST</strong> be accessible from the outside. The applicant does not need to remain online while the AS performs verification.</t>
        <section anchor="challenge-object-1">
          <name>Challenge Object</name>
          <artwork><![CDATA[
{
  "type": "pk-01",
  "url": "https://acme.example.com/acme/chall/def456",
  "status": "pending",
  "token": "DGyRejmCefe7v4NfDGDKfA",
  "supported_delivery": ["dns", "http"]
}
]]></artwork>
        </section>
        <section anchor="client-preparation-steps-1">
          <name>Client Preparation Steps</name>
          <t>1) Construct a base keyAuthorization value using the standard ACME method (using <tt>token</tt>):</t>
          <artwork><![CDATA[
keyAuthorization = token || "." || base64url(JWK_Thumbprint(accountKey))
]]></artwork>
          <t>2) Construct a signed message (same as the asynchronous DNS mode, using <tt>token</tt>):</t>
          <artwork><![CDATA[
keyAuthorization = token || "." || base64url(JWK_Thumbprint(accountKey))
to_sign = "ACME-pk-01\x00" || keyAuthorization || "." || identifier
]]></artwork>
          <t>3) Calculate the proof using the claimed private key:</t>
          <artwork><![CDATA[
proof = base64url(Sign(claimedPrivateKey, to_sign))
]]></artwork>
          <t>4) Deploy <tt>proof</tt> to the following HTTP path (using <tt>token</tt> as part of the path):</t>
          <artwork><![CDATA[
http://<domain>/.well-known/acme-challenge/<token>
]]></artwork>
          <t>5) Send a POST request to "url" with <tt>{"delivery": "http"}</tt> in the request body to notify the server that it can proceed with verification.</t>
        </section>
        <section anchor="server-validation-steps-1">
          <name>Server Validation Steps</name>
          <t>1) Send an HTTP GET request to <tt>http://&lt;domain&gt;/.well-known/acme-challenge/&lt;token&gt;</tt> and retrieve the response body as <tt>proof</tt>. A successful HTTP GET request confirms the applicant's control over the domain's HTTP service.</t>
          <t>2) Reconstruct the signed message using the locally stored <tt>token</tt> (using the <tt>token</tt>, as in the asynchronous DNS verification formula):</t>
          <artwork><![CDATA[
keyAuthorization = token || "." || base64url(JWK_Thumbprint(accountKey))
to_sign = "ACME-pk-01\x00" || keyAuthorization || "." || identifier
]]></artwork>
          <t>3) Verify the signature of <tt>proof</tt> using <tt>public_key</tt> (the claimed public key) (see §4.4 for the semantics of <tt>Sign</tt>).</t>
          <t>4) If validation passes, set the challenge status to "valid"; if validation fails, set it to "invalid".</t>
          <t>The HTTP GET request verifies domain ownership (HTTP reachability), and the signature verification confirms possession of the private key.</t>
        </section>
      </section>
      <section anchor="email-scenario">
        <name>Email Scenario</name>
        <t>The "pk-01" email scenario is based on the "email-reply-00" challenge mechanism defined in <xref target="RFC8823"/> and is suitable for email certificate application scenarios such as S/MIME (using the <tt>rfc822name</tt> type identifier); it always uses the asynchronous mode.</t>
        <section anchor="challenge-object-2">
          <name>Challenge Object</name>
          <ul spacing="normal">
            <li>
              <t><strong>type</strong>: "pk-01"</t>
            </li>
            <li>
              <t><strong>token</strong>:  Unpredictable random challenge token (Base64URL-encoded, with an entropy of at least 128 bits) <xref target="RFC4086"/>.</t>
            </li>
          </ul>
        </section>
        <section anchor="client-preparation-steps-2">
          <name>Client Preparation Steps</name>
          <t>1) The ACME server sends a challenge email containing a <tt>token</tt> to the email address associated with the order.</t>
          <t>2) The applicant constructs a signed message in accordance with §4.2 (including the prefix <tt>“ACME-pk-01\x00”</tt>, where <tt>identifier</tt> is a string representing an email address, such as "user@example.com") and computes <tt>proof</tt>.</t>
          <t>3) Send the <tt>proof</tt> as the body of a reply to the server's specified address in an S/MIME email.</t>
          <t>4) Send a POST request to "url" with the payload <tt>{“delivery”: “email”}</tt> to notify the server that the email has been sent.</t>
        </section>
        <section anchor="server-validation-steps-2">
          <name>Server Validation Steps</name>
          <t>The server receives the applicant's reply email, extracts the <tt>proof</tt> from the email body, and performs signature verification using the same logic as in §5.1.3 (using the <tt>identifier</tt> as the email address). If the verification passes, the challenge status is set to "valid".</t>
        </section>
      </section>
      <section anchor="synchronous-mode-of-tls-alpn">
        <name>Synchronous mode of TLS-ALPN</name>
        <t>In synchronous mode, the AS performs real-time verification through a direct TLS handshake with the applicant’s server; the applicant <strong>MUST</strong> remain online during the verification process. This document defines a new ALPN protocol identifier, "<tt>acme-pk/1</tt>" (see §2 and §8.3), for this handshake negotiation, using a simplified implementation: The client uses a signature message containing a <tt>nonce</tt> signed with the claimed private key pair to complete the PoP signature, and transmits the <tt>proof</tt> to the AS via the TLS handshake using the ALPN protocol identifier "<tt>acme-pk/1</tt>", without embedding the proof in the X.509 certificate extension fields.</t>
        <t>"<tt>acme-pk/1</tt>" is a different application-layer protocol from  "<tt>acme-tls/1</tt>" as defined in <xref target="RFC8737"/>: "<tt>acme-tls/1</tt>" requires the construction of a self-signed X.509 certificate containing OID extensions; in the "<tt>acme-pk/1</tt>" handshake, the server directly returns the raw <tt>proof</tt> bytes in the TLS application data, resulting in a simpler implementation with no additional restrictions on post-quantum large-size signatures.</t>
        <section anchor="challenge-object-3">
          <name>Challenge Object</name>
          <t>The sync mode challenge object includes the <tt>nonce</tt> and <tt>supported_delivery</tt> fields:</t>
          <ul spacing="normal">
            <li>
              <t><strong>type</strong>: "pk-01"</t>
            </li>
            <li>
              <t><strong>nonce</strong>: A new random number generated by CA specifically for this challenge (Base64URL-encoded, with an entropy of at least 128 bits).</t>
            </li>
            <li>
              <t><strong>supported_delivery</strong>：<tt>["tls-alpn"]</tt></t>
            </li>
          </ul>
          <artwork><![CDATA[
{
  "type": "pk-01",
  "url": "https://acme.example.com/acme/chall/sync789",
  "status": "pending",
  "nonce": "Kz3mVpQeRd9fLwYbN5hXuT6oJsIc0vAg2nEp1yMrFqZ",
  "supported_delivery": ["tls-alpn"]
}
]]></artwork>
        </section>
        <section anchor="client-preparation-steps-3">
          <name>Client Preparation Steps</name>
          <t>1) Retrieve the <tt>nonce</tt> from the challenge source. If it is missing, the client <strong>MUST</strong> terminate and report an error.</t>
          <t>2) Construct a synchronous signed message (see §4.4 for the <tt>Sign</tt> semantics):</t>
          <artwork><![CDATA[
to_sign = "ACME-pk-01\x00" || keyAuthorization_sync || "." || identifier
]]></artwork>
          <t>3) Calculate the proof using the claimed private key:</t>
          <artwork><![CDATA[
proof = base64url(Sign(claimedPrivateKey, to_sign))
]]></artwork>
          <t>4) Configure a TLS listener on port 443 of the domain. When an AS initiates a connection using the ALPN protocol identifier <tt>“acme-pk/1”</tt>, return <tt>proof</tt> as the handshake response data.</t>
          <t>5) Send a POST request to "url" with <tt>{“delivery”: “tls-alpn”}</tt> in the request body to notify the server that it can proceed with verification.</t>
        </section>
        <section anchor="server-validation-steps-3">
          <name>Server Validation Steps</name>
          <t>1) Initiate a TLS connection to <tt>&lt;domain&gt;:443</tt> (using the ALPN identifier "<tt>acme-pk/1</tt>") and retrieve the <tt>proof</tt> returned by the applicant's server. A successful TLS connection confirms the applicant's control over the TLS service for that domain.</t>
          <t>2) Reconstruct the signed message using the locally stored <tt>nonce</tt> (<strong>MUST NOT</strong> trust any <tt>nonce</tt> value provided by the client):</t>
          <artwork><![CDATA[
keyAuthorization_sync = nonce || "." || base64url(JWK_Thumbprint(accountKey))
to_sign = "ACME-pk-01\x00" || keyAuthorization_sync || "." || identifier
]]></artwork>
          <t>3) Verify the signature of <tt>proof</tt> using <tt>public_key</tt> (the claimed public key) (see §4.4 for the semantics of <tt>Sign</tt>).</t>
          <t>4) If validation passes, set the challenge status to "valid"; if validation fails, set it to "invalid".</t>
          <t>A TLS connection verifies domain ownership (TLS reachability), and signature verification confirms possession of the private key.</t>
        </section>
      </section>
      <section anchor="protocol-interaction-process">
        <name>Protocol Interaction Process</name>
        <section anchor="asynchronous-mode-dns-identifier-csrless-true">
          <name>Asynchronous mode (DNS identifier, csr_less: true)</name>
          <figure anchor="fig-pk-challenge-1">
            <name>Asynchronous mode (DNS identifier, csr_less: true)</name>
            <artwork><![CDATA[
EE (Applicant)              AS (ACME Server)         DNS Server
     |                            |                       |
     |-------1. newOrder--------->|                       |
     |       identifiers,         |                       |
     |       public_key: PK,      |                       |
     |       pop_mode: "async"    |                       |
     |                            |                       |
     |<------2. pk-01 (token)-----|                       |
     |                            |                       |
     |   [keyAuth, to_sign]       |                       |
     |   [proof=Sign(SK,to_sign)] |                       |
     |                            |                       |
     |-------------------3. DNS TXT record--------------->|
     |       _acme-challenge.example.com = proof          |
     |                            |                       |
     |-------4. POST {"delivery": |                       |
     |        ----   "dns"}------>|                       |
     |                            |                       |
     |              5. Look up DNS TXT records----------->|
     |                            |<------TXT: proof------|
     |                            |                       | 
     |    [6. Reconstruct to_sign,|                       |
     |      verify the signature using the PK]            |
     |                            |                       |
     |<---7. Challenge valid------|                       |
     |                            |                       |
     |----8. finalizeOrder------->|                       |
     |   (without CSR)            |                       |
     |                            |                       |
     |<--9. Certificate(PK, SAN)--|                       |
     |                            |                       |
]]></artwork>
          </figure>
        </section>
        <section anchor="synchronous-mode-tls-alpn-delivery-csrless-true">
          <name>Synchronous mode (TLS-ALPN delivery, csr_less: true)</name>
          <figure anchor="fig-pk-challenge-2">
            <name>Synchronous mode (TLS-ALPN delivery, csr_less: true)</name>
            <artwork><![CDATA[
EE (Applicant)                                   AS (ACME Server)
     |                                                    |
     |-------------------1. newOrder--------------------->|
     |                 identifiers,                       |
     |                 public_key: PK,                    |
     |                 pop_mode: "sync"                   |
     |                                                    |
     |<------------------2. pk-01 (nonce: N)--------------|
     |                                                    |
     |  [keyAuth_sync,to_sign, proof]                     |
     |  [Configure TLS Listener,                          |
     |             ALPN: "acme-pk/1"]                     |
     |                                                    |
     |-----------3. POST {"delivery": "tls-alpn"}-------->|
     |                                                    |
     |<---------------4. TLS handshake--------------------|
     |           (domain:443, ALPN: "acme-pk/1")          |
     |                                                    |
     |----------------5. return proof-------------------->|
     |                                                    |
     |   [6. Reconstruct `to_sign` using the local `N`    |
     |               verify the signature using the PK]   |
     |                                                    |
     |<---------------7. Challenge valid------------------|
     |                                                    |
     |----------------8. finalizeOrder------------------->|
     |                  (without CSR)                     |
     |                                                    |
     |<-------------9. Certificate(PK, SAN)---------------|
     |                                                    |
]]></artwork>
          </figure>
        </section>
      </section>
    </section>
    <section anchor="finalization">
      <name>Finalization</name>
      <t>After the "pk-01" challenge was validated, the ACME server has confirmed the following:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Resource Control</strong>: Verified via DNS TXT records (asynchronous/DNS), HTTP paths (asynchronous/HTTP), TLS handshakes (synchronous/TLS-ALPN), or email replies (email scenarios).</t>
        </li>
        <li>
          <t><strong>Proof of Private Key Ownership</strong>: Verified via the <tt>proof</tt> signature.</t>
        </li>
        <li>
          <t><strong>Claimed public key</strong>: Already claimed in the <tt>public_key</tt> field during the "newOrder" phase and bound to the order.</t>
        </li>
      </ul>
      <t>The behavior in the finalization phase is determined by the <tt>csr_less</tt> field in "newOrder":</t>
      <section anchor="csrless-trueno-csr">
        <name>csr_less: true（No CSR）</name>
        <t>"finalize" requests do not require a CSR, and the body may be an empty object. The server constructs and issues the certificate directly based on the following sources:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Public Key</strong>: Taken from the <tt>public_key</tt> field in "newOrder" (the declared public key, verified via a challenge).</t>
          </li>
          <li>
            <t><strong>Subject Alternative Name (SAN)</strong>: Taken from the <tt>identifiers</tt> field in "newOrder".</t>
          </li>
        </ul>
        <artwork><![CDATA[
POST /acme/order/xyz/finalize HTTP/1.1
Host: acme.example.com
Content-Type: application/jose+json

{}
]]></artwork>
        <t>The server issues a certificate using the <tt>public_key</tt> (claimed public key) as the public key and the domain name in <tt>identifiers</tt> as the SAN, and returns the certificate download URL.</t>
      </section>
      <section anchor="csrless-falsecompatibility-mode-default-value">
        <name>csr_less: false（Compatibility mode, default value）</name>
        <t>"finalize" requests <strong>MUST</strong> still include a standard PKCS#10 CSR; the process is consistent with the standard ACME <xref target="RFC8555"/> procedure. At this point, the "pk-01" challenge is performed as an additional public key pre-validation step: after verifying the proof of ownership of the claimed public key during the challenge phase, the server performs an additional byte-by-byte comparison during the "finalize" phase to ensure that the public key in the CSR matches the <tt>public_key</tt> field exactly before issuing the certificate. If the two do not match, the server <strong>MUST</strong> reject the request and return an error.</t>
        <artwork><![CDATA[
POST /acme/order/xyz/finalize HTTP/1.1
Host: acme.example.com
Content-Type: application/jose+json

{
  "csr": "<DER-encoded PKCS#10 CSR, Base64URL-encoded>"
}
]]></artwork>
      </section>
      <section anchor="public-key-consistency-validation-and-byte-normalization">
        <name>Public Key Consistency Validation and Byte Normalization</name>
        <t>Regardless of the value of <tt>csr_less</tt>, the server <strong>MUST</strong>:</t>
        <ol spacing="normal" type="1"><li>
            <t>Confirm that the order status is "ready" (all challenges have been passed).</t>
          </li>
          <li>
            <t>Perform a strict byte-by-byte comparison between the public key to be written to the certificate and the <tt>public_key</tt> declared in "newOrder" to ensure they are exactly the same.</t>
          </li>
        </ol>
        <t>To ensure the reliability of byte-level comparison, the server <strong>MUST</strong> treat the raw bytes of the <tt>public_key</tt> received in the "newOrder" request as the sole authoritative source and <strong>MUST NOT</strong> perform any form of DER normalization, re-encoding, or attribute pruning on it. A single cryptographic key may have multiple valid DER encodings (for example, the <tt>ECParameters</tt> field of an EC public key can be in OID format or implicit format). If the server normalizes the data during storage or comparison, this can result in false negatives (valid requests being rejected) or false positives (keys with different encodings being mistakenly identified as identical).</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <section anchor="proof-of-key-possession">
        <name>Proof of Key Possession</name>
        <t>"pk-01" requires applicants to possess the private key corresponding to the public key they declare. The server <strong>MUST</strong> verify the signature using the <tt>public_key</tt> in "newOrder" and <strong>MUST NOT</strong> rely on indirect methods to infer ownership of the public key. When issuing a certificate, the server <strong>MUST</strong> compare the public key bytes again to ensure consistency.</t>
      </section>
      <section anchor="unknown-key-share-attack-mitigation">
        <name>Unknown Key Share Attack Mitigation</name>
        <t>An Unknown Key Sharing (UKS) attack is described as follows: An attacker claims another person’s public key and requests PoP verification for a domain under their control, attempting to bind the other person’s public key to their own domain.</t>
        <t>This document defends against this attack by including an <tt>identifier</tt> field in the signed message:</t>
        <artwork><![CDATA[
to_sign = "ACME-pk-01\x00" || keyAuthorization || "." || identifier
]]></artwork>
        <t><tt>identifier</tt> explicitly binds the current authorization to a specific domain or email address, ensuring that signatures generated for different identifiers cannot be used interchangeably.</t>
      </section>
      <section anchor="replay-attack-prevention">
        <name>Replay Attack Prevention</name>
        <t>In asynchronous mode, the <tt>token</tt> <strong>MUST</strong> meet the unpredictability requirement (entropy of at least 128 bits) <xref target="RFC4086"/>. In synchronous mode, the <tt>nonce</tt> <strong>MUST</strong> also have an entropy of at least 128 bits. The server accepts each <tt>nonce</tt> only once; after use, it <strong>MUST</strong> immediately mark it as consumed. Any subsequent authentication requests carrying the same <tt>nonce</tt> <strong>MUST</strong> be rejected to prevent replay attacks.</t>
      </section>
      <section anchor="dns-control-dependency">
        <name>DNS Control Dependency</name>
        <t>In asynchronous mode (DNS identifier), security relies on the applicant having actual control over the corresponding DNS zone. If DNS control is compromised (e.g., through DNS hijacking), an attacker could write a forged signature into the TXT record. Implementers <strong>SHOULD</strong> use this in conjunction with DNSSEC.</t>
      </section>
      <section anchor="cross-protocol-attack-mitigation">
        <name>Cross-Protocol Attack Mitigation</name>
        <t>When a single private key is used across multiple protocols (such as TLS, CMS, and IKEv2), an attacker may trick the key into signing a maliciously crafted ACME challenge within the context of one of these protocols, thereby passing PoP verification without actually possessing the private key. This type of attack is known as a cross-protocol attack.</t>
        <t>This document appends a fixed usage context prefix, "<tt>ACME-pk-01\x00</tt>" (a fixed ASCII string followed by a NUL byte), to the beginning of all "pk-01" signed messages. Its function is identical to the 64-byte padding and context string mechanism used in the <tt>CertificateVerify</tt> message in TLS 1.3:</t>
        <artwork><![CDATA[
to_sign = "ACME-pk-01\x00" || keyAuthorization || "." || identifier
proof   = base64url(Sign(claimedPrivateKey, to_sign))
]]></artwork>
        <t>This prefix ensures that the signature message for "pk-01" is structurally distinct from the signature fields of other protocols. Even if the same private key is used for signing by another protocol, the resulting signature cannot be reused in the context of "pk-01".</t>
        <t>Implementers <strong>MUST</strong> include this prefix when constructing and verifying signed messages; omitting the prefix is considered a protocol violation.</t>
      </section>
      <section anchor="algorithm-agility">
        <name>Algorithm Agility</name>
        <t>The type of the claimed public key determines the range of signature algorithms that can be selected. The server <strong>SHOULD</strong> reject signature algorithms that do not meet the current security baseline requirements and explicitly state the supported algorithms in the metadata of the Directory resource.</t>
      </section>
      <section anchor="authorization-reuse-binding">
        <name>Authorization Reuse Binding</name>
        <t>RFC 8555 supports the reuse of valid, unexpired authorizations. However, "pk-01" authorizations are bound to specific <tt>public_key</tt>: if the public key associated with the reused authorization differs from the public key claimed in the new order, an attacker could exploit this to request a certificate for an unverified public key.</t>
        <t>The server <strong>MUST</strong> persistently store the original bytes of the <tt>public_key</tt> from the successful "pk-01" challenge in the authorization record, and perform a byte-by-byte comparison when reusing the authorization: if there is a mismatch, <strong>MUST</strong> reject the reuse and trigger a new challenge.</t>
      </section>
      <section anchor="security-notes-for-csrless-mode">
        <name>Security Notes for csr_less Mode</name>
        <t>After enabling <tt>csr_less: true</tt>, the finalization phase no longer passes the public key via the CSR; the CA relies entirely on the <tt>public_key</tt> declared in "newOrder" and validated by the "pk-01" challenge. In this scenario, the proof of private key ownership from the "pk-01" challenge is the sole cryptographic basis for the public key’s legitimacy. The server <strong>MUST</strong> perform byte-level locking on the order’s public key after the challenge verification passes to prevent subsequent requests from replacing the public key.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="acme-validation-methods">
        <name>ACME Validation Methods</name>
        <t>This document requests that IANA add the following entry to the ACME Validation Methods registry.</t>
        <table>
          <thead>
            <tr>
              <th align="left">Label</th>
              <th align="left">Note</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>pk-01</tt></td>
              <td align="left">Public key challenge with async (DNS/HTTP/email) and sync (TLS-ALPN) PoP modes</td>
              <td align="left">RFC XXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="iana-acme-message-fields">
        <name>IANA ACME Message Fields</name>
        <t>This document requests that IANA add the following entry to the ACME Validation Fields registry.</t>
        <t>newOrder request fields:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Properties</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Field Name</td>
              <td align="left">
                <tt>public_key</tt></td>
            </tr>
            <tr>
              <td align="left">Message Type</td>
              <td align="left">newOrder Request</td>
            </tr>
            <tr>
              <td align="left">Data Type</td>
              <td align="left">String</td>
            </tr>
            <tr>
              <td align="left">Presence</td>
              <td align="left">OPTIONAL（This must be included only when using the public key challenge extension）</td>
            </tr>
            <tr>
              <td align="left">Description</td>
              <td align="left">A public key awaiting certification, encoded as a Base64URL-encoded SPKI <xref target="RFC5480"/>. If present, triggers the pk-01 challenge and the CSR-less issuance process.</td>
            </tr>
            <tr>
              <td align="left">Reference</td>
              <td align="left">RFC XXX</td>
            </tr>
          </tbody>
        </table>
        <table>
          <thead>
            <tr>
              <th align="left">Properties</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Field Name</td>
              <td align="left">
                <tt>pop_mode</tt></td>
            </tr>
            <tr>
              <td align="left">Message Type</td>
              <td align="left">newOrder Request</td>
            </tr>
            <tr>
              <td align="left">Data Type</td>
              <td align="left">String</td>
            </tr>
            <tr>
              <td align="left">Presence</td>
              <td align="left">OPTIONAL（Default value: <tt>"async"</tt>）</td>
            </tr>
            <tr>
              <td align="left">Description</td>
              <td align="left">PoP verification mode declared by the client: <tt>async</tt> (the applicant pre-deploys the proof, and the AS verifies it independently) or <tt>“sync”</tt> (requires real-time interaction). Extensible.</td>
            </tr>
            <tr>
              <td align="left">Reference</td>
              <td align="left">RFC XXX</td>
            </tr>
          </tbody>
        </table>
        <table>
          <thead>
            <tr>
              <th align="left">Properties</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Field Name</td>
              <td align="left">
                <tt>csr_less</tt></td>
            </tr>
            <tr>
              <td align="left">Message Type</td>
              <td align="left">newOrder Request</td>
            </tr>
            <tr>
              <td align="left">Data Type</td>
              <td align="left">Boolean</td>
            </tr>
            <tr>
              <td align="left">Presence</td>
              <td align="left">OPTIONAL（Default value:<tt>false</tt>）</td>
            </tr>
            <tr>
              <td align="left">Description</td>
              <td align="left">Controls whether the CSR submission is skipped during the finalization phase. <tt>true</tt> indicates that the certificate is issued directly using the declared public key; <tt>false</tt> indicates that a PKCS#10 CSR must still be submitted, with the "pk-01" challenge serving as an additional pre-validation step.</td>
            </tr>
            <tr>
              <td align="left">Reference</td>
              <td align="left">RFC XXX</td>
            </tr>
          </tbody>
        </table>
        <t>Challenge Target Field:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Properties</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Field Name</td>
              <td align="left">
                <tt>supported_delivery</tt></td>
            </tr>
            <tr>
              <td align="left">Message Type</td>
              <td align="left">pk-01 Challenge Object</td>
            </tr>
            <tr>
              <td align="left">Data Type</td>
              <td align="left">Array of String</td>
            </tr>
            <tr>
              <td align="left">Presence</td>
              <td align="left">OPTIONAL</td>
            </tr>
            <tr>
              <td align="left">Description</td>
              <td align="left">A list of available delivery methods declared by AS. Asynchronous modes may include "<tt>dns</tt>", "<tt>http</tt>", and "<tt>email</tt>"; synchronous modes may include "<tt>tls-alpn</tt>". The client selects one from this list and declares it in the challenge-response.</td>
            </tr>
            <tr>
              <td align="left">Reference</td>
              <td align="left">RFC XXX</td>
            </tr>
          </tbody>
        </table>
        <table>
          <thead>
            <tr>
              <th align="left">Properties</th>
              <th align="left">Value</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Field Name</td>
              <td align="left">
                <tt>delivery</tt></td>
            </tr>
            <tr>
              <td align="left">Message Type</td>
              <td align="left">pk-01 Challenge Response (POST body)</td>
            </tr>
            <tr>
              <td align="left">Data Type</td>
              <td align="left">String</td>
            </tr>
            <tr>
              <td align="left">Presence</td>
              <td align="left">REQUIRED（when <tt>supported_delivery</tt> is present）</td>
            </tr>
            <tr>
              <td align="left">Description</td>
              <td align="left">The client must specify the selected delivery method in the POST body of the challenge-response request; this must be one of the values in the <tt>supported_delivery</tt> list.</td>
            </tr>
            <tr>
              <td align="left">Reference</td>
              <td align="left">RFC XXX</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="tls-alpn-protocol-identifier-registration">
        <name>TLS ALPN Protocol Identifier Registration</name>
        <t>This document requests that IANA add the following entry to the TLS Application-Layer Protocol Negotiation (ALPN) Protocol IDs registry <xref target="RFC7301"/> with the IETF as the Change Controller:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Protocol</th>
              <th align="left">Identification Sequence</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">
                <tt>acme-pk/1</tt></td>
              <td align="left">0x61 0x63 0x6d 0x65 0x2d 0x70 0x6b 0x2f 0x31 (<tt>"acme-pk/1"</tt>)</td>
              <td align="left">RFC XXX</td>
            </tr>
          </tbody>
        </table>
        <t>The "<tt>acme-pk/1</tt>" identifier is reserved for TLS-ALPN delivery in the "pk-01" challenge synchronization mode; its operational semantics differ from those of <xref target="RFC8737"/>: In TLS sessions using "<tt>acme-pk/1</tt>", the server returns the raw <tt>proof</tt> bytes directly in the TLS application data after the handshake is complete, without constructing an X.509 certificate or embedding any challenge data in the certificate extension fields.</t>
      </section>
    </section>
    <section anchor="implementation-considerations">
      <name>Implementation Considerations</name>
      <section anchor="acme-server">
        <name>ACME Server</name>
        <ul spacing="normal">
          <li>
            <t>When processing a "newOrder" request, the server must perform strict format validation on the <tt>public_key</tt> field to verify that it is a valid DER-encoded SPKI; for unsupported key types, it <strong>SHOULD</strong> return an error. The server <strong>MUST</strong> store <tt>public_key</tt> in the raw bytes received and must not perform any DER normalization or re-encoding (see §6.3).</t>
          </li>
          <li>
            <t>The server must verify the uniqueness of the <tt>token</tt> in asynchronous mode and the <tt>nonce</tt> in synchronous mode to prevent token reuse.</t>
          </li>
          <li>
            <t>Before issuing the certificate, the server must verify the public key bytes once again to ensure they match exactly, byte-for-byte, with the public key declared in "newOrder".</t>
          </li>
          <li>
            <t>The server <strong>MUST</strong> mark the <tt>nonce</tt> as used immediately after it is consumed for the first time and reject any subsequent attempts to reuse it. The server should limit the validity window of the <tt>nonce</tt> (<strong>RECOMMENDED</strong> to be no longer than the challenge token's validity period).</t>
          </li>
          <li>
            <t>When executing an asynchronous HTTP GET request, the server <strong>MUST NOT</strong> follow HTTP redirects that change the target domain to a different domain (cross-domain redirects), as following such redirects would invalidate the domain control verification. The server <strong>SHOULD</strong> allow same-domain redirects (such as HTTP → HTTPS redirects within the same host) and adhere to the standard ACME http-01 HTTP request specifications (timeouts, maximum number of redirects, etc.) to prevent server-side request forgery (SSRF).</t>
          </li>
          <li>
            <t>The server <strong>SHOULD</strong> include a <tt>supported_delivery</tt> field in the challenge object to declare all supported delivery methods for the client to choose from.</t>
          </li>
          <li>
            <t>After the server receives the Challenge-Response POST request, it must read the <tt>delivery</tt> field to determine which verification method to use; if the <tt>delivery</tt> field is missing or contains an unsupported value, the server <strong>SHOULD</strong> return an error.</t>
          </li>
        </ul>
      </section>
      <section anchor="acme-client">
        <name>ACME Client</name>
        <ul spacing="normal">
          <li>
            <t>The client <strong>MUST</strong> ensure that the private key used for signing strictly matches the <tt>public_key</tt> declared in "newOrder"; a mismatch in key types will cause the server to fail the signature verification.</t>
          </li>
          <li>
            <t>In synchronous mode, the client <strong>MUST</strong> send a response to the challenge URL only after the TLS listening configuration is complete, to ensure it is reachable when the server initiates the TLS handshake.</t>
          </li>
          <li>
            <t>In asynchronous mode, the client <strong>SHOULD</strong> verify that the resource (DNS TXT record or HTTP path) has taken effect before notifying the server, taking into account DNS propagation delays or HTTP service availability.</t>
          </li>
          <li>
            <t>When <tt>csr_less: true</tt>, the body of the "finalize" request may be an empty object <tt>{}</tt>, the client does not need to construct a CSR; when <tt>csr_less: false</tt> (default), the client <strong>MUST</strong> still submit a standard PKCS#10 CSR during the "finalize" phase, and the public key in the CSR <strong>MUST</strong> match the <tt>public_key</tt> declared in "newOrder".</t>
          </li>
          <li>
            <t>When sending a challenge-response POST request, the client <strong>MUST</strong> include a <tt>delivery</tt> field in the request body, and its value must be one of the items in the <tt>supported_delivery</tt> list of the challenge object.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <section anchor="asynchronous-mode-pk-01-dns-complete-interaction-without-extensions">
        <name>Asynchronous Mode: pk-01 (DNS) – Complete Interaction, Without Extensions</name>
        <t><strong>Prerequisites</strong>: The applicant <strong>MUST</strong> have DNS control over the domain <tt>example.com</tt> and a P-256 key pair (private key <tt>d</tt>, public key <tt>Q</tt>, SPKI-encoded as <tt>pk_spki</tt>).</t>
        <t><strong>Step 1: newOrder Request</strong></t>
        <artwork><![CDATA[
POST /acme/new-order HTTP/1.1
Host: acme.example.com
Content-Type: application/jose+json

{
  "identifiers": [
    { "type": "dns", "value": "example.com" }
  ],
  "public_key": "pk_spki",
  "pop_mode": "async",
  "csr_less": true
}
]]></artwork>
        <t><strong>Step 2: The server returns the pk-01 challenge</strong></t>
        <artwork><![CDATA[
{
  "type": "pk-01",
  "url": "https://acme.example.com/acme/chall/abc123",
  "status": "pending",
  "token": "evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA"
}
]]></artwork>
        <t><strong>Step 3: The client generates a signature and writes it to the DNS TXT record</strong></t>
        <artwork><![CDATA[
keyAuthorization = "evaGxfADs6pSRb2LAv9IZf17Dt3juxGJ-PCt92wr-oA.pswg5_v_JaVFRXrHxGfJkg"
to_sign = "ACME-pk-01\x00" || keyAuthorization || "." || "example.com"
proof = base64url(Sign(d, to_sign))  →  "<proof_value>"
# The Sign() function uses ECDSA-with-SHA256 (P-256 key) and internally signs the `to_sign` value after applying SHA-256 to it.
]]></artwork>
        <artwork><![CDATA[
_acme-challenge.example.com.  120  IN  TXT  "<proof_value>"
]]></artwork>
        <t><strong>Step 4: The client notifies the server, and the server queries and verifies</strong></t>
        <artwork><![CDATA[
POST /acme/chall/abc123 HTTP/1.1
Content-Type: application/jose+json

{"delivery": "dns"}
]]></artwork>
        <t>The server queries the TXT record for <tt>_acme-challenge.example.com</tt>, reconstructs <tt>to_sign</tt> locally, verifies the signature using <tt>pk_spki</tt>, and sets the challenge status to <tt>valid</tt> upon successful verification.</t>
        <t><strong>Step 5: finalizeOrder (without CSR)</strong></t>
        <artwork><![CDATA[
POST /acme/order/xyz/finalize HTTP/1.1
Content-Type: application/jose+json

{}
]]></artwork>
        <t>The server issues a certificate using <tt>pk_spki</tt> as the public key and <tt>example.com</tt> as the subject alternative name (SAN).</t>
      </section>
      <section anchor="asynchronous-mode-pk-01-http-complete-interaction-without-extensions">
        <name>Asynchronous Mode: pk-01 (HTTP) – Complete Interaction, Without Extensions</name>
        <t><strong>Prerequisites</strong>: The applicant <strong>MUST</strong> have HTTP control over the domain <tt>example.com</tt> and a P-256 key pair.</t>
        <t><strong>Step 1: newOrder Request</strong></t>
        <artwork><![CDATA[
POST /acme/new-order HTTP/1.1
Content-Type: application/jose+json

{
  "identifiers": [
    { "type": "dns", "value": "example.com" }
  ],
  "public_key": "pk_spki",
  "pop_mode": "async",
  "csr_less": true
}
]]></artwork>
        <t><strong>Step 2: The server returns the pk-01 challenge</strong></t>
        <artwork><![CDATA[
{
  "type": "pk-01",
  "url": "https://acme.example.com/acme/chall/def456",
  "status": "pending",
  "token": "DGyRejmCefe7v4NfDGDKfA",
  "supported_delivery": ["dns", "http"]
}
]]></artwork>
        <t><strong>Step 3: The client generates a signature and deploys it to the HTTP path</strong></t>
        <artwork><![CDATA[
keyAuthorization = "DGyRejmCefe7v4NfDGDKfA.pswg5_v_JaVFRXrHxGfJkg"
to_sign = "ACME-pk-01\x00" || keyAuthorization || "." || "example.com"
proof = base64url(Sign(d, to_sign))
# The Sign() function uses ECDSA-with-SHA256 (P-256 key) and internally signs the `to_sign` value after applying SHA-256 to it.
]]></artwork>
        <t>Deploy to: <tt>http://example.com/.well-known/acme-challenge/DGyRejmCefe7v4NfDGDKfA</tt></t>
        <t>Content: <tt>&lt;proof&gt;</tt></t>
        <t><strong>Step 4: The client notifies the server, and the server initiates an HTTP GET authentication request</strong></t>
        <artwork><![CDATA[
POST /acme/chall/def456 HTTP/1.1
Content-Type: application/jose+json

{"delivery": "http"}
]]></artwork>
        <t>The server sends an HTTP GET request to <tt>http://example.com/.well-known/acme-challenge/DGyRejmCefe7v4NfDGDKfA</tt> to verify domain ownership. After validating the signature, it sets the challenge status to "valid".</t>
        <t><strong>Step 5: finalizeOrder (without CSR)</strong></t>
        <t>The server issues a certificate using <tt>pk_spki</tt> as the public key and <tt>example.com</tt> as the subject alternative name (SAN).</t>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="RFC8555" target="https://www.rfc-editor.org/info/rfc8555" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8555.xml">
        <front>
          <title>Automatic Certificate Management Environment (ACME)</title>
          <author fullname="R. Barnes" initials="R." surname="Barnes"/>
          <author fullname="J. Hoffman-Andrews" initials="J." surname="Hoffman-Andrews"/>
          <author fullname="D. McCarney" initials="D." surname="McCarney"/>
          <author fullname="J. Kasten" initials="J." surname="Kasten"/>
          <date month="March" year="2019"/>
          <abstract>
            <t>Public Key Infrastructure using X.509 (PKIX) certificates are used for a number of purposes, the most significant of which is the authentication of domain names. Thus, certification authorities (CAs) in the Web PKI are trusted to verify that an applicant for a certificate legitimately represents the domain name(s) in the certificate. As of this writing, this verification is done through a collection of ad hoc mechanisms. This document describes a protocol that a CA and an applicant can use to automate the process of verification and certificate issuance. The protocol also provides facilities for other certificate management functions, such as certificate revocation.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8555"/>
        <seriesInfo name="DOI" value="10.17487/RFC8555"/>
      </reference>
      <reference anchor="RFC5480" target="https://www.rfc-editor.org/info/rfc5480" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5480.xml">
        <front>
          <title>Elliptic Curve Cryptography Subject Public Key Information</title>
          <author fullname="S. Turner" initials="S." surname="Turner"/>
          <author fullname="D. Brown" initials="D." surname="Brown"/>
          <author fullname="K. Yiu" initials="K." surname="Yiu"/>
          <author fullname="R. Housley" initials="R." surname="Housley"/>
          <author fullname="T. Polk" initials="T." surname="Polk"/>
          <date month="March" year="2009"/>
          <abstract>
            <t>This document specifies the syntax and semantics for the Subject Public Key Information field in certificates that support Elliptic Curve Cryptography. This document updates Sections 2.3.5 and 5, and the ASN.1 module of "Algorithms and Identifiers for the Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile", RFC 3279. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5480"/>
        <seriesInfo name="DOI" value="10.17487/RFC5480"/>
      </reference>
      <reference anchor="RFC7301" target="https://www.rfc-editor.org/info/rfc7301" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7301.xml">
        <front>
          <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</title>
          <author fullname="S. Friedl" initials="S." surname="Friedl"/>
          <author fullname="A. Popov" initials="A." surname="Popov"/>
          <author fullname="A. Langley" initials="A." surname="Langley"/>
          <author fullname="E. Stephan" initials="E." surname="Stephan"/>
          <date month="July" year="2014"/>
          <abstract>
            <t>This document describes a Transport Layer Security (TLS) extension for application-layer protocol negotiation within the TLS handshake. For instances in which multiple application protocols are supported on the same TCP or UDP port, this extension allows the application layer to negotiate which protocol will be used within the TLS connection.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="7301"/>
        <seriesInfo name="DOI" value="10.17487/RFC7301"/>
      </reference>
      <reference anchor="RFC8737" target="https://www.rfc-editor.org/info/rfc8737" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8737.xml">
        <front>
          <title>Automated Certificate Management Environment (ACME) TLS Application-Layer Protocol Negotiation (ALPN) Challenge Extension</title>
          <author fullname="R.B. Shoemaker" initials="R.B." surname="Shoemaker"/>
          <date month="February" year="2020"/>
          <abstract>
            <t>This document specifies a new challenge for the Automated Certificate Management Environment (ACME) protocol that allows for domain control validation using TLS.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8737"/>
        <seriesInfo name="DOI" value="10.17487/RFC8737"/>
      </reference>
      <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
        <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" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
        <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>
      <reference anchor="RFC8446" target="https://www.rfc-editor.org/info/rfc8446" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8446.xml">
        <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="RFC4086" target="https://www.rfc-editor.org/info/rfc4086" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4086.xml">
        <front>
          <title>Randomness Requirements for Security</title>
          <author fullname="D. Eastlake 3rd" initials="D." surname="Eastlake 3rd"/>
          <author fullname="J. Schiller" initials="J." surname="Schiller"/>
          <author fullname="S. Crocker" initials="S." surname="Crocker"/>
          <date month="June" year="2005"/>
          <abstract>
            <t>Security systems are built on strong cryptographic algorithms that foil pattern analysis attempts. However, the security of these systems is dependent on generating secret quantities for passwords, cryptographic keys, and similar quantities. The use of pseudo-random processes to generate secret quantities can result in pseudo-security. A sophisticated attacker may find it easier to reproduce the environment that produced the secret quantities and to search the resulting small set of possibilities than to locate the quantities in the whole of the potential number space.</t>
            <t>Choosing random quantities to foil a resourceful and motivated adversary is surprisingly difficult. This document points out many pitfalls in using poor entropy sources or traditional pseudo-random number generation techniques for generating such quantities. It recommends the use of truly random hardware techniques and shows that the existing hardware on many systems can be used for this purpose. It provides suggestions to ameliorate the problem when a hardware solution is not available, and it gives examples of how large such quantities need to be for some applications. 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="106"/>
        <seriesInfo name="RFC" value="4086"/>
        <seriesInfo name="DOI" value="10.17487/RFC4086"/>
      </reference>
      <reference anchor="RFC1035" target="https://www.rfc-editor.org/info/rfc1035" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1035.xml">
        <front>
          <title>Domain names - implementation and specification</title>
          <author fullname="P. Mockapetris" initials="P." surname="Mockapetris"/>
          <date month="November" year="1987"/>
          <abstract>
            <t>This RFC is the revised specification of the protocol and format used in the implementation of the Domain Name System. It obsoletes RFC-883. This memo documents the details of the domain name client - server communication.</t>
          </abstract>
        </front>
        <seriesInfo name="STD" value="13"/>
        <seriesInfo name="RFC" value="1035"/>
        <seriesInfo name="DOI" value="10.17487/RFC1035"/>
      </reference>
      <reference anchor="RFC4408" target="https://www.rfc-editor.org/info/rfc4408" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4408.xml">
        <front>
          <title>Sender Policy Framework (SPF) for Authorizing Use of Domains in E-Mail, Version 1</title>
          <author fullname="M. Wong" initials="M." surname="Wong"/>
          <author fullname="W. Schlitt" initials="W." surname="Schlitt"/>
          <date month="April" year="2006"/>
          <abstract>
            <t>E-mail on the Internet can be forged in a number of ways. In particular, existing protocols place no restriction on what a sending host can use as the reverse-path of a message or the domain given on the SMTP HELO/EHLO commands. This document describes version 1 of the ender Policy Framework (SPF) protocol, whereby a domain may explicitly authorize the hosts that are allowed to use its domain name, and a receiving host may check such authorization. This memo defines an Experimental Protocol for the Internet community.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="4408"/>
        <seriesInfo name="DOI" value="10.17487/RFC4408"/>
      </reference>
      <reference anchor="RFC8823" target="https://www.rfc-editor.org/info/rfc8823" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8823.xml">
        <front>
          <title>Extensions to Automatic Certificate Management Environment for End-User S/MIME Certificates</title>
          <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
          <date month="April" year="2021"/>
          <abstract>
            <t>This document specifies identifiers and challenges required to enable the Automated Certificate Management Environment (ACME) to issue certificates for use by email users that want to use S/MIME.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8823"/>
        <seriesInfo name="DOI" value="10.17487/RFC8823"/>
      </reference>
    </references>
    <?line 950?>



  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
