<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.14 (Ruby 3.1.2) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-gallagher-openpgp-hkp-05" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="HKP">OpenPGP HTTP Keyserver Protocol</title>

    <author fullname="Daphne Shaw">
      <organization>Jabberwocky Tech</organization>
      <address>
        <email>dshaw@jabberwocky.com</email>
      </address>
    </author>
    <author fullname="Andrew Gallagher" role="editor">
      <organization>PGPKeys.EU</organization>
      <address>
        <email>andrewg@andrewg.com</email>
      </address>
    </author>

    <date year="2024" month="July" day="06"/>

    <area>sec</area>
    <workgroup>openpgp</workgroup>
    <keyword>Internet-Draft</keyword>

    <abstract>


<?line 53?>

<t>This document specifies a series of conventions to implement an OpenPGP keyserver using the Hypertext Transfer Protocol (HTTP).
As this document is a codification and extension of a protocol that is already in wide use, strict attention is paid to backward compatibility with these existing implementations.</t>



    </abstract>

    <note title="About This Document" removeInRFC="true">
      <t>
        The latest revision of this draft can be found at <eref target="https://andrewgdotcom.gitlab.io/draft-gallagher-openpgp-hkp"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-gallagher-openpgp-hkp/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        OpenPGP Working Group mailing list (<eref target="mailto:openpgp@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/openpgp/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/openpgp/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://gitlab.com/andrewgdotcom/draft-gallagher-openpgp-hkp"/>.</t>
    </note>


  </front>

  <middle>


<?line 58?>

<section anchor="introduction"><name>Introduction</name>

<t>For ease of use, public key cryptography requires a key distribution system.
For many years, the most commonly used system has been a key server - a server that stores public keys and can be searched for a given key.
The HTTP Keyserver Protocol is a OpenPGP keyserver implemented using HTTP.</t>

</section>
<section anchor="conventions-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?>

</section>
<section anchor="hkp-and-http"><name>HKP and HTTP</name>

<t>As HKP is implemented over HTTP, everything in <xref target="RFC1945"></xref> applies to HKP as well, and HKP error codes are the same as the ones used in HTTP.</t>

<t>Due the very large deployment of HKP clients based on HTTP version 1.0, HKP keyservers <bcp14>MUST</bcp14> support HTTP 1.0.
HKP keyservers <bcp14>MAY</bcp14> additionally support other HTTP versions.</t>

<t>(( dshaw : I expect this to be controversial, but we've got tons of deployed code that only works with 1.0.
I'd be willing to discuss removing this <bcp14>MUST</bcp14> or make it a <bcp14>SHOULD</bcp14> and add a "implementation notes" section pointing out the problem instead.
See issue #5.
))</t>

<t>When used over HTTPS, HKP is commonly referred to as "HKPS".</t>

<t>HKP(S) are distinguished from generic use of HTTP(S) by using the URI schemes "hkp" and "hkps" (<xref target="RFC7595"></xref>).
HKP is assigned port number 11371 and HKPS is assigned 11372 (although this is rarely used in practice).
For reasons of maximum compatibility with firewalls and filtering HTTP proxies, HKP(S) are often served over the standard HTTP(S) port(s) (TCP ports 80 and 443).</t>

<t>By convention and history, HKP defaults to HTTP on TCP port 11371, and HKPS defaults to HTTPS on TCP port 443.</t>

<t>(( andrewg : if we assign hkps, we appear to be required to specify a dedicated port, even though nobody uses it.
See issue #14.
))</t>

<t>A keyserver <bcp14>SHOULD</bcp14> support both HKP and HKPS.
A client <bcp14>SHOULD</bcp14> use HKPS, or a transport method with equivalent security properties, such as Tor hidden services (<xref target="TOR"></xref>).</t>

<t>See <xref target="locating-keyserver"/> for an automated way for clients to discover the correct port.</t>

<section anchor="request-paths"><name>Request Paths</name>

<t>HKP defines two paths, namely "/pks/lookup" for lookups (see <xref target="key-lookups"/>) and "/pks/add" for submission (see <xref target="submitting-keys"/>).
A keyserver <bcp14>MAY</bcp14> support requests to other paths under "/pks", but these are outside the scope of this document.
These alternative paths have historically been used to provide human readable interfaces such as HTML forms, and functionality extensions such as <xref target="SKS"></xref>.</t>

</section>
<section anchor="http-status"><name>HTTP Status Codes</name>

<t>When a status or error code needs to be returned by a keyserver, the most appropriate HTTP code from <xref target="RFC9110"></xref> should be used.
It is good practice to return the most specific error code possible: for example, returning 404 ("Not Found") rather than 400 ("Bad Request") when a key is not found.</t>

<t>This document gives suggested HTTP error codes for several common situations.
Note that these are only suggestions, and implementations may have good reasons (such as not revealing the reason why a request failed) for using other error codes.</t>

<t>Clients <bcp14>SHOULD</bcp14> understand the following codes:</t>

<texttable title="Status Codes" anchor="status-codes">
      <ttcol align='left'>Status Code</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>200 OK</c>
      <c>Request succeeded</c>
      <c>202 Accepted</c>
      <c>Submitted key was altered to match keyserver policy</c>
      <c>403 Forbidden</c>
      <c>The requested operation is not permitted</c>
      <c>404 Not found</c>
      <c>The search returned no results, or path not found</c>
      <c>410 Gone</c>
      <c>Key has been permanently deleted, e.g. due to RTBF</c>
      <c>413 Content too large</c>
      <c>The search returned too many responses</c>
      <c>422 Unprocessable content</c>
      <c>Submitted key was rejected as per keyserver policy</c>
      <c>501 Not implemented</c>
      <c>The requested operation is not supported</c>
</texttable>

<t>In addition, a client <bcp14>SHOULD</bcp14> understand 3xx redirect codes.</t>

<t>(( andrewg : In draft-shaw-00 it was suggested that a novel header be used for statuses that could not be represented by the HTTP response codes of the time.
This was only partially specified, and it is unclear if any implementations of this header existed.
In the meantime many new HTTP response codes have been defined, so I am using them instead - even if their semantics does not exactly match that of <xref target="RFC9110"></xref>.
NB therefore that codes 202, 410, 413, 422 may not have been implemented anywhere yet.
))</t>

<t>(( andrewg : note also that 413 and 202 may be incorrect usage, see issues #25 and #26 respectively.
))</t>

</section>
</section>
<section anchor="key-lookups"><name>Looking up Data from a Keyserver</name>

<t>Key lookups are done via an HTTP GET request.
Specifically, the abs_path (see <xref target="RFC1945"></xref> section 3.2) is built up of the base path "/pks/lookup", followed by request-specific URL components.
These components differ slightly between the Legacy and v1 request formats (see below).</t>

<t>Most HKP lookups contain both the "op" (operation) and "search" fields.
The "op" field determines what operation the keyserver will execute, and the "search" field determines which keys are operated on.</t>

<t>There may also be modifier variables, as specified in <xref target="modifier-variables"/> below.
Variables are passed using HTTP query strings as specified in <xref target="RFC1866"></xref> section 8.2.2.
HTTP query strings <bcp14>MAY</bcp14> be given in any order.
Keyservers <bcp14>MUST</bcp14> ignore any unknown query strings.</t>

<section anchor="request-formats"><name>Legacy and v1 Request Formats</name>

<t>For backwards compatibility with the existing installed client base, a Legacy request format is defined.
New implementations <bcp14>SHOULD</bcp14> use the v1 request format.</t>

<section anchor="legacy-request-format"><name>Legacy Request Format</name>

<t>In the Legacy request format, the "op" and "search" fields are supplied as HTTP query strings, in the form "&lt;field-name&gt;=&lt;value&gt;":</t>

<figure><artwork><![CDATA[
/pks/lookup?op=<op>&search=<search>[&...]
]]></artwork></figure>

<t>They are treated in the same way as modifier variables, including arbitrary ordering, however the "op" field <bcp14>MUST</bcp14> be supplied, and the "search" field <bcp14>MUST</bcp14> be supplied unless the "stats" operation is being requested (see <xref target="stats-operation"/>).
No URL path components under "/pks/lookup" are used.</t>

</section>
<section anchor="v1-request-format"><name>v1 Request Format</name>

<t>In the v1 request format, the values of the "op" and "search" fields are supplied as URL path components.
They are appended to "/pks/lookup/v1" as follows:</t>

<figure><artwork><![CDATA[
/pks/lookup/v1/<op>/<search>[?...]
]]></artwork></figure>

<t>The "op" and "search" fields <bcp14>MUST</bcp14> be supplied.
Modifier variables are supplied as HTTP query strings, same as in the Legacy request format.</t>

<t>If the v1 request format is being used, machine readable output format (<xref target="output-formats"/>) <bcp14>MUST</bcp14> be returned.
Note that the "stats" operation <bcp14>MUST NOT</bcp14> be used in v1 request format (see <xref target="stats-operation"/>).</t>

<t>The v1 request format is designed so that a basic HKP service can be implemented using static files.</t>

</section>
</section>
<section anchor="op-field"><name>The "op" (operation) Field</name>

<t>The "op" field specifies the operation to be performed on the keyserver.
The "op" field is generally used with the "search" field to specify the keys that should be operated on.</t>

<t>If a particular operation is not supported, the keyserver should return an appropriate HTTP error code such as 501 ("Not Implemented").</t>

<section anchor="get-operation"><name>The "get" operation</name>

<t>A keyserver <bcp14>SHOULD</bcp14> support the "get" operation.</t>

<t>The "get" operation requests keys from the keyserver by textual search.
A string that specifies which key(s) to return is provided in the "search" field.</t>

<t>The response to a successful "get" request is a HTTP document containing an ASCII-armored keyring as specified in <xref target="keyring-format"/>.</t>

<t>The response <bcp14>MAY</bcp14> be wrapped in any HTML or other text desired, except that the actual key data consisting of an initial line break, the "-----BEGIN PGP PUBLIC KEY BLOCK-----" header, the armored key data itself, the "-----END PGP PUBLIC KEY BLOCK-----" header, and a final line break <bcp14>MUST NOT</bcp14> be modified from the form specified in <xref target="I-D.ietf-openpgp-crypto-refresh"></xref>.</t>

<t>If no keys match the request, the keyserver <bcp14>SHOULD</bcp14> return an appropriate HTTP error code such as 404 ("Not Found").</t>

</section>
<section anchor="index-operation"><name>The "index" operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "index" operation.</t>

<t>The "index" operation requests a list of keys on the keyserver that match the text in the "search" field.
Historically, the "index" operation returned a human readable HTML document containing links for each found key, but this is not required.</t>

</section>
<section anchor="vindex-operation"><name>The "vindex" (verbose index) operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "vindex" operation.</t>

<t>The "vindex" operation is similar to "index" in that it provides a list of keys on the keyserver that match the text in the "search" field.
Historically, a "vindex" response was the same as "index" with the addition of showing the signatures on each key, but this is not required.
The "vindex" operation only differs from the "index" operation in Legacy human readable mode, and a server <bcp14>MAY</bcp14> treat the two operations as synonyms.</t>

</section>
<section anchor="stats-operation"><name>The "stats" (statistics/status) operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "stats" operation in Legacy request format.
The "stats" operation is deprecated, and <bcp14>MUST NOT</bcp14> be used in a v1 request.
It is <bcp14>RECOMMENDED</bcp14> to use a URL outside "/pks/lookup" (such as "/pks/stats") instead.</t>

<t>The output of the "stats" operation is implementation-dependent, but may include diagnostic output, configuration state, or other metadata.
The "search" field <bcp14>SHOULD NOT</bcp14> be supplied, and <bcp14>SHOULD</bcp14> be ignored if received.</t>

</section>
<section anchor="vfpget-operation"><name>The "vfpget" (versioned fingerprint get) operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "vfpget" operation.</t>

<t>"vfpget" requests a key from a keyserver by specifying its versioned fingerprint.
The versioned fingerprint is provided in the "search" field in hexadecimal encoding, without a preceding "0x".
The hexadecimal digits are not case sensitive.</t>

<t>A versioned fingerprint consists of one octet of key version number and N octets of fingerprint.
This is the same octet sequence used in the Issuer Fingerprint and Intended Recipient Fingerprint subpackets (<xref target="I-D.ietf-openpgp-crypto-refresh"></xref> section 5.2.3).</t>

</section>
<section anchor="kidget-operation"><name>The "kidget" (keyid get) operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "kidget" operation.</t>

<t>"kidget" requests a key from a keyserver by specifying its key ID (<xref target="I-D.ietf-openpgp-crypto-refresh"></xref> section 5.5.4).
The key ID is provided in the "search" field as 16 hexadecimal digits, without a preceding "0x".
The hexadecimal digits are not case sensitive.</t>

</section>
<section anchor="hget-operation"><name>The "hget" (hash get) operation</name>

<t>A keyserver <bcp14>MAY</bcp14> support the "hget" operation.</t>

<t>"hget" requests a key from a keyserver by specifying its <xref target="SKS"></xref> digest.
The digest is provided in the "search" field in hexadecimal encoding, without a preceding "0x".
The hexadecimal digits are not case sensitive.</t>

</section>
<section anchor="other-operations"><name>Other operations</name>

<t>Other site-specific or nonstandard operations can be indicated by prefixing the operation name with the string "x-".</t>

</section>
</section>
<section anchor="search-field"><name>The "search" field</name>

<t>The "search" field contains arbitrary text encoded as usual for a HTTP URL.
This text may represent the key ID, or fingerprint, or some text from a user ID on the key being sought.</t>

<t>If any particular type of searching is not supported, the keyserver should return an appropriate HTTP error code such as 501 ("Not Implemented").
The server <bcp14>MUST NOT</bcp14> return an error code (such as 404 ("Not Found")) that could be mistaken by the client for a valid response.</t>

<section anchor="searches"><name>Key ID and Fingerprint Searches</name>

<t>To search for a key by its key ID or fingerprint, a client <bcp14>SHOULD</bcp14> use a v1 request and either the "kidget" or "vfpget" operation (as appropriate).</t>

<t>If making a Legacy request, a client <bcp14>SHOULD</bcp14> use the "get" operation and prefix the "search" string with "0x" to indicate a hexadecimal number.
Key ID strings are 16 hexadecimal digits (64 bits).
Fingerprint strings are either 32 (version 3), 40 (version 4), or 64 (version 6) hexadecimal digits.
The hexadecimal digits are not case sensitive.</t>

<t>A keyserver:</t>

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> accept fingerprints and <bcp14>MAY</bcp14> accept 64-bit key IDs in the Legacy request "search" field.</t>
  <t><bcp14>MUST NOT</bcp14> return results for 32-bit "short key ID" searches, as these do not provide sufficient collision resistance.</t>
  <t><bcp14>MUST NOT</bcp14> return v6 keys in the results for Legacy machine readable requests, but <bcp14>MAY</bcp14> do so for Legacy human readable requests (see also <xref target="legacy-mr-indexes"/>).</t>
</list></t>

<t>V3 keys are no longer considered secure, but <bcp14>MAY</bcp14> be distributed for historical reference.</t>

</section>
<section anchor="text-searches"><name>Text Searches</name>

<t>To search for a key by the text of a user ID, a client <bcp14>SHOULD</bcp14> use the "get" or "index" operation (as appropriate) and <bcp14>SHOULD NOT</bcp14> prefix the "search" string with "0x".</t>

<t>A keyserver <bcp14>MUST NOT</bcp14> return v6 keys in the results for Legacy machine readable requests, but <bcp14>MAY</bcp14> do so for Legacy human readable requests (see also <xref target="legacy-mr-indexes"/>).
Otherwise, how a keyserver handles textual search is implementation defined.
See also the definition of the "exact" variable (<xref target="exact-variable"/>) for a method to give additional instructions to the server on how the search is to be executed.</t>

</section>
</section>
<section anchor="lookup-examples"><name>Lookup Examples</name>

<t>Search for all keys containing the string "dshaw", using plaintext HTTP:</t>

<t><list style="symbols">
  <t>Legacy request format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  http://keys.example.com:11371/pks/lookup?search=dshaw&op=index
]]></artwork></figure>
  </t>
  <t>v1 request format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  http://keys.example.com:11371/pks/lookup/v1/index/dshaw
]]></artwork></figure>
  </t>
