<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version  (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-02" category="info" 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="2023" month="November" day="09"/>

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

    <abstract>


<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>


<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>

</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>By convention and history, HKP uses HTTP on TCP port 11371, and HTTPS on TCP port 443.
These are often distinguished from generic use of HTTP(S) by using the URI schemes "hkp" and "hkps".
For reasons of maximum compatibility with firewalls and filtering HTTP proxies, HKP is also often served over the standard HTTP port (TCP port 80).</t>

<t>(( andrewg : We may wish to officially recommend HKPS.
See issue #7.
))</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, but these are implementation dependent.
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>

<t>(( andrewg : SKS uses "/pks/hashquery" for bulk updates, and hockeypuck also implements "/pks/delete" and "/pks/replace".
See issue #15.
))</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 blacklisting</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 RFC9110.
NB therefore that codes 202, 410, 413, 422 may not have been implemented anywhere yet.
See issue #5.
))</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 any variables.
Variables are passed using HTTP query strings as specified in <xref target="RFC1866"></xref>, section 8.2.2.</t>

<t>Most HKP lookups contain both the "op" (operation) and "search" variables.
The "op" variable determines what operation the keyserver will take, and the "search" variable determines which keys are operated on.
There may also be modifier variables, as specified in <xref target="modifier-variables"/> below.
The variables may be given in any order.
Keyservers <bcp14>MUST</bcp14> ignore any unknown variables.</t>

<section anchor="op-variable"><name>The "op" (operation) Variable</name>

<t>The op variable specifies the operation to be performed on the keyserver.
The op variable is generally used with the "search" variable 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.
A string that specifies which key(s) to return is provided in the "search" variable.</t>

<t>The response to a successful "get" request is a HTTP document containing a keyring as specified in OpenPGP <xref target="RFC4880"></xref>, section 11.1, and ASCII armored as specified in section 6.2.</t>

<t>The response may 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="RFC4880"></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 or key ID in the "search" variable.
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 of key ID in the "search" variable.
Historically, a "vindex" response was the same as "index" with the addition of showing the signatures on each key, but this is not required.</t>

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

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

<t>The output of the "stats" operation is implementation-dependent, but may include diagnostic output, configuration state, or other metadata.
The "search" variable is ignored when supplied with "stats".</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" is used to search for a key by its digest rather than its key ID or fingerprint.</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-variable"><name>The "search" variable</name>

<t>The search variable contains arbitrary text encoded as usual for a HTTP URL.
This text may represent the key ID of the key being sought 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 V4 Fingerprint Searches</name>

<t>If a key is being sought by its key ID, the key ID string is prefixed with an "0x" to indicate a hexadecimal number.
Key ID strings may be 16 digits (64-bit key ID), 32 digits (version 3 fingerprint), or 40 digits (version 4 fingerprint).
The hexadecimal digits are not case sensitive.</t>

<t>A keyserver that allows searching by key ID <bcp14>MUST</bcp14> accept the 160-bit version 4 fingerprint and <bcp14>MAY</bcp14> accept 64-bit key IDs in the "search" variable.
A keyserver <bcp14>MUST NOT</bcp14> return results for 32-bit "short key ID" searches, as these do not provide sufficient collision resistance.</t>

</section>
<section anchor="v3fp-searches"><name>V3 Fingerprint Searches</name>

<t>The 128-bit version 3 fingerprint is represented by a leading "0x", followed by 32 case-insensitive hexadecimal digits.
Note that v3 fingerprints are treated differently and not grouped with key ID or v4 fingerprint searches as it is not possible to calculate a key ID from a v3 fingerprint.</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>How a keyserver handles a 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":</t>

<figure><artwork><![CDATA[
http://keys.example.com:11371/pks/lookup?search=dshaw&op=index
]]></artwork></figure>

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

<figure><artwork><![CDATA[
http://keys.example.com:11371/pks/lookup?op=get&search=0xDEADBEEFDECAFBAD
]]></artwork></figure>

</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 is set to an ASCII armored keyring as specified in <xref target="RFC4880"></xref>, sections 6.2 and 11.1.
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.
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.
An implementation <bcp14>MAY</bcp14> decide to ignore this variable or set the default behaviour to "on".</t>

