<?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-01" 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="October" day="17"/>

    <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.
))</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>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".
))</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>&#160;</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>&#160;</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.
))</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="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 arguments, separated by commas.
These are used to modify the behavior of the keyserver on a per-request basis.</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 may be customized for that use.
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 could trim any noncompliant user IDs before accepting the key.
If this option was set, then the key submission would fail.</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-".</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.</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.</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) do not contain any text aside from the ASCII armored keyring.
The document is also sent to the user using Content-Type: application/pgp-keys as specified in <xref target="RFC3156"></xref>.</t>
  <t>Key indexes (op=index) use the format specified in <xref target="mr-indexes"/>.</t>
  <t>Keyserver statistics (op=stats) are implementation-dependent, but are commonly formatted as JSON <xref target="RFC8259"></xref>.</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:algo: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>algo</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 should 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`:uid string: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>uid string</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 may 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 may 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 implementors 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.
))</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>

</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://spider.pgpkeys.eu/">
  <front>
    <title>The SKS synchronising keyserver network</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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
lPwPDLX0gPJUAAA=

-->

</rfc>