</list></t>

<t>Get key 0xDEADBEEFDECAFBAD (64-bit key ID), using HTTPS:</t>

<t><list style="symbols">
  <t>Legacy request format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  https://keys.example.com/pks/lookup?op=get&search=0xDEADBEEFDECAFBAD
]]></artwork></figure>
  </t>
  <t>v1 request format:  <vspace blankLines='1'/>
    <figure><artwork><![CDATA[
  https://keys.example.com/pks/lookup/v1/kidget/DEADBEEFDECAFBAD
]]></artwork></figure>
  </t>
</list></t>

</section>
</section>
<section anchor="submitting-keys"><name>Submitting Keys To A Keyserver</name>

<t>A keyserver <bcp14>MAY</bcp14> accept submissions via an HTTP POST request.
Specifically, the abs_path (see <xref target="RFC1945"></xref> section 3.2) is set to "/pks/add", and the key data is provided via HTTP POST as specified in <xref target="RFC1945"></xref> section 8.3, and <xref target="RFC1866"></xref> section 8.2.3.</t>

<t>The body of the POST message contains a "keytext" variable which contains an ASCII-armored keyring as specified in <xref target="keyring-format"/>.
The ASCII armored keyring should also be urlencoded as specified in <xref target="RFC1866"></xref> section 8.2.1.
Note that more than one key may be submitted in a single transaction.</t>

<t>There may also be modifier variables, as specified in <xref target="modifier-variables"/> below.</t>

<t>If a keyserver does not support adding keys via HTTP, then requests to do so should return an appropriate HTTP error code, such as 403 ("Forbidden") if key submission has been disallowed, or 501 ("Not Implemented") if the server does not support HTTP key submission.
The keyserver <bcp14>MUST NOT</bcp14> return an error code (such as 404 ("Not Found")) that could be mistaken by the client for a valid response.</t>

</section>
<section anchor="modifier-variables"><name>Modifier Variables</name>

<t>These variables are used to modify basic requests.</t>

<section anchor="options-variable"><name>The "options" Variable</name>

<t>This variable takes one or more option values, separated by commas.
These are used to modify the behavior of the keyserver on a per-request basis.
Each value indicates a boolean flag, where the presence of the value indicates "true" and the absence "false".</t>

<section anchor="mr-option"><name>The "mr" (Machine Readable) Option</name>

<t>The machine readable option instructs the server that a program (rather than a person) is making the request, so the output <bcp14>SHOULD</bcp14> be in machine readable format.
If the v1 request format (<xref target="v1-request-format"/>) is being used, machine readable output <bcp14>MUST</bcp14> be returned, so this option has no effect.
See <xref target="output-formats"/> for the specific details of machine readable output.</t>

</section>
<section anchor="nm-option"><name>The "nm" (No Modification) Option</name>

<t>As keyservers may modify submitted keys to suit a particular policy, this option is used to inform the keyserver that the submitter would rather have the submission fail completely then have the submitted key(s) modified.
An example of this would be a keyserver that does not accept user IDs with an email address outside of the local domain.
If such a key was submitted, the keyserver <bcp14>MAY</bcp14> trim any noncompliant user IDs before accepting the key.
If this option was set, then such a key submission <bcp14>SHOULD</bcp14> fail with an appropriate error code such as 422 (Unprocessable content).</t>

<t>"nm" is meaningful for submissions only.</t>

</section>
<section anchor="other-options"><name>Other Options</name>

<t>Other site-specific or nonstandard options can be indicated by prefixing the option name with the string "x-".
Non-standard options <bcp14>MUST</bcp14> represent boolean values with a default value of "false".</t>

</section>
</section>
<section anchor="fingerprint-variable"><name>The "fingerprint" Variable</name>

