| < draft-ietf-dane-openpgpkey-03.txt | draft-ietf-dane-openpgpkey-04.txt > | |||
|---|---|---|---|---|
| Network Working Group P. Wouters | Network Working Group P. Wouters | |||
| Internet-Draft Red Hat | Internet-Draft Red Hat | |||
| Intended status: Standards Track April 01, 2015 | Intended status: Experimental August 27, 2015 | |||
| Expires: October 03, 2015 | Expires: February 28, 2016 | |||
| Using DANE to Associate OpenPGP public keys with email addresses | Using DANE to Associate OpenPGP public keys with email addresses | |||
| draft-ietf-dane-openpgpkey-03 | draft-ietf-dane-openpgpkey-04 | |||
| Abstract | Abstract | |||
| OpenPGP is a message format for email (and file) encryption that | OpenPGP is a message format for email (and file) encryption that | |||
| lacks a standardized lookup mechanism to securely obtain OpenPGP | lacks a standardized lookup mechanism to securely obtain OpenPGP | |||
| public keys. This document specifies a method for publishing, | public keys. This document specifies a method for publishing and | |||
| locating and verifying OpenPGP public keys in DNS for a specific | locating OpenPGP public keys in DNS for a specific email address | |||
| email address using a new OPENPGPKEY DNS Resource Record. Security | using a new OPENPGPKEY DNS Resource Record. Security is provided via | |||
| is provided via DNSSEC. | DNSSEC. | |||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This Internet-Draft is submitted in full conformance with the | |||
| provisions of BCP 78 and BCP 79. | provisions of BCP 78 and BCP 79. | |||
| Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
| Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
| working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
| Drafts is at http://datatracker.ietf.org/drafts/current/. | Drafts is at http://datatracker.ietf.org/drafts/current/. | |||
| Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
| and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
| time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
| material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
| This Internet-Draft will expire on October 03, 2015. | This Internet-Draft will expire on February 28, 2016. | |||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2015 IETF Trust and the persons identified as the | Copyright (c) 2015 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
| (http://trustee.ietf.org/license-info) in effect on the date of | (http://trustee.ietf.org/license-info) in effect on the date of | |||
| publication of this document. Please review these documents | publication of this document. Please review these documents | |||
| carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
| to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
| include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
| the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
| described in the Simplified BSD License. | described in the Simplified BSD License. | |||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | |||
| 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 4 | 1.1. Terminology . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
| 2. The OPENPGPKEY Resource Record . . . . . . . . . . . . . . . 4 | 2. The OPENPGPKEY Resource Record . . . . . . . . . . . . . . . 3 | |||
| 2.1. The OPENPGPKEY RDATA component . . . . . . . . . . . . . 4 | 2.1. The OPENPGPKEY RDATA component . . . . . . . . . . . . . 4 | |||
| 2.2. The OPENPGPKEY RDATA wire format . . . . . . . . . . . . 4 | 2.1.1. The OPENPGPKEY RDATA content . . . . . . . . . . . . 4 | |||
| 2.3. The OPENPGPKEY RDATA presentation format . . . . . . . . 4 | 2.1.2. Reducing the Transferable Public Key size . . . . . . 5 | |||
| 3. Location of the OPENPGPKEY record . . . . . . . . . . . . . . 4 | 2.2. The OPENPGPKEY RDATA wire format . . . . . . . . . . . . 5 | |||
| 3.1. Email address variants . . . . . . . . . . . . . . . . . 5 | 2.3. The OPENPGPKEY RDATA presentation format . . . . . . . . 5 | |||
| 4. Application use of OPENPGPKEY . . . . . . . . . . . . . . . . 6 | 3. Location of the OPENPGPKEY record . . . . . . . . . . . . . . 5 | |||
| 4.1. Obtaining an OpenPGP key for a specific email address . . 6 | 4. Email address variants . . . . . . . . . . . . . . . . . . . 6 | |||
| 4.2. Confirming the validity of an OpenPGP key . . . . . . . . 6 | 5. Application use of OPENPGPKEY . . . . . . . . . . . . . . . . 7 | |||
| 4.3. Verifying an unknown OpenPGP signature . . . . . . . . . 6 | 5.1. Obtaining an OpenPGP key for a specific email address . . 7 | |||
| 5. OpenPGP Key size and DNS . . . . . . . . . . . . . . . . . . 6 | 5.2. Confirming the validity of an OpenPGP key . . . . . . . . 7 | |||
| 6. Security Considerations . . . . . . . . . . . . . . . . . . . 7 | 5.3. Verifying an unknown OpenPGP signature . . . . . . . . . 7 | |||
| 6.1. Response size . . . . . . . . . . . . . . . . . . . . . . 7 | 6. OpenPGP Key size and DNS . . . . . . . . . . . . . . . . . . 7 | |||
| 6.2. Email address information leak . . . . . . . . . . . . . 7 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 8 | |||
| 6.3. Storage of OPENPGPKEY data . . . . . . . . . . . . . . . 8 | 7.1. Response size . . . . . . . . . . . . . . . . . . . . . . 8 | |||
| 6.4. Forward security of OpenPGP versus DNSSEC . . . . . . . . 8 | 7.2. Email address information leak . . . . . . . . . . . . . 8 | |||
| 7. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 8 | 7.3. Storage of OPENPGPKEY data . . . . . . . . . . . . . . . 9 | |||
| 7.1. OPENPGPKEY RRtype . . . . . . . . . . . . . . . . . . . . 8 | 7.4. Forward security of OpenPGP versus DNSSEC . . . . . . . . 9 | |||
| 8. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 8 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 9. References . . . . . . . . . . . . . . . . . . . . . . . . . 9 | 8.1. OPENPGPKEY RRtype . . . . . . . . . . . . . . . . . . . . 10 | |||
| 9.1. Normative References . . . . . . . . . . . . . . . . . . 9 | 9. Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| 9.2. Informative References . . . . . . . . . . . . . . . . . 9 | 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 10 | |||
| Appendix A. Generating OPENPGPKEY records . . . . . . . . . . . 10 | 10.1. Normative References . . . . . . . . . . . . . . . . . . 10 | |||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 11 | 10.2. Informative References . . . . . . . . . . . . . . . . . 11 | |||
| Appendix A. Generating OPENPGPKEY records . . . . . . . . . . . 12 | ||||
| Author's Address . . . . . . . . . . . . . . . . . . . . . . . . 13 | ||||
| 1. Introduction | 1. Introduction | |||
| OpenPGP [RFC4880] public keys are used to encrypt or sign email | OpenPGP [RFC4880] public keys are used to encrypt or sign email | |||
| messages and files. To encrypt an email message, the sender's email | messages and files. To encrypt an email message, or verify a | |||
| client or MTA needs to know where to find the recipient's OpenPGP | sender's OpenPGP signature, the email client or MTA needs to locate | |||
| public key. Once obtained, it needs to find some proof that the | the recipient's OpenPGP public key. | |||
| OpenPGP public key found actually belongs to the intended recipient. | ||||
| Similarly, when files on a storage media are signed with an OpenPGP | ||||
| public key that is included on the storage media, this key needs to | ||||
| be independently verified. | ||||
| Obtaining and verifying an OpenPGP public key is not a | OpenPGP clients have relied on centralized "well-known" key servers | |||
| straightforward process as there are no trusted standardized | that are accessed using either the HTTP Keyserver Protocol [HKP] | |||
| locations for publishing OpenPGP public keys indexed by email | Alternatively, users need to manually browse a variety of different | |||
| address. Instead, OpenPGP clients rely on "well-known key servers" | front-end websites. These key servers do not validate the email | |||
| that are accessed using the HTTP Keyserver Protocol ("HKP") or | address in the User ID of the uploaded OpenPGP public key. Attackers | |||
| manually by users using a variety of differently formatted front-end | can - and have - uploaded rogue public keys with other people's email | |||
| web pages. Worse, some OpenPGP users announce their OpenPGP public | addresses to these key servers. | |||
| key fingerprint on social media with no method of validation | ||||
| whatsoever. | ||||
| Currently deployed key servers have no method of validating any | Once uploaded, public keys cannot be deleted. People who did not | |||
| uploaded OpenPGP public key. The key servers simply store and | pre-sign a key revocation can never remove their OpenPGP public key | |||
| publish. Anyone can add public keys with any identities and anyone | from these key servers once they have lost access to their private | |||
| can add signatures to any other public key using forged malicious | key. This results in receiving encrypted email that cannot be | |||
| identities. Furthermore, once uploaded, public keys cannot be | decrypted. | |||
| deleted. People who did not pre-sign a key revocation can never | ||||
| remove their public key from these key servers once they lose their | ||||
| private key. | ||||
| The lack of a secure means to look up a public key for an email | Therefor, these keyservers are not well suited to support email | |||
| address prevents email clients and MUAs from encrypting an outgoing | clients and MTA's to automatically encrypt email - especially in the | |||
| email to the target recipient, forcing the software to send the | absence of an interactive user. | |||
| message unencrypted. Currently deployed MTAs only support encrypting | ||||
| the transport of the email, not the email contents itself, leaving | ||||
| the content of the email exposed to anyone with access to any of the | ||||
| mail or storage servers used to transport the email from the sender | ||||
| to the receiver. | ||||
| This document describes a mechanism to associate a user's OpenPGP | This document describes a mechanism to associate a user's OpenPGP | |||
| public key with their email address, using a new DNS RRtype. | public key with their email address, using the OPENPGPKEY DNS RRtype. | |||
| These records are published in the DNS zone of the user's email | ||||
| address. If the user loses their private key, the OPENPGPKEY DNS | ||||
| record can simply be updated or removed from the zone. | ||||
| The proposed new DNS Resource Record type is secured using DNSSEC. | The proposed new DNS Resource Record type is secured using DNSSEC. | |||
| This trust model is not meant to replace the Trust Signature model. | This trust model is not meant to replace the Web Of Trust model. | |||
| However, it can be used to encrypt a message that would otherwise | ||||
| have to be sent out unencrypted, where it could be monitored by a | ||||
| third party in transit or located in plaintext on a storage or email | ||||
| server. This method can also be used to obtain the OpenPGP public | ||||
| key which can then be used for manual verification. | ||||
| 1.1. Terminology | 1.1. Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
| document are to be interpreted as described in RFC 2119 [RFC2119]. | document are to be interpreted as described in RFC 2119 [RFC2119]. | |||
| This document also makes use of standard DNSSEC and DANE terminology. | This document also makes use of standard DNSSEC and DANE terminology. | |||
| See DNSSEC [RFC4033], [RFC4034], [RFC4035], and DANE [RFC6698] for | See DNSSEC [RFC4033], [RFC4034], [RFC4035], and DANE [RFC6698] for | |||
| these terms. | these terms. | |||
| 2. The OPENPGPKEY Resource Record | 2. The OPENPGPKEY Resource Record | |||
| The OPENPGPKEY DNS resource record (RR) is used to associate an end | The OPENPGPKEY DNS resource record (RR) is used to associate an end | |||
| entity OpenPGP public key with an email address, thus forming a | entity OpenPGP Transferable Public Key (see Section 11.1 of [RFC4880] | |||
| "OpenPGP public key association". | with an email address, thus forming a "OpenPGP public key | |||
| association". A user that wishes to specify more than one OpenPGP | ||||
| key, for example because they are transitioning to a newer stronger | ||||
| key, can do so by adding multiple OPENPGPKEY records. A single | ||||
| OPENPGPKEY DNS record MUST only contain one OpenPGP key. | ||||
| The type value allocated for the OPENPGPKEY RR type is 61. The | The type value allocated for the OPENPGPKEY RR type is 61. The | |||
| OPENPGPKEY RR is class independent. The OPENPGPKEY RR has no special | OPENPGPKEY RR is class independent. The OPENPGPKEY RR has no special | |||
| TTL requirements. | TTL requirements. | |||
| 2.1. The OPENPGPKEY RDATA component | 2.1. The OPENPGPKEY RDATA component | |||
| The RDATA portion of an OPENPGPKEY Resource Record contains a single | The RDATA portion of an OPENPGPKEY Resource Record contains a single | |||
| value consisting of a [RFC4880] formatted OpenPGP public keyring. | value consisting of a [RFC4880] formatted Transferable Public Key. | |||
| 2.1.1. The OPENPGPKEY RDATA content | ||||
| An OpenPGP Transferable Public Key can be arbitrarily large. DNS | ||||
| records are limited in size. When creating OPENPGPKEY DNS records, | ||||
| the OpenPGP Transferable Public Key should be filtered to only | ||||
| contain appropriate and useful data. At a minimum, an OPENPGPKEY | ||||
| Transferable Public Key for the user hugh@example.com should contain: | ||||
| o The primary key X | ||||
| o One User ID Y, which SHOULD match 'hugh@example.com' | ||||
| o self-signature from X, binding X to Y | ||||
| If the primary key is not encryption-capable, a relevant subkey | ||||
| should be included resulting in an OPENPGPKEY Transferable Public Key | ||||
| containing: | ||||
| o The primary key X | ||||
| o One User ID Y, which SHOULD match 'hugh@example.com' | ||||
| o self-signature from X, binding X to Y | ||||
| o encryption-capable subkey Z | ||||
| o self-signature from X, binding Z to X | ||||
| o [ other subkeys if relevant ... ] | ||||
| The user can also elect to add a few third-party certifications which | ||||
| they believe would be helpful for validation in the traditional Web | ||||
| Of Trust. The resulting OPENPGPKEY Transferable Public Key would | ||||
| then look like: | ||||
| o The primary key X | ||||
| o One User ID Y, which SHOULD match 'hugh@example.com' | ||||
| o self-signature from X, binding X to Y | ||||
| o third-party certification from V, binding Y to X | ||||
| o [ other third-party certifications if relevant ... ] | ||||
| o encryption-capable subkey Z | ||||
| o self-signature from X, binding Z to X | ||||
| o [ other subkeys if relevant ... ] | ||||
| 2.1.2. Reducing the Transferable Public Key size | ||||
| When preparing a Transferable Public Key for a specific OPENPGPKEY | ||||
| RDATA format with the goal of minimizing certificate size, a user | ||||
| would typically want to: | ||||
| o Where one User ID from the certifications matches the looked-up | ||||
| address, strip away non-matching User IDs and any associated | ||||
| certifications (self-signatures or third-party certifications) | ||||
| o Strip away all User Attribute packets and associated | ||||
| certifications Strip away all expired subkeys. The user may want | ||||
| to keep revoked subkeys if these were revoked prior to their | ||||
| preferred expiration time to ensure that correspondents know about | ||||
| these earlier then expected revocations. | ||||
| o strip away all but the most recent self-sig for the remaining user | ||||
| IDs and subkeys | ||||
| o Optionally strip away any uninteresting or unimportant third-party | ||||
| User ID certifications. This is a value judgment by the user that | ||||
| is difficult to automate. At the very least, expired and | ||||
| superseded third-party certifcations should be stripped out. The | ||||
| user should attempt to keep the most recent and most well | ||||
| connected certifications in the Web Of Trust in their Transferable | ||||
| Public Key. | ||||
| 2.2. The OPENPGPKEY RDATA wire format | 2.2. The OPENPGPKEY RDATA wire format | |||
| The RDATA Wire Format consists of a single OpenPGP public key as | The RDATA Wire Format consists of a single OpenPGP Transferable | |||
| defined in Section 5.5.1.1 of [RFC4880]. Note that this format is | Public Key as defined in Section 11.1 of [RFC4880]. Note that this | |||
| without ASCII armor or base64 encoding. | format is without ASCII armor or base64 encoding. | |||
| 2.3. The OPENPGPKEY RDATA presentation format | 2.3. The OPENPGPKEY RDATA presentation format | |||
| The RDATA Presentation Format, as visible in textual zone files, | The RDATA Presentation Format, as visible in textual zone files, | |||
| consists of a single OpenPGP public key as defined in | consists of a single OpenPGP Transferable Public Key as defined in | |||
| Section 5.5.1.1. of [RFC4880] encoded in base64 as defined in | Section 11,1 of [RFC4880] encoded in base64 as defined in Section 4 | |||
| Section 4 of [RFC4648]. | of [RFC4648]. | |||
| 3. Location of the OPENPGPKEY record | 3. Location of the OPENPGPKEY record | |||
| The DNS does not allow the use of all characters that are supported | The DNS does not allow the use of all characters that are supported | |||
| in the "local-part" of email addresses as defined in [RFC2822] and | in the "local-part" of email addresses as defined in [RFC2822] and | |||
| [RFC6530]. Therefore, email addresses are mapped into DNS using the | [RFC6530]. Therefore, email addresses are mapped into DNS using the | |||
| following method: | following method: | |||
| o The user name (the "left-hand side" of the email address, called | o The user name (the "left-hand side" of the email address, called | |||
| the "local-part" in the mail message format definition [RFC2822] | the "local-part" in the mail message format definition [RFC2822] | |||
| and the "local part" in the specification for internationalized | and the local-part in the specification for internationalized | |||
| email [RFC6530]) should already be encoded in UTF-8 (or its subset | email [RFC6530]) should already be encoded in UTF-8 (or its subset | |||
| ASCII). If it is written in another encoding it should be | ASCII). If it is written in another encoding it should be | |||
| converted to UTF-8. Next, it is turned into lowercase and hashed | converted to UTF-8 and then hashed using the SHA2-256 [RFC5754] | |||
| using the SHA2-256 [RFC5754] algorithm, with the hash truncated to | algorithm, with the hash truncated to 28 octets and represented in | |||
| 28 octets and represented in its hexadecimal representation, to | its hexadecimal representation, to become the left-most label in | |||
| become the left-most label in the prepared domain name. | the prepared domain name. Truncation comes from the right-most | |||
| Truncation comes from the right-most octets. This does not | octets. This does not include the at symbol ("@") that separates | |||
| include the at symbol ("@") that separates the left and right | the left and right sides of the email address. | |||
| sides of the email address. | ||||
| o The string "_openpgpkey" becomes the second left-most label in the | o The string "_openpgpkey" becomes the second left-most label in the | |||
| prepared domain name. | prepared domain name. | |||
| o The domain name (the "right-hand side" of the email address, | o The domain name (the "right-hand side" of the email address, | |||
| called the "domain" in RFC 2822) is appended to the result of step | called the "domain" in RFC 2822) is appended to the result of step | |||
| 2 to complete the prepared domain name. | 2 to complete the prepared domain name. | |||
| For example, to request an OPENPGPKEY resource record for a user | For example, to request an OPENPGPKEY resource record for a user | |||
| whose email address is "hugh@example.com", an OPENPGPKEY query would | whose email address is "hugh@example.com", an OPENPGPKEY query would | |||
| be placed for the following QNAME: "c93f1e400f26708f98cb19d936620da35 | be placed for the following QNAME: "c93f1e400f26708f98cb19d936620da35 | |||
| eec8f72e57f9eec01c1afd6._openpgpkey.example.com". The corresponding | eec8f72e57f9eec01c1afd6._openpgpkey.example.com". The corresponding | |||
| RR in the example.com zone might look like (key shortened for | RR in the example.com zone might look like (key shortened for | |||
| formatting): | formatting): | |||
| c9[..]d6._openpgpkey.example.com. IN OPENPGPKEY <base64 public key> | c9[..]d6._openpgpkey.example.com. IN OPENPGPKEY <base64 public key> | |||
| 3.1. Email address variants | 4. Email address variants | |||
| Mail systems usually handle variant forms of local-parts. The most | Mail systems usually handle variant forms of local-parts. The most | |||
| common variants are upper and lower case, which are now invariably | common variants are upper and lower case, often automatically | |||
| treated as equivalent. But many other variants are possible. Some | corrected when a name is recognized as such. Other variants include | |||
| systems allow and ignore "noise" characters such as dots, so local | systems that ignore "noise" characters such as dots, so that local | |||
| parts johnsmith and John.Smith would be equivalent. Many systems | parts johnsmith and John.Smith would be equivalent. Many systems | |||
| allow "extensions" such as john-ext or mary+ext where john or mary is | allow "extensions" such as john-ext or mary+ext where john or mary is | |||
| treated as the effective local-part, and the ext is passed to the | treated as the effective local-part, and the ext is passed to the | |||
| recipient for further handling. This can complicate finding the | recipient for further handling. This can complicate finding the | |||
| OPENPGPKEY record associated with the dynamically created email | OPENPGPKEY record associated with the dynamically created email | |||
| address. | address. | |||
| [RFC5321] and its predecessors have always made it clear that only | [RFC5321] and its predecessors have always made it clear that only | |||
| the recipient MTA is allowed to interpret the local-part of an | the recipient MTA is allowed to interpret the local-part of an | |||
| address. A client supporting OPENPGPKEY therefor MUST NOT perform | address. A client supporting OPENPGPKEY therefor MUST NOT perform | |||
| any kind of mapping rules based on the email address. As the local- | any kind of mapping rules based on the email address. | |||
| part is converted to lowercase before hashing, case sensitivity will | ||||
| not cause problems for the OPENPGPKEY lookup. | ||||
| 4. Application use of OPENPGPKEY | 5. Application use of OPENPGPKEY | |||
| The OPENPGPKEY record allows an application or service to obtain or | The OPENPGPKEY record allows an application or service to obtain or | |||
| verify an OpenPGP public key. The lookup result MUST pass DNSSEC | verify an OpenPGP public key. The lookup result MUST pass DNSSEC | |||
| validation; if validation reaches any state other than "Secure", the | validation; if validation reaches any state other than "Secure", the | |||
| verification MUST be treated as a failure. | verification MUST be treated as a failure. | |||
| 4.1. Obtaining an OpenPGP key for a specific email address | 5.1. Obtaining an OpenPGP key for a specific email address | |||
| If no OpenPGP public keys are known for an email address, an | If no OpenPGP public keys are known for an email address, an | |||
| OPENPGPKEY lookup can be performed to discover the OpenPGP public key | OPENPGPKEY lookup MAY be performed to discover the OpenPGP public key | |||
| that belongs to a specific email address. This public key can then | that belongs to a specific email address. This public key can then | |||
| be used to verify a received signed message or can be used to send | be used to verify a received signed message or can be used to send | |||
| out an encrypted email message. | out an encrypted email message. An application that confirms the | |||
| lack of an OPENPGPKEY record SHOULD remember this for some time to | ||||
| avoid sending out a DNS request for each email message that is sent | ||||
| out as this constitutes a privacy leak. | ||||
| 4.2. Confirming the validity of an OpenPGP key | 5.2. Confirming the validity of an OpenPGP key | |||
| Locally stored OpenPGP public keys are not automatically refreshed. | Locally stored OpenPGP public keys are not automatically refreshed. | |||
| If the owner of that key creates a new OpenPGP public key, that owner | If the owner of that key creates a new OpenPGP public key, that owner | |||
| is unable to securely notify all users and applications that have its | is unable to securely notify all users and applications that have its | |||
| old OpenPGP public key. Applications and users can perform an | old OpenPGP public key. Applications and users can perform an | |||
| OPENPGPKEY lookup to confirm the locally stored OpenPGP public key is | OPENPGPKEY lookup to confirm the locally stored OpenPGP public key is | |||
| still the correct key to use. If verifying a locally stored OpenPGP | still the correct key to use. If verifying a locally stored OpenPGP | |||
| public key and the OpenPGP public key found through DNS is different | public key and the OpenPGP public key found through DNS is different | |||
| from the locally stored OpenPGP public key, the verification MUST be | from the locally stored OpenPGP public key, the verification MUST be | |||
| treated as a failure. An application that can interact with the user | treated as a failure. An application that can interact with the user | |||
| MAY ask the user for guidance. | MAY ask the user for guidance. For privacy reasons, an application | |||
| MUST NOT attempt to validate a locally stored OpenPGP key using an | ||||
| OPENPGPKEY lookup at every use of that key. | ||||
| 4.3. Verifying an unknown OpenPGP signature | 5.3. Verifying an unknown OpenPGP signature | |||
| Storage media can be signed using an OpenPGP public key. Even if the | Storage media can be signed using an OpenPGP public key. Even if the | |||
| OpenPGP public key is included on the storage media, it needs to be | OpenPGP public key is included on the storage media, it needs to be | |||
| independently validated. OpenPGP public keys contain one or more IDs | independently validated. OpenPGP public keys contain one or more IDs | |||
| than can have the syntax of an email address. An application can | than can have the syntax of an email address. An application can | |||
| perform a lookup for an OPENPGPKEY at the expected location for the | perform a lookup for an OPENPGPKEY at the expected location for the | |||
| specific email address to confirm the validity of the OpenPGP public | specific email address to confirm the validity of the OpenPGP public | |||
| key. Once the key has been validated, all files on the storage media | key. Once the key has been validated, all files on the storage media | |||
| that have been signed by this key can now be verified. | that have been signed by this key can now be verified. | |||
| 5. OpenPGP Key size and DNS | 6. OpenPGP Key size and DNS | |||
| Due to the expected size of the OPENPGPKEY record, applications | ||||
| Due to the expected size of the OPENPGPKEY record, it is recommended | SHOULD use TCP - not UDP - to perform queries for the OPENPGPKEY | |||
| to perform DNS queries for the OPENPGPKEY record using TCP, not UDP. | Resource Record. | |||
| Although the reliability of the transport of large DNS Resource | Although the reliability of the transport of large DNS Resource | |||
| Records has improved in the last years, it is still recommended to | Records has improved in the last years, it is still recommended to | |||
| keep the DNS records as small as possible without sacrificing the | keep the DNS records as small as possible without sacrificing the | |||
| security properties of the public key. The algorithm type and key | security properties of the public key. The algorithm type and key | |||
| size of OpenPGP keys should not be modified to accommodate this | size of OpenPGP keys should not be modified to accommodate this | |||
| section. | section. | |||
| OpenPGP supports various attributes that do not contribute to the | OpenPGP supports various attributes that do not contribute to the | |||
| security of a key, such as an embedded image file. It is recommended | security of a key, such as an embedded image file. It is recommended | |||
| that these properties are not exported to OpenPGP public keyrings | that these properties are not exported to OpenPGP public keyrings | |||
| that are used to create OPENPGPKEY Resource Records. Some OpenPGP | that are used to create OPENPGPKEY Resource Records. Some OpenPGP | |||
| software, for example GnuPG, have support for a "minimal key export" | software, for example GnuPG, have support for a "minimal key export" | |||
| that is well suited to use as OPENPGPKEY RDATA. See Appendix A. | that is well suited to use as OPENPGPKEY RDATA. See Appendix A. | |||
| 6. Security Considerations | 7. Security Considerations | |||
| OPENPGPKEY usage considerations are published in [OPENPGPKEY-USAGE]. | OPENPGPKEY usage considerations are published in [OPENPGPKEY-USAGE]. | |||
| 6.1. Response size | 7.1. Response size | |||
| To prevent amplification attacks, an Authoritative DNS server MAY | To prevent amplification attacks, an Authoritative DNS server MAY | |||
| wish to prevent returning OPENPGPKEY records over UDP unless the | wish to prevent returning OPENPGPKEY records over UDP unless the | |||
| source IP address has been verified with [DNS-COOKIES]. Such servers | source IP address has been verified with [DNS-COOKIES]. Such servers | |||
| MUST NOT return REFUSED, but answer the query with an empty Answer | MUST NOT return REFUSED, but answer the query with an empty Answer | |||
| Section and the truncation flag set ("TC=1"). | Section and the truncation flag set ("TC=1"). | |||
| 6.2. Email address information leak | 7.2. Email address information leak | |||
| Email addresses are not secret. Using them causes their publication. | ||||
| The hashing of the user name in this document is not a security | The hashing of the user name in this document is not a security | |||
| feature. Publishing OPENPGPKEY records however, will create a list | feature. Publishing OPENPGPKEY records however, will create a list | |||
| of hashes of valid email addresses, which could simplify obtaining a | of hashes of valid email addresses, which could simplify obtaining a | |||
| list of valid email addresses for a particular domain. It is | list of valid email addresses for a particular domain. It is | |||
| desirable to not ease the harvesting of email addresses where | desirable to not ease the harvesting of email addresses where | |||
| possible. | possible. | |||
| The domain name part of the email address is not used as part of the | The domain name part of the email address is not used as part of the | |||
| hash so that hashes can be used in multiple zones deployed using | hash so that hashes can be used in multiple zones deployed using | |||
| DNAME [RFC6672]. This does makes it slightly easier and cheaper to | DNAME [RFC6672]. This does makes it slightly easier and cheaper to | |||
| brute-force the SHA2-224 hashes into common and short user names, as | brute-force the SHA2-256 hashes into common and short user names, as | |||
| single rainbow tables can be re-used across domains. This can be | single rainbow tables can be re-used across domains. This can be | |||
| somewhat countered by using NSEC3. | somewhat countered by using NSEC3. | |||
| DNS zones that are signed with DNSSEC using NSEC for denial of | DNS zones that are signed with DNSSEC using NSEC for denial of | |||
| existence are susceptible to zone-walking, a mechanism that allows | existence are susceptible to zone-walking, a mechanism that allows | |||
| someone to enumerate all the OPENPGPKEY hashes in a zone. This can | someone to enumerate all the OPENPGPKEY hashes in a zone. This can | |||
| be used in combination with previously hashed common or short user | be used in combination with previously hashed common or short user | |||
| names (in rainbow tables) to deduce valid email addresses. DNSSEC- | names (in rainbow tables) to deduce valid email addresses. DNSSEC- | |||
| signed zones using NSEC3 for denial of existence instead of NSEC are | signed zones using NSEC3 for denial of existence instead of NSEC are | |||
| significantly harder to brute-force after performing a zone-walk. | significantly harder to brute-force after performing a zone-walk. | |||
| 6.3. Storage of OPENPGPKEY data | 7.3. Storage of OPENPGPKEY data | |||
| Users may have a local key store with OpenPGP public keys. An | Users may have a local key store with OpenPGP public keys. An | |||
| application supporting the use of OPENPGPKEY DNS records MUST NOT | application supporting the use of OPENPGPKEY DNS records MUST NOT | |||
| modify the local key store without explicit confirmation of the user, | modify the local key store without explicit confirmation of the user, | |||
| as the application is unaware of the user's personal policy for | as the application is unaware of the user's personal policy for | |||
| adding, removing or updating their local key store. An application | adding, removing or updating their local key store. An application | |||
| MAY warn the user if an OPENPGPKEY record does not match the OpenPGP | MAY warn the user if an OPENPGPKEY record does not match the OpenPGP | |||
| public key in the local key store. | public key in the local key store. | |||
| OpenPGP public keys obtained via OPENPGPKEY records should not be | Applications that do not have users associated with, such as daemon | |||
| stored beyond their DNS TTL value. | processes, SHOULD store OpenPGP public keys obtained via OPENPGPKEY | |||
| up to their DNS TTL value. This avoids repeated DNS lookups that | ||||
| third parties could monitor to determine when an email is being sent | ||||
| to a particular user. If TLS is in use between MTA's, only the DNS | ||||
| lookup could happen unencrypted. | ||||
| 6.4. Forward security of OpenPGP versus DNSSEC | 7.4. Forward security of OpenPGP versus DNSSEC | |||
| DNSSEC key sizes are chosen based on the fact that these keys can be | DNSSEC key sizes are chosen based on the fact that these keys can be | |||
| rolled with next to no requirement for security in the future. If | rolled with next to no requirement for security in the future. If | |||
| one doubts the strength or security of the DNSSEC key for whatever | one doubts the strength or security of the DNSSEC key for whatever | |||
| reason, one simply rolls to a new DNSSEC key with a stronger | reason, one simply rolls to a new DNSSEC key with a stronger | |||
| algorithm or larger key size. On the other hand, OpenPGP key sizes | algorithm or larger key size. On the other hand, OpenPGP key sizes | |||
| are chosen based on how many years (or decades) their encryption | are chosen based on how many years (or decades) their encryption | |||
| should remain unbreakable by adversaries that own large scale | should remain unbreakable by adversaries that own large scale | |||
| computational resources. | computational resources. | |||
| skipping to change at page 8, line 42 ¶ | skipping to change at page 10, line 5 ¶ | |||
| delegated child zones, irrespective of the key size of the OpenPGP | delegated child zones, irrespective of the key size of the OpenPGP | |||
| keypair. Any future messages encrypted with the malicious OpenPGP | keypair. Any future messages encrypted with the malicious OpenPGP | |||
| key could then be read. | key could then be read. | |||
| Therefore, an OpenPGP key obtained via an OPENPGPKEY record can only | Therefore, an OpenPGP key obtained via an OPENPGPKEY record can only | |||
| be trusted as much as the DNS domain can be trusted, and is no | be trusted as much as the DNS domain can be trusted, and is no | |||
| substitute for in-person key verification of the "Web of Trust". See | substitute for in-person key verification of the "Web of Trust". See | |||
| [OPENPGPKEY-USAGE] for more in-depth information on safe usage of | [OPENPGPKEY-USAGE] for more in-depth information on safe usage of | |||
| OPENPGPKEY based OpenPGP keys. | OPENPGPKEY based OpenPGP keys. | |||
| 7. IANA Considerations | 8. IANA Considerations | |||
| 7.1. OPENPGPKEY RRtype | 8.1. OPENPGPKEY RRtype | |||
| This document uses a new DNS RR type, OPENPGPKEY, whose value 61 has | This document uses a new DNS RR type, OPENPGPKEY, whose value 61 has | |||
| been allocated by IANA from the Resource Record (RR) TYPEs | been allocated by IANA from the Resource Record (RR) TYPEs | |||
| subregistry of the Domain Name System (DNS) Parameters registry. | subregistry of the Domain Name System (DNS) Parameters registry. | |||
| 8. Acknowledgments | 9. Acknowledgments | |||
| This document is based on RFC-4255 and draft-ietf-dane-smime whose | This document is based on RFC-4255 and draft-ietf-dane-smime whose | |||
| authors are Paul Hoffman, Jacob Schlyter and W. Griffin. Olafur | authors are Paul Hoffman, Jacob Schlyter and W. Griffin. Olafur | |||
| Gudmundsson provided feedback and suggested various improvements. | Gudmundsson provided feedback and suggested various improvements. | |||
| Willem Toorop contributed the gpg and hexdump command options. Edwin | Willem Toorop contributed the gpg and hexdump command options. | |||
| Taylor contributed language improvements for various iterations of | Daniel Kahn Gillmor provided the text describing the OpenPGP packet | |||
| this document. Text regarding email mappings was taken from draft- | formats and filtering options. Edwin Taylor contributed language | |||
| levine-dns-mailbox whose author is John Levine. | improvements for various iterations of this document. Text regarding | |||
| email mappings was taken from draft-levine-dns-mailbox whose author | ||||
| is John Levine. | ||||
| 9. References | 10. References | |||
| 9.1. Normative References | 10.1. Normative References | |||
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
| Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
| [RFC4033] Arends, R., Austein, R., Larson, M., Massey, D., and S. | [RFC4033] Arends, R., Austein, R., Larson, M., Massey, D., and S. | |||
| Rose, "DNS Security Introduction and Requirements", RFC | Rose, "DNS Security Introduction and Requirements", RFC | |||
| 4033, March 2005. | 4033, March 2005. | |||
| [RFC4034] Arends, R., Austein, R., Larson, M., Massey, D., and S. | [RFC4034] Arends, R., Austein, R., Larson, M., Massey, D., and S. | |||
| Rose, "Resource Records for the DNS Security Extensions", | Rose, "Resource Records for the DNS Security Extensions", | |||
| RFC 4034, March 2005. | RFC 4034, March 2005. | |||
| [RFC4035] Arends, R., Austein, R., Larson, M., Massey, D., and S. | [RFC4035] Arends, R., Austein, R., Larson, M., Massey, D., and S. | |||
| Rose, "Protocol Modifications for the DNS Security | Rose, "Protocol Modifications for the DNS Security | |||
| Extensions", RFC 4035, March 2005. | Extensions", RFC 4035, March 2005. | |||
| [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | [RFC4648] Josefsson, S., "The Base16, Base32, and Base64 Data | |||
| Encodings", RFC 4648, October 2006. | Encodings", RFC 4648, DOI 10.17487/RFC4648, October 2006, | |||
| <http://www.rfc-editor.org/info/rfc4648>. | ||||
| [RFC4880] Callas, J., Donnerhacke, L., Finney, H., Shaw, D., and R. | [RFC4880] Callas, J., Donnerhacke, L., Finney, H., Shaw, D., and R. | |||
| Thayer, "OpenPGP Message Format", RFC 4880, November 2007. | Thayer, "OpenPGP Message Format", RFC 4880, DOI 10.17487/ | |||
| RFC4880, November 2007, | ||||
| <http://www.rfc-editor.org/info/rfc4880>. | ||||
| [RFC5754] Turner, S., "Using SHA2 Algorithms with Cryptographic | [RFC5754] Turner, S., "Using SHA2 Algorithms with Cryptographic | |||
| Message Syntax", RFC 5754, January 2010. | Message Syntax", RFC 5754, DOI 10.17487/RFC5754, January | |||
| 2010, <http://www.rfc-editor.org/info/rfc5754>. | ||||
| 9.2. Informative References | 10.2. Informative References | |||
| [DNS-COOKIES] | [DNS-COOKIES] | |||
| Eastlake, Donald., "Domain Name System (DNS) Cookies", | Eastlake, Donald., "Domain Name System (DNS) Cookies", | |||
| draft-ietf-dnsop-cookies (work in progress), February | draft-ietf-dnsop-cookies (work in progress), August 2015. | |||
| 2015. | ||||
| [HKP] Shaw, D., "The OpenPGP HTTP Keyserver Protocol (HKP)", | ||||
| draft-shaw-openpgp-hkp (work in progress), March 2013. | ||||
| [OPENPGPKEY-USAGE] | [OPENPGPKEY-USAGE] | |||
| Wouters, P., "Usage considerations with the DNS OPENPGPKEY | Wouters, P., "Usage considerations with the DNS OPENPGPKEY | |||
| record", draft-dane-openpgpkey-usage (work in progress), | record", draft-dane-openpgpkey-usage (work in progress), | |||
| October 2014. | October 2014. | |||
| [RFC2181] Elz, R. and R. Bush, "Clarifications to the DNS | [RFC2181] Elz, R. and R. Bush, "Clarifications to the DNS | |||
| Specification", RFC 2181, July 1997. | Specification", RFC 2181, DOI 10.17487/RFC2181, July 1997, | |||
| <http://www.rfc-editor.org/info/rfc2181>. | ||||
| [RFC2822] Resnick, P., "Internet Message Format", RFC 2822, April | [RFC2822] Resnick, P., Ed., "Internet Message Format", RFC 2822, DOI | |||
| 2001. | 10.17487/RFC2822, April 2001, | |||
| <http://www.rfc-editor.org/info/rfc2822>. | ||||
| [RFC3597] Gustafsson, A., "Handling of Unknown DNS Resource Record | [RFC3597] Gustafsson, A., "Handling of Unknown DNS Resource Record | |||
| (RR) Types", RFC 3597, September 2003. | (RR) Types", RFC 3597, DOI 10.17487/RFC3597, September | |||
| 2003, <http://www.rfc-editor.org/info/rfc3597>. | ||||
| [RFC5233] Murchison, K., "Sieve Email Filtering: Subaddress | [RFC5233] Murchison, K., "Sieve Email Filtering: Subaddress | |||
| Extension", RFC 5233, January 2008. | Extension", RFC 5233, DOI 10.17487/RFC5233, January 2008, | |||
| <http://www.rfc-editor.org/info/rfc5233>. | ||||
| [RFC5321] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, | [RFC5321] Klensin, J., "Simple Mail Transfer Protocol", RFC 5321, | |||
| October 2008. | DOI 10.17487/RFC5321, October 2008, | |||
| <http://www.rfc-editor.org/info/rfc5321>. | ||||
| [RFC6530] Klensin, J. and Y. Ko, "Overview and Framework for | [RFC6530] Klensin, J. and Y. Ko, "Overview and Framework for | |||
| Internationalized Email", RFC 6530, February 2012. | Internationalized Email", RFC 6530, DOI 10.17487/RFC6530, | |||
| February 2012, <http://www.rfc-editor.org/info/rfc6530>. | ||||
| [RFC6672] Rose, S. and W. Wijngaards, "DNAME Redirection in the | [RFC6672] Rose, S. and W. Wijngaards, "DNAME Redirection in the | |||
| DNS", RFC 6672, June 2012. | DNS", RFC 6672, DOI 10.17487/RFC6672, June 2012, | |||
| <http://www.rfc-editor.org/info/rfc6672>. | ||||
| [RFC6698] Hoffman, P. and J. Schlyter, "The DNS-Based Authentication | [RFC6698] Hoffman, P. and J. Schlyter, "The DNS-Based Authentication | |||
| of Named Entities (DANE) Transport Layer Security (TLS) | of Named Entities (DANE) Transport Layer Security (TLS) | |||
| Protocol: TLSA", RFC 6698, August 2012. | Protocol: TLSA", RFC 6698, August 2012. | |||
| [RFC7129] Gieben, R. and W. Mekking, "Authenticated Denial of | [RFC7129] Gieben, R. and W. Mekking, "Authenticated Denial of | |||
| Existence in the DNS", RFC 7129, February 2014. | Existence in the DNS", RFC 7129, DOI 10.17487/RFC7129, | |||
| February 2014, <http://www.rfc-editor.org/info/rfc7129>. | ||||
| Appendix A. Generating OPENPGPKEY records | Appendix A. Generating OPENPGPKEY records | |||
| The commonly available GnuPG software can be used to generate the | The commonly available GnuPG software can be used to generate a | |||
| RRdata portion of an OPENPGPKEY record: | minimum Transferable Public Key for the RRdata portion of an | |||
| OPENPGPKEY record: | ||||
| gpg --export --export-options export-minimal \ | gpg --export --export-options export-minimal,no-export-attributes \ | |||
| hugh@example.com | base64 | hugh@example.com | base64 | |||
| The --armor or -a option of the gpg command should NOT be used, as it | The --armor or -a option of the gpg command should NOT be used, as it | |||
| adds additional markers around the armored key. | adds additional markers around the armored key. | |||
| When DNS software reading or signing the zone file does not yet | When DNS software reading or signing the zone file does not yet | |||
| support the OPENPGPKEY RRtype, the Generic Record Syntax of [RFC3597] | support the OPENPGPKEY RRtype, the Generic Record Syntax of [RFC3597] | |||
| can be used to generate the RDATA. One needs to calculate the number | can be used to generate the RDATA. One needs to calculate the number | |||
| of octets and the actual data in hexadecimal: | of octets and the actual data in hexadecimal: | |||
| gpg --export --export-options export-minimal \ | gpg --export --export-options export-minimal,no-export-attributes \ | |||
| hugh@example.com | wc -c | hugh@example.com | wc -c | |||
| gpg --export --export-options export-minimal \ | gpg --export --export-options export-minimal,no-export-attributes \ | |||
| hugh@example.com | hexdump -e \ | hugh@example.com | hexdump -e \ | |||
| '"\t" /1 "%.2x"' -e '/32 "\n"' | '"\t" /1 "%.2x"' -e '/32 "\n"' | |||
| These values can then be used to generate a generic record (line | These values can then be used to generate a generic record (line | |||
| break has been added for formatting): | break has been added for formatting): | |||
| <SHA2-256-trunc(hugh)>._openpgpkey.example.com. IN TYPE61 \# \ | <SHA2-256-trunc(hugh)>._openpgpkey.example.com. IN TYPE61 \# \ | |||
| <numOctets> <keydata in hex> | <numOctets> <keydata in hex> | |||
| The openpgpkey command in the hash-slinger software can be used to | The openpgpkey command in the hash-slinger software can be used to | |||
| End of changes. 60 change blocks. | ||||
| 145 lines changed or deleted | 221 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||