<?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-06" 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="December" day="31"/>

    <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 (<xref section="3.2" sectionFormat="of" target="RFC1945"/>) 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 section="8.2.2" sectionFormat="of" target="RFC1866"/>.
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="RFC9580"></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 section="5.2.3" sectionFormat="of" target="RFC9580"/>).</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 section="5.5.4" sectionFormat="of" target="RFC9580"/>).
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 (<xref section="3.2" sectionFormat="of" target="RFC1945"/>) is set to "/pks/add", and the key data is provided via HTTP POST as specified in <xref section="8.3" sectionFormat="of" target="RFC1945"/>, and <xref section="8.2.3" sectionFormat="of" target="RFC1866"/>.</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 section="8.2.1" sectionFormat="of" target="RFC1866"/>.
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 section="7" sectionFormat="of" target="RFC3156"/>.</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 section="9.1" sectionFormat="of" target="RFC9580"/>, 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 Sections <xref target="RFC9580" section="10.1" sectionFormat="bare"/> and <xref target="RFC9580" section="3.6" sectionFormat="bare"/> of <xref target="RFC9580"/>.
An ASCII-armored keyring is a keyring that has been encoded as a single armored block, as specified in <xref section="6.2" sectionFormat="of" target="RFC9580"/>.</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 section="10.1.3" sectionFormat="of" target="RFC9580"/>.
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><xref target="I-D.koch-openpgp-webkey-service"></xref></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="RFC9580">
  <front>
    <title>OpenPGP</title>
    <author fullname="P. Wouters" initials="P." role="editor" surname="Wouters"/>
    <author fullname="D. Huigens" initials="D." surname="Huigens"/>
    <author fullname="J. Winter" initials="J." surname="Winter"/>
    <author fullname="Y. Niibe" initials="Y." surname="Niibe"/>
    <date month="July" 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.</t>
      <t>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.</t>
      <t>This document obsoletes RFCs 4880 ("OpenPGP Message Format"), 5581 ("The Camellia Cipher in OpenPGP"), and 6637 ("Elliptic Curve Cryptography (ECC) in OpenPGP").</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9580"/>
  <seriesInfo name="DOI" value="10.17487/RFC9580"/>
</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="5" month="December" 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-19"/>
   
</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-draft-gallagher-openpgp-hkp-05-and-draft-gallagher-openpgp-hkp-06"><name>Changes Between draft-gallagher-openpgp-hkp-05 and draft-gallagher-openpgp-hkp-06</name>

<t><list style="symbols">
  <t>Updated references.</t>
</list></t>

</section>
<section anchor="changes-between-draft-gallagher-openpgp-hkp-04-and-draft-gallagher-openpgp-hkp-05"><name>Changes Between draft-gallagher-openpgp-hkp-04 and draft-gallagher-openpgp-hkp-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-draft-gallagher-openpgp-hkp-03-and-draft-gallagher-openpgp-hkp-04"><name>Changes Between draft-gallagher-openpgp-hkp-03 and draft-gallagher-openpgp-hkp-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-draft-gallagher-openpgp-hkp-02-and-draft-gallagher-openpgp-hkp-03"><name>Changes Between draft-gallagher-openpgp-hkp-02 and draft-gallagher-openpgp-hkp-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-draft-gallagher-openpgp-hkp-01-and-draft-gallagher-openpgp-hkp-02"><name>Changes Between draft-gallagher-openpgp-hkp-01 and draft-gallagher-openpgp-hkp-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-draft-shaw-openpgp-hkp-00-and-draft-gallagher-openpgp-hkp-01"><name>Changes Between draft-shaw-openpgp-hkp-00 and draft-gallagher-openpgp-hkp-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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
Hxmx1+IaJO22EtRyXkIYtjSvNlQnDpsux9immBQxssMLxSZ61ItmxH2s9RuQ
LiPX0C96K1k2GxIa0qilNqUdJVW4pmcMDabilRBr1KJp37Vko/ZNziyQ+WbA
9QLb1ZnWgIvYVowaG1hOaHG1vxUlNjBM0IF3yykPt0aOljkP/O7Bb0MLYK05
XMPe1X4Xb4tEKDfxgxrsAT/2HGL8xSHG9sk192dAzL6JI7dCb+uMTq6hIoL+
6aQdon7rsU09YtCjGRzvzgeQL6vF0rUmASsPHE8iwWrXYpXphknZgm82YOHU
SZr95tSuQUEGbutiSF0Sh6dVbmJwPZLakKPqpLKRsc1gFsaithOySJVHX7RJ
2edMY1/u5Is+7+fXTlPG+jAsRwm8hGXRR18xY3H814TuhrCGQwLeY1aFGVaO
zzdIPvAx2i41POjcHHWRfMpxWOjZoyXZR9fYHb2GZqA9qmMErrymuyVwjVh3
AAwg8YCcerh3d5U18LKnpuoi6KjT+HKHHgQ7f63vs3IduBcUTxpPvfONQcTa
aX15sFjM52oZp2onwpEnFKcQdbvrdB74qb2vCGFq8ak5eVDfLZ2aszgQThCD
vywny1TnbNGbg7EMV+f1UVWQ5UcWHZ8/PT3tx8U8L8Qm5bluajz6i+W0X5vT
UBVnVYAdjq2Sw04/2k7xy3A6AMisYMv7M9wSntjJwgHcOP4N5Z/mWao6grg/
FKcEhl3E8b0h8ZlLFfLsGHny7MXpG2S8RO/eP3l1+jR6+ewf0ZNXb5++5J+7
atGp3u/XK4MlVWnSSdjfszcnt+mNI0u0M1ltYjU+pTJ87BGGVYoagD9oVsxH
oa4sFxSz9p4z8pv0pKj8bfS04VEMKSkhWfa5Tkv8aCs1hd7pKuhhg5iazz05
xQS6kk1aXvWGPcE44mHBeLSFOH4OXNW99vl4303c9FszvrZRCm3tpfhDDck5
9VzRBK2rXUJi4reUyE0I0yudwg4tZpiXMJLp+24NyFffCOWrbWDe+AEzK5M5
8vFYR9HfGYAQfZXlOP+NGxH7eTmWsdJIuFVE7MScmLL+KswHmQzWGQw5HdMW
Gp4hb8gNW7EFMOwvEps7YOebCENLVPWogS9E2sbygGCjWKEXCK1y349Ykuss
z9bzMsQPVXN2WIko4frZExdZHUWa+swNGLKprGfbtLyL9vZQihaF4ZCjLLNN
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
WM9wYUuSAAA=

-->

</rfc>