<t>This variable takes one argument: "on" or "off".
If present and on, it instructs the server to provide the key fingerprint for each key in an "index" or "vindex" operation.
This variable has no effect on any other operation.
The exact format of the displayed fingerprint, like the "index" and "vindex" operations themselves, is implementation defined in Legacy human readable output.
In machine readable indexes, a value of "on" indicates that the "keyid" field <bcp14>SHOULD</bcp14> contain the fingerprint, except for v3 keys (see <xref target="mr-indexes"/>).
An implementation <bcp14>SHOULD</bcp14> treat this variable as being "on" for all machine readable indexes.
An implementation <bcp14>MAY</bcp14> decide to ignore this variable and/or set the default behaviour to "on" for Legacy human readable indexes.</t>

<t>"fingerprint" is meaningful for lookups only.</t>

</section>
<section anchor="hash-variable"><name>The "hash" Variable</name>

<t>This variable takes one argument: "on" or "off".
If present and on, it instructs the server to provide the <xref target="SKS"></xref> digest of each key in an "index" or "vindex" operation in the Legacy human readable output format.
This variable has no effect on any other operation, or on machine readable output.
The exact format of the displayed digest, like the "index" and "vindex" operations themselves, is implementation defined.
An implementation <bcp14>MAY</bcp14> decide to ignore this variable and/or set the default behaviour to "on".</t>

<t>"hash" is meaningful for lookups only.</t>

</section>
<section anchor="exact-variable"><name>The "exact" Variable</name>

<t>This variable takes one argument: "on" or "off".
If set to "on", it instructs the server to search for an exact match for the contents of the "search" field.
An implementation <bcp14>SHOULD</bcp14> set the default behaviour to "on" and <bcp14>MAY</bcp14> ignore this variable.</t>

<t>When "exact" is set to "on", a keyserver <bcp14>SHOULD</bcp14> only return results if the "search" field exactly matches one of the following:</t>

<t><list style="symbols">
  <t>The full text string of a User ID.</t>
  <t>The portion between angle brackets ("&lt;(.*)&gt;") in an email-address style User ID.</t>
</list></t>

<t>In either case, the string matching <bcp14>SHOULD NOT</bcp14> be case sensitive.</t>

<t>"exact" is meaningful for lookups only.</t>

</section>
<section anchor="other-variables"><name>Other Variables</name>

<t>Other site-specific or nonstandard variables can be indicated by prefixing the variable name with the string "x-".</t>

</section>
</section>
<section anchor="output-formats"><name>Output Formats</name>

<t>HKP was originally intended for both human and programmatic use.
In general, the Legacy human readable output is implementation specific.
The "machine readable" option is used to tailor the output of Legacy requests for automated use.
By contrast, the v1 request format <bcp14>MUST</bcp14> return machine readable output.
For interoperability, the machine readable output <bcp14>MUST</bcp14> carefully follow the guidelines given here.</t>

<t>A client implementation <bcp14>SHOULD</bcp14> request machine readable output and <bcp14>SHOULD NOT</bcp14> attempt to parse human readable output.</t>

<section anchor="mr-output"><name>Machine Readable Output</name>

<t>Clients requesting machine readable output:</t>

<t><list style="symbols">
  <t><bcp14>SHOULD</bcp14> use the v1 request format, or else supply "options=mr" (<xref target="mr-option"/>) in a Legacy request.</t>
  <t><bcp14>MUST</bcp14> silently ignore any content preceding or following a returned armored key block.</t>
  <t><bcp14>MUST</bcp14> silently ignore any keys with unknown versions or algorithms.</t>
</list></t>

<t>Keyservers returning machine readable output:</t>

<t><list style="symbols">
  <t><bcp14>MUST</bcp14> set the HTTP header "Access-Control-Allow-Origin: *", as specified in <xref target="CORS"></xref>.</t>
  <t><bcp14>MUST</bcp14> set "Content-Type: application/pgp-keys" when returning keys (the "get", "vfpget", "kidget", and "hget" operations), as specified in <xref target="RFC3156"></xref> section 7.</t>
  <t><bcp14>MUST</bcp14> use the format specified in <xref target="mr-indexes"/> when returning indexes (the "index" and "vindex" operations).</t>
  <t><bcp14>MAY</bcp14> return statistics in JSON format <xref target="RFC8259"></xref>, the schema of which is otherwise implementation-dependent.</t>
</list></t>

</section>
<section anchor="mr-indexes"><name>Machine Readable Indexes</name>

<t>The machine readable index format is a list of newline-separated records.
The document is 7-bit clean, and as such is sent with no encoding and Content-Type: text/plain.</t>

<t>The machine readable response <bcp14>MAY</bcp14> be prefixed by an information record:</t>

<figure><artwork><![CDATA[
info:<version>:<count>
]]></artwork></figure>

<texttable title="Information Record Fields" anchor="information-record-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>version</c>
      <c>the version of this output format</c>
      <c>count</c>
      <c>the number of keys returned</c>
</texttable>

<t>If this line is not included, or the version information is not supplied, the version number is assumed to be 1.
Currently, only version 1 is defined.</t>

<t>Note that "count" is the number of keys, and not the number of lines returned.
That is, it <bcp14>SHOULD</bcp14> match the number of "pub:" lines returned.</t>

<t>The key listings themselves are made up of several records per key.
The first record specifies the primary key:</t>

<figure><artwork><![CDATA[
pub:<keyid>:<algorithm>:<keylen>:<creationdate>:<expirationdate>:<flags>:<version>
]]></artwork></figure>

<texttable title="Public Key Record Fields" anchor="public-key-record-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>keyid</c>
      <c>the fingerprint or the key ID</c>
      <c>algorithm</c>
      <c>the algorithm ID</c>
      <c>keylen</c>
      <c>the key length in bits</c>
      <c>creationdate</c>
      <c>creation date of the key</c>
      <c>expirationdate</c>
      <c>expiration date of the key</c>
      <c>flags</c>
      <c>letter codes to indicate details of the key</c>
      <c>version</c>
      <c>the version of the key</c>
</texttable>

<t>Since it is not possible to calculate the key ID from a V3 key fingerprint, for V3 keys the "keyid" field <bcp14>SHOULD</bcp14> contain the 16-digit key ID only.
Otherwise, a keyserver <bcp14>SHOULD</bcp14> return a fingerprint if available (see <xref target="fingerprint-variable"/>).</t>

<t>The algorithm ID is as specified in <xref target="I-D.ietf-openpgp-crypto-refresh"></xref> section 9.1, i.e.
1==RSA, 17==DSA, etc.</t>

<t>Following the "pub" record are one or more "uid" records to indicate user IDs on the key:</t>

<figure><artwork><![CDATA[
uid:<uidstring>:<creationdate>:<expirationdate>:<flags>
]]></artwork></figure>

<texttable title="User ID Record Fields" anchor="user-id-record-fields">
      <ttcol align='left'>Field</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>uidstring</c>
      <c>the user ID string</c>
      <c>creationdate</c>
      <c>creation date of the User ID</c>
      <c>expirationdate</c>
      <c>expiration date of the User ID</c>
      <c>flags</c>
      <c>letter codes to indicate details of the User ID</c>