<t>"fingerprint" 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 present and on, it instructs the server to search for an exact match for the contents of the "search" variable.
The exact meaning of "exact match" is implementation defined.
An implementation <bcp14>MAY</bcp14> decide to ignore this variable or set the default behaviour to "on".</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 is intended for both human and programmatic use.
The "machine readable" option is used to tailor the output for a given use.
In general, the "human readable" output is implementation specific.
For interoperability, the "machine readable" output <bcp14>MUST</bcp14> carefully follow the guidelines given here.</t>

<t>A client implementation <bcp14>SHOULD</bcp14> supply the "machine readable" option with all requests and <bcp14>SHOULD NOT</bcp14> attempt to parse human-readable output.</t>

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

<t>When machine readable output is requested, several changes are made to output:</t>

<t><list style="symbols">
  <t>Key retrievals (op=get) <bcp14>SHOULD NOT</bcp14> contain any text aside from the ASCII armored keyring.
The document <bcp14>SHOULD</bcp14> also be sent to the user using Content-Type: application/pgp-keys as specified in <xref target="RFC3156"></xref>.</t>
</list></t>

<t>(( andrewg : we may wish to allow for anonymity padding to be allowed in machine-readable output, if so it should be defined.
See issue #13.
))</t>

<t><list style="symbols">
  <t>Key indexes (op=index) <bcp14>SHOULD</bcp14> use the format specified in <xref target="mr-indexes"/>.</t>
  <t>Keyserver statistics (op=stats) <bcp14>MAY</bcp14> be formatted as JSON <xref target="RFC8259"></xref>, but are otherwise implementation-dependent.</t>
</list></t>

<t>In order to support web-based client software, machine readable output <bcp14>SHOULD</bcp14> be served with the HTTP header "Access-Control-Allow-Origin: *" set.</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>
]]></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>
</texttable>

<t>A keyserver <bcp14>MAY</bcp14> return a 16-digit key ID, but <bcp14>SHOULD</bcp14> return a fingerprint if available.
Since it is not possible to calculate the key ID from a V3 key fingerprint, for V3 keys this <bcp14>SHOULD</bcp14> be the 16-digit key ID only.</t>

<t>The algorithm ID is as specified in <xref target="RFC4880"></xref>, 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 ":" character.
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.</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.
All dates are given in the number of seconds since midnight 1/1/1970 UTC.</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 anchor="key-discovery"><name>Key discovery</name>

<t>An additional use of SRV records is when a client needs to locate a specified key by email address.
For example, a client trying to locate a key for isabella@silvie.example.com could consult "_hkp._tcp.silvie.example.com".</t>

<t>(( andrewg : key discovery is the subject of ongoing debate, and may need to be left for another document.
See issue #1.
))</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 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 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>

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

<t>This document assigns the DNS SRV symbolic names "hkp" and "hkps", the URI schemes "hkp" and "hkps", and the HKP port 11371.</t>

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

</section>


  </middle>

  <back>


    <references title='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='RFC4880'>
  <front>
    <title>OpenPGP Message Format</title>
    <author fullname='J. Callas' initials='J.' surname='Callas'/>
    <author fullname='L. Donnerhacke' initials='L.' surname='Donnerhacke'/>
    <author fullname='H. Finney' initials='H.' surname='Finney'/>
    <author fullname='D. Shaw' initials='D.' surname='Shaw'/>
    <author fullname='R. Thayer' initials='R.' surname='Thayer'/>
    <date month='November' year='2007'/>
    <abstract>
      <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>OpenPGP software uses a combination of strong public-key and symmetric cryptography to provide security services for electronic communications and data storage. These services include confidentiality, key management, authentication, and digital signatures. This document specifies the message formats used in OpenPGP. [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name='RFC' value='4880'/>
  <seriesInfo name='DOI' value='10.17487/RFC4880'/>
</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='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='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'>



<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>


    </references>


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

<t>This document is a formalization and extension of the 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 authors would also 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.</t>

</section>


  </back>

<!-- ##markdown-source:
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
QzSM/hdWeGRCrlkAAA==

-->

</rfc>