</texttable>

<t>The user ID string <bcp14>MUST</bcp14> use HTTP % encoding for anything that isn't 7-bit safe as well as for the ":" and "%" characters.
Any other characters <bcp14>MAY</bcp14> be HTTP encoded, as desired.</t>

<t>The information for the "creationdate", "expirationdate", and "flags" fields is taken from the User ID self-signature, if any, and applies to the user ID in question, not to the key as a whole.</t>

<t>Primary key and User ID records may contain a "flags" field containing a sequence of alphabetical characters, one per flag.
Flags <bcp14>MAY</bcp14> be given in any order.
The meaning of "disabled" is implementation-specific.
Note that individual flags may be unimplemented, so the absence of a given flag does not necessarily mean the absence of the detail.
Client implementations <bcp14>MUST</bcp14> ignore unknown flags.</t>

<texttable title="Record Flags" anchor="record-flags">
      <ttcol align='left'>Flag</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c><spanx style="verb">r</spanx></c>
      <c>revoked</c>
      <c><spanx style="verb">d</spanx></c>
      <c>disabled</c>
      <c><spanx style="verb">e</spanx></c>
      <c>expired</c>
</texttable>

<t>Note that empty fields are allowed.
For example, a key with no expiration date would have the "expirationdate" field empty.
Also, a keyserver that does not track a particular piece of information may leave that field empty as well.
Colons for empty fields on the end of each line <bcp14>MAY</bcp14> be left off, if desired.
Client implementations <bcp14>MUST</bcp14> ignore unknown trailing fields.
All dates are given in the number of seconds since midnight 1/1/1970 UTC.</t>

<section anchor="legacy-mr-indexes"><name>Legacy Machine Readable Indexes</name>

<t>For backwards compatibility with the installed client base, Legacy machine readable requests <bcp14>SHOULD</bcp14> return a restricted index format:</t>

<t><list style="symbols">
  <t>The "version" field and its preceding colon <bcp14>SHOULD</bcp14> be omitted.</t>
  <t>Version 6 (and later) keys <bcp14>SHOULD</bcp14> be omitted.</t>
</list></t>

</section>
</section>
</section>
<section anchor="keyring-format"><name>Keyring Format</name>

<t>HKP uses an ASCII-armored keyring as its primary data representation for both input and output.</t>

<t>A keyring is a sequence of one or more OpenPGP Transferable Public Keys, concatenated directly, as specified in <xref target="I-D.ietf-openpgp-crypto-refresh"></xref> sections 10.1 and 3.6.
An ASCII-armored keyring is a keyring that has been encoded as a single armored block, as specified in <xref target="I-D.ietf-openpgp-crypto-refresh"></xref> section 6.2.</t>

<section anchor="detached-revocations"><name>Detached Revocations</name>

<t>For OpenPGP keys prior to v6, revocation signatures have customarily been distributed as a detached "revocation certificate", as per <xref target="I-D.ietf-openpgp-crypto-refresh"></xref> section 10.1.3.
An HKP server <bcp14>SHOULD</bcp14> allow submission of these detached revocations.</t>

<t>An HKP implementation <bcp14>MAY</bcp14> accept or serve an ASCII-armored "mixed keyring" where one or more revoked transferable public keys have been replaced by their detached revocation certificate(s).
Such a "mixed keyring" <bcp14>MUST</bcp14> be sorted so that all detached revocation certificates appear first.
This ensures that detached revocations cannot be mistaken for signatures over another key.</t>

</section>
</section>
<section anchor="locating-keyserver"><name>Locating a HKP Keyserver</name>

<t>Clients are usually manually configured with the address of a HKP keyserver.
Client implementations should be aware that it is reasonably common practice to use a single name in DNS that resolves to multiple address records.
When receiving a DNS response with multiple addresses, clients <bcp14>SHOULD</bcp14> try each address until a server is reached.
The order to try these addresses in is implementation defined.</t>

<t>A far more flexible scheme for listing multiple HKP keyservers in DNS is the use of DNS SRV records as specified in <xref target="RFC2782"></xref>.
DNS SRV allows for different priorities and weights to be applied to each HKP keyserver in the list, which allows an administrator much more control over how clients will contact the servers.
The SRV symbolic service name for HKP keyservers is "hkp" when used over plaintext HTTP, or "hkps" when using HTTPS.
For example, the SRV record for HKP keyservers in domain "example.com" would be "_hkp._tcp.example.com".</t>

<t>SRV records contain the port that the target server runs on, so SRV can also be used to automatically discover the proper port for contacting a HKP keyserver.
HKP clients <bcp14>SHOULD</bcp14> support SRV records.</t>

</section>
<section anchor="key-discovery"><name>Key Discovery</name>

<t>Well-known URIs (<xref target="RFC8615"></xref>) are commonly used by clients to discover the location of internet services.
We can use the "openpgpkey" well-known base path to locate an HKPS service for key discovery.
This is done by serving an "hkps" discovery file that redirects a client to an authoritative HKPS service for the domain in question.</t>

<section anchor="openpgpkey-well-known-base-path"><name>The "openpgpkey" Well-Known Base Path</name>

<t><xref target="I-D.koch-openpgp-webkey-service"></xref> defines the well-known "openpgpkey" base path for a given domain as:</t>

<figure><artwork><![CDATA[
https://openpgpkey.<domain>/.well-known/openpgpkey/<domain>/
]]></artwork></figure>

<t>The "hkps" discovery file is placed under this directory, which is shared with other discovery methods such as WKD.
The domain is repeated in a trailing path component in order to simplify serving multiple discovery files from a single host.</t>

<t>Some web hosting providers automatically return a zero length file successfully when a nonexistent file is requested, therefore:</t>

<t><list style="symbols">
  <t>If the file "&lt;base-path&gt;/hkps" exists, and is of non-zero size, it <bcp14>SHOULD</bcp14> be used.</t>
  <t>If the file "&lt;base-path&gt;/hkps" does not exist, or is of zero size, then it <bcp14>MUST</bcp14> be ignored, and a client <bcp14>MAY</bcp14> fall back to other key discovery methods.</t>
</list></t>

<t>Requests for the discovery file <bcp14>MUST</bcp14> be made over HTTPS.
The alternative "direct" well-known base path from <xref target="I-D.koch-openpgp-webkey-service"></xref> <bcp14>MUST NOT</bcp14> be used for HKPS discovery.</t>

</section>
<section anchor="hkps-discovery-file"><name>The "hkps" Discovery File</name>

<t>The discovery file contains a sequence of lines containing keywords and one or more values, separated by colons.
Blank lines and comment lines beginning with "#" <bcp14>MUST</bcp14> be ignored.</t>

<t>The following keywords are defined:</t>

<figure><artwork><![CDATA[
version:<version>
server:<hostname>[:<port>[:<options>]]
]]></artwork></figure>

<t>If "port" is not given, it defaults to 443.
"options" is a colon-separated list of options.
No options are currently defined, and unknown options <bcp14>MUST</bcp14> be ignored.
Unknown keywords <bcp14>MUST</bcp14> be ignored.</t>

<t>The discovery file is parsed by a client as follows:</t>

<t><list style="symbols">
  <t>If a "version" line does not exist, a client <bcp14>MUST NOT</bcp14> continue with HKPS discovery, and <bcp14>MAY</bcp14> fall back to other discovery methods.</t>
  <t>If a "version" line exists but a "server" line does not, then the HKP service is located on the same hostname as the discovery file.</t>
  <t>If more than one "server" line exists, a client <bcp14>SHOULD</bcp14> try them in the given order, returning after the first successful response; a 404 ("Not Found") or 410 ("Gone") response in this context counts as a success.</t>
</list></t>

<t>Thus a minimal HKPS discovery file will contain just "version:1".</t>

<t>In addition:</t>

<t><list style="symbols">
  <t>Only HKPS version 1 is supported in the discovery file, and clients <bcp14>MUST</bcp14> use the v1 request format and HTTPS for HKPS key discovery.</t>
  <t>If a client wishes to receive v6 or higher keys it <bcp14>SHOULD</bcp14> make an HKPS discovery request.</t>
  <t>If a server wishes to serve v6 or higher keys it <bcp14>SHOULD NOT</bcp14> do so over WKD, for compatibility with clients that do not support v6 keys.</t>
</list></t>

</section>
<section anchor="key-discovery-example"><name>Key Discovery Example</name>

<t>For example, a client trying to locate a key for isabella@silvie.example.com could consult:</t>

<figure><artwork><![CDATA[
https://openpgpkey.silvie.example.com/.well-known/openpgpkey/silvie.example.com/hkps
]]></artwork></figure>

<t>This discovery file might contain the following lines:</t>

<figure><artwork><![CDATA[
version:1
server:keyserver.example.com
]]></artwork></figure>

<t>On finding this file, a client <bcp14>SHOULD</bcp14> make a GET request for the following URL:</t>

<figure><artwork><![CDATA[
hkps://keyserver.example.com:443/pks/lookup/v1/get/isabella@silvie.example.com
]]></artwork></figure>

<t>The domain owner <bcp14>MUST</bcp14> ensure that any keys returned from this keyserver are valid keys for the identity in the search field.
This <bcp14>MAY</bcp14> be achieved at low cost by serving the keys from a static filesystem.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>As described here, a keyserver is a searchable database of public keys accessed over the network.
While there may be security considerations arising from distributing arbitrary keys in this manner, this does not impact the security of OpenPGP itself.</t>

<t>Without some sort of trust relationship between the client and server, information returned from a keyserver in arbitrary search results cannot be trusted by the client until the OpenPGP client actually retrieves and checks the key for itself.
This is important and must be stressed: without a specific reason to treat information otherwise, all search results must be regarded as untrustworthy and informational only.</t>

<t>The sole exception to the above is if the openpgp key discovery method has been used, and all requests in the chain of indirection have been made over HTTPS/HKPS.
In such a scenario, a client <bcp14>MAY</bcp14> assume that any keys returned are authoritative for the requested identity.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document allocates the ports 11371 and 11372, the URI schemes "hkp" and "hkps", and the well-known URI suffix "openpgpkey".</t>

<section anchor="updated-registry-entries"><name>Updated Registry Entries</name>

<t>IANA is requested to update the contact details for port 11371 in the "Service Name and Transport Protocol Port Number" registry to "Daphne Shaw".</t>

</section>
<section anchor="new-registry-entries"><name>New Registry Entries</name>

<t>IANA is requested to add the following entry to the "Service Name and Transport Protocol Port Number" registry as per <xref target="RFC6335"></xref>:</t>

<texttable title="Service Name and Transport Protocol Port Number Registry" anchor="service-name-port-registry">
      <ttcol align='left'>Service Name</ttcol>
      <ttcol align='left'>Port</ttcol>
      <ttcol align='left'>Transport Protocol</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Contact</ttcol>
      <c>hkps</c>
      <c>11372</c>
      <c>tcp and udp</c>
      <c>OpenPGP HTTP Keyserver (Secure)</c>
      <c>Daphne Shaw</c>
</texttable>

<t>IANA is requested to add the following entries to the "URI Schemes" registry as per <xref target="RFC7595"></xref>:</t>

<texttable title="Uniform Resource Identifier (URI) Schemes Registry" anchor="uri-schemes-registry">
      <ttcol align='left'>URI Scheme</ttcol>
      <ttcol align='left'>Description</ttcol>
      <ttcol align='left'>Status</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>hkp</c>
      <c>OpenPGP HTTP Keyserver</c>
      <c>Permanent</c>
      <c>This document</c>
      <c>hkps</c>
      <c>OpenPGP HTTP Keyserver (Secure)</c>
      <c>Permanent</c>
      <c>This document</c>
</texttable>

<t>IANA is requested to add the following entry to the "Well-Known URIs" registry as per <xref target="RFC8615"></xref>:</t>

<texttable title="Well-Known URIs Registry" anchor="well-known-uris-registry">
      <ttcol align='left'>URI Suffix</ttcol>
      <ttcol align='left'>Change Controller</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <ttcol align='left'>Status</ttcol>
      <ttcol align='left'>Related Information</ttcol>
      <c>openpgpkey</c>
      <c>OpenPGP WG</c>
      <c>This document</c>
      <c>permanent</c>
      <c>[I-D.koch-webkey-service]</c>
</texttable>

</section>
</section>


  </middle>

  <back>


    <references title='Normative References' anchor="sec-normative-references">



<reference anchor="RFC1945">
  <front>
    <title>Hypertext Transfer Protocol -- HTTP/1.0</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="R. Fielding" initials="R." surname="Fielding"/>
    <author fullname="H. Frystyk" initials="H." surname="Frystyk"/>
    <date month="May" year="1996"/>
    <abstract>
      <t>The Hypertext Transfer Protocol (HTTP) is an application-level protocol with the lightness and speed necessary for distributed, collaborative, hypermedia information systems. This memo provides information for the Internet community. This memo does not specify an Internet standard of any kind.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1945"/>
  <seriesInfo name="DOI" value="10.17487/RFC1945"/>
</reference>

<reference anchor="RFC1866">
  <front>
    <title>Hypertext Markup Language - 2.0</title>
    <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
    <author fullname="D. Connolly" initials="D." surname="Connolly"/>
    <date month="November" year="1995"/>
    <abstract>
      <t>This document defines a HTML 2.0 (to distinguish it from the previous informal specifications). [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="1866"/>
  <seriesInfo name="DOI" value="10.17487/RFC1866"/>
</reference>

<reference anchor="RFC2782">
  <front>
    <title>A DNS RR for specifying the location of services (DNS SRV)</title>
    <author fullname="A. Gulbrandsen" initials="A." surname="Gulbrandsen"/>
    <author fullname="P. Vixie" initials="P." surname="Vixie"/>
    <author fullname="L. Esibov" initials="L." surname="Esibov"/>
    <date month="February" year="2000"/>
    <abstract>
      <t>This document describes a DNS RR which specifies the location of the server(s) for a specific protocol and domain. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="2782"/>
  <seriesInfo name="DOI" value="10.17487/RFC2782"/>
</reference>

<reference anchor="RFC3156">
  <front>
    <title>MIME Security with OpenPGP</title>
    <author fullname="M. Elkins" initials="M." surname="Elkins"/>
    <author fullname="D. Del Torto" initials="D." surname="Del Torto"/>
    <author fullname="R. Levien" initials="R." surname="Levien"/>
    <author fullname="T. Roessler" initials="T." surname="Roessler"/>
    <date month="August" year="2001"/>
    <abstract>
      <t>This document describes how the OpenPGP Message Format can be used to provide privacy and authentication using the Multipurpose Internet Mail Extensions (MIME) security content types described in RFC 1847. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="3156"/>
  <seriesInfo name="DOI" value="10.17487/RFC3156"/>
</reference>

<reference anchor="RFC7595">
  <front>
    <title>Guidelines and Registration Procedures for URI Schemes</title>
    <author fullname="D. Thaler" initials="D." role="editor" surname="Thaler"/>
    <author fullname="T. Hansen" initials="T." surname="Hansen"/>
    <author fullname="T. Hardie" initials="T." surname="Hardie"/>
    <date month="June" year="2015"/>
    <abstract>
      <t>This document updates the guidelines and recommendations, as well as the IANA registration processes, for the definition of Uniform Resource Identifier (URI) schemes. It obsoletes RFC 4395.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="35"/>
  <seriesInfo name="RFC" value="7595"/>
  <seriesInfo name="DOI" value="10.17487/RFC7595"/>
</reference>

<reference anchor="RFC8615">
  <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>

<reference anchor="RFC9110">
  <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="I-D.ietf-openpgp-crypto-refresh">
   <front>
      <title>OpenPGP</title>
      <author fullname="Paul Wouters" initials="P." surname="Wouters">
         <organization>Aiven</organization>
      </author>
      <author fullname="Daniel Huigens" initials="D." surname="Huigens">
         <organization>Proton AG</organization>
      </author>
      <author fullname="Justus Winter" initials="J." surname="Winter">
         <organization>Sequoia-PGP</organization>
      </author>
      <author fullname="Niibe Yutaka" initials="N." surname="Yutaka">
         <organization>FSIJ</organization>
      </author>
      <date day="4" month="January" year="2024"/>
      <abstract>
	 <t>   This document specifies the message formats used in OpenPGP.  OpenPGP
   provides encryption with public-key or symmetric cryptographic
   algorithms, digital signatures, compression and key management.

   This document is maintained in order to publish all necessary
   information needed to develop interoperable applications based on the
   OpenPGP format.  It is not a step-by-step cookbook for writing an
   application.  It describes only the format and methods needed to
   read, check, generate, and write conforming packets crossing any
   network.  It does not deal with storage and implementation questions.
   It does, however, discuss implementation issues necessary to avoid
   security flaws.

   This document obsoletes: RFC 4880 (OpenPGP), RFC 5581 (Camellia in
   OpenPGP) and RFC 6637 (Elliptic Curves in OpenPGP).

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-openpgp-crypto-refresh-13"/>
   
</reference>


<reference anchor="CORS" target="https://fetch.spec.whatwg.org/#cors-protocol">
  <front>
    <title>Cross Origin Resource Sharing</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </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 title='Informative References' anchor="sec-informative-references">



<reference anchor="RFC6335">
  <front>
    <title>Internet Assigned Numbers Authority (IANA) Procedures for the Management of the Service Name and Transport Protocol Port Number Registry</title>
    <author fullname="M. Cotton" initials="M." surname="Cotton"/>
    <author fullname="L. Eggert" initials="L." surname="Eggert"/>
    <author fullname="J. Touch" initials="J." surname="Touch"/>
    <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
    <author fullname="S. Cheshire" initials="S." surname="Cheshire"/>
    <date month="August" year="2011"/>
    <abstract>
      <t>This document defines the procedures that the Internet Assigned Numbers Authority (IANA) uses when handling assignment and other requests related to the Service Name and Transport Protocol Port Number registry. It also discusses the rationale and principles behind these procedures and how they facilitate the long-term sustainability of the registry.</t>
      <t>This document updates IANA's procedures by obsoleting the previous UDP and TCP port assignment procedures defined in Sections 8 and 9.1 of the IANA Allocation Guidelines, and it updates the IANA service name and port assignment procedures for UDP-Lite, the Datagram Congestion Control Protocol (DCCP), and the Stream Control Transmission Protocol (SCTP). It also updates the DNS SRV specification to clarify what a service name is and how it is registered. This memo documents an Internet Best Current Practice.</t>
    </abstract>
  </front>
  <seriesInfo name="BCP" value="165"/>
  <seriesInfo name="RFC" value="6335"/>
  <seriesInfo name="DOI" value="10.17487/RFC6335"/>
</reference>

<reference anchor="RFC8259">
  <front>
    <title>The JavaScript Object Notation (JSON) Data Interchange Format</title>
    <author fullname="T. Bray" initials="T." role="editor" surname="Bray"/>
    <date month="December" year="2017"/>
    <abstract>
      <t>JavaScript Object Notation (JSON) is a lightweight, text-based, language-independent data interchange format. It was derived from the ECMAScript Programming Language Standard. JSON defines a small set of formatting rules for the portable representation of structured data.</t>
      <t>This document removes inconsistencies with other specifications of JSON, repairs specification errors, and offers experience-based interoperability guidance.</t>
    </abstract>
  </front>
  <seriesInfo name="STD" value="90"/>
  <seriesInfo name="RFC" value="8259"/>
  <seriesInfo name="DOI" value="10.17487/RFC8259"/>
</reference>


<reference anchor="SKS" target="https://github.com/sks-keyserver/sks-keyserver/wiki">
  <front>
    <title>Synchronising Key Server Wiki</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>
<reference anchor="TOR" target="https://spec.torproject.org/">
  <front>
    <title>Tor Specifications</title>
    <author >
      <organization></organization>
    </author>
    <date year="n.d."/>
  </front>
</reference>



<reference anchor="I-D.koch-openpgp-webkey-service">
   <front>
      <title>OpenPGP Web Key Directory</title>
      <author fullname="Werner Koch" initials="W." surname="Koch">
         <organization>g10 Code GmbH</organization>
      </author>
      <date day="10" month="June" year="2024"/>
      <abstract>
	 <t>   This specification describes a service to locate OpenPGP keys by mail
   address using a Web service and the HTTPS protocol.  It also provides
   a method for secure communication between the key owner and the mail
   provider to publish and revoke the public key.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-koch-openpgp-webkey-service-18"/>
   
</reference>




    </references>


<?line 675?>

<section anchor="acknowledgments"><name>Acknowledgments</name>

<t>This document is a formalization and extension of HKP, originally implemented in the PKS keyserver by Marc Horowitz, which in turn was based on earlier work by Brian LaMacchia and Michael Graff.
Without their grounding, this document would not exist.</t>

<t>The openpgpkey discovery file is based on existing work by Werner Koch, without whom the key discovery method would not exist in its current form.</t>

<t>The authors would like to thank Peter Gutmann for his work on the Certstore protocol, some of which was applicable here, and the members of the pgp-keyserver-folk mailing list who contributed valuable comments and suggestions.
They would also like to thank Bart Butler, Daniel Huigens, Daniel Kahn Gillmor, and Justus Winter for help with the v1 request format and discovery file specifications.</t>

</section>
<section anchor="document-history"><name>Document History</name>

<t>Note to RFC Editor: this section should be removed before publication.</t>

<section anchor="changes-between-04-and-05"><name>Changes Between -04 and -05</name>

<t><list style="symbols">
  <t>Allow detached revocations in keyrings.</t>
  <t>Redesigned v1 request format to use path components for required fields.</t>
  <t>Added openpgpkey discovery file.</t>
  <t>Added "vfpget" and "kidget" operations.</t>
  <t>Added meaningful "exact" semantics.</t>
  <t>HKPS is now <bcp14>SHOULD</bcp14>.</t>
  <t>Defined port 11372.</t>
  <t>IANA registry tables.</t>
  <t>Deprecated <spanx style="verb">op=stats</spanx>.</t>
</list></t>

</section>
<section anchor="changes-between-03-and-04"><name>Changes Between -03 and -04</name>

<t><list style="symbols">
  <t>Reworded <xref target="key-lookups"/> for clarity.</t>
  <t>Separate section for keyring format.</t>
  <t>Specify detached revocations.</t>
  <t>Updated references.</t>
</list></t>

</section>
<section anchor="changes-between-02-and-03"><name>Changes Between -02 and -03</name>

<t><list style="symbols">
  <t>Clients <bcp14>SHOULD</bcp14> supply the <spanx style="verb">v=1</spanx> api-versioning variable.</t>
  <t>Machine-readable output includes key version field.</t>
  <t>Clients <bcp14>MUST</bcp14> silently ignore leading and trailing cruft, trailing unknown fields, and unknown flags.</t>
  <t>Clients <bcp14>MUST</bcp14> silently ignore keys with unknown versions or algorithms.</t>
  <t>All other m-r index specs (CORS, Content-Type etc.) are now <bcp14>MUST</bcp14>.</t>
  <t>Included the <spanx style="verb">hash</spanx> variable from SKS.</t>
</list></t>

</section>
<section anchor="changes-between-01-and-02"><name>Changes Between -01 and -02</name>

<t><list style="symbols">
  <t>Tightened up BCP-14 language.</t>
  <t>Included <spanx style="verb">op=hget</spanx> from SKS.</t>
  <t>Options now strictly boolean with default false, variables less strict.</t>
  <t>More detail about HTTP status code usage.</t>
</list></t>

</section>
<section anchor="changes-between-00-and-01"><name>Changes Between -00 and -01</name>

<t><list style="symbols">
  <t>Improved text structure.</t>
  <t>Added references to HTTPS/HKPS, and hkp:/hkps: URL schemes.</t>
  <t>Forbade short IDs and deprecated V3 keys.</t>
  <t>Included <spanx style="verb">op=stats</spanx> from SKS.</t>
  <t>Mentioned CORS.</t>
  <t>Made use of terminology more consistent.</t>
  <t>Replaced custom status codes with standard HTTP status codes.</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
HFK9zJeQDXc84aIfpfgLWfjmju8gv4900pz9QO+9UOP+7JiWbBA/tFwmrk+5
dg7YH0OBByddzOKhqTjB0UO0x+QJcYtuyEpmjLmhtAkrjeJaYdmPXAliPONu
y4ks7yXwigkw7joZc6I7j6XJKcssOH7vws02VM4uKJkO3vJRxMxwsKxI4N1C
+KjxljjkgNsDtX436piEFVqsPchTG4QsxLIOAfY9yzHw9StDrY1NbDCHzi/F
L6DDwlznV6RJ/jLmrxaInV8Mf2fchKLp4QZPwDqsZaEZKuLYcLUFNRRqLYEG
e5CwrIvpNmnAegsxFBFgWua9GwK4qDZ/1QhVJ0bAHlIgNpiMlmtdSDCGZQe0
NXmKreAAWbhQFQYGkQL1+LPOrQiamgmsqAnTn+MB37DPtIaECxHaskhklTOo
BMaOAOoKL0lGghjO2QLL5sk4Q1GnaH+P/vfj9/ejD5cn9eI3NxiPm9mvdyzr
s6Waz23JuhtqBgl7rqnPaoE3U507uKtalTtCxeXWysArM8LmBSkhuYTg4Sr+
m024j3bwHnStYlcUqJb2HT5rwULG1YNppNGJ65MLzN2UiycTFDbKGYYuzuyl
AvtIk8w63pw37dh1lJQNJhqqMrYUvr0HgaHs7YOSj5hCtmZs1kvVPT4d/Xs1
sTLavz+QWs6Hg0cciWgHQKLHwXyFCpfaFuQVugxA+zp7zv6F+UWPUCkLzpJT
4rh8w8A58bmRO8U11sf9wj9WdA8vFsDO5Rw1uX7Ui3zb8Cg487DRsoSrmJm/
TdxzOf28Qjti1A26GaFmMWfsGPG6QfzdfZXYBKSVEvhtERmvvTNXDhNBRAaV
xk8lWDywTXppidFpggzH4Qqkmje3uztnx4xudFcT0kIcVTEjOZ4WR8NbIXyh
QCKQNB65yoxJ0TbhEHQ78MNdSPJLcyaunBEfEfO1d8Bcb+61tNWy2ejXWKzJ
St50kT8tcEToRYtMulRIzo4Jagdc81le0SjZtcBFCaUQNc7bvXpfy59uqVHt
/eeSaLjkuMs8zuSDPVEe1uRxaUwTHcL1tlVM+fI88Sq2FR/FfpVKubSJa1uy
N6xILOfGlKY5wETEe/r2QnqgaeTseUFu5DKtEqRr2ek5n+PP4pXFcXUBC973
NRywrObLiD+P6nV4K+K6LKtt/8usQk6XpRVZCjZR9ElWLVkdLtZKLa5zLOKG
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
+38CVZ5AUpEAAA==

-->

</rfc>

