├── .gitignore
├── Makefile
├── README.md
├── rfc.xml
└── submissions
├── draft-mccain-keylist-00.xml
├── draft-mccain-keylist-01.xml
├── draft-mccain-keylist-02.xml
├── draft-mccain-keylist-03.xml
├── draft-mccain-keylist-04.xml
└── draft-mccain-keylist-05.xml
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | rfc.html
3 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | all: serve
2 |
3 | html: rfc.xml
4 | xml2rfc --html rfc.xml
5 |
6 | serve: html
7 | open http://0.0.0.0:8000/rfc.html
8 | python3 -m http.server
9 |
10 | linux-serve: html
11 | xdg-open http://0.0.0.0:8000/rfc.html
12 | python3 -m http.server
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Keylist RFC
2 |
3 | This repository contains the materials produced in the preparation of the RFC to standardize the keylist format and functionality provided by [GPG Sync](https://github.com/firstlookmedia/gpgsync).
4 |
5 | ##### What's with the weird filenames?
6 | The IETF specifies that independently submitted I-D (Internet-Drafts) should follow the filename format `draft-[first author's last name]-[document name]-[version]`. `rfc.xml` is where development takes place. When a new version of the I-D is submitted, a copy of the `.xml` file submitted at that time is copied to the `submissions` directory.
7 |
8 | ## Quick Links
9 | * [IETF Datatracker](https://datatracker.ietf.org/doc/draft-mccain-keylist/) (for reading the official copy of the document)
10 | * [Mailing list](https://www.freelists.org/list/keylists) (for discussion and development)
11 |
12 | ## Development
13 |
14 | - edit `rfc.xml`
15 | - `pip install xml2rfc`
16 | - `make`
17 |
18 | ## Relevant Documents
19 |
20 | Non-RFC documents relevant to the preparation of this RFC are listed below.
21 |
22 | * [The IETF Area List](https://www.ietf.org/topics/areas/)
23 | * [RFC Editorial Guidelines and Procedures](https://www.rfc-editor.org/policy.html#policy.auth)
24 | * [IETF Standards Process](https://www.ietf.org/standards/process/)
25 |
26 | ## Relevant RFCs
27 |
28 | RFCs that are potentially relevant to the preparation of this document are listed below. This list includes both RFC style guides and existing RFCs related to OpenPGP.
29 |
30 | * [RFC7322](https://tools.ietf.org/html/rfc7322): RFC Style Guide
31 | * [RFC7997](https://tools.ietf.org/html/rfc7997): The Use of Non-ASCII Characters in RFCs
32 | * [RFC2026](https://tools.ietf.org/html/rfc2026): The Internet Standards Process (rev.3; note: errata exist)
33 | * [RFC4880](https://www.rfc-editor.org/rfc/rfc4880.txt): OpenPGP Message Format
34 | * [RFC2629](https://tools.ietf.org/html/rfc2629): Writing I-Ds and RFCs using XML
35 |
36 | ## Updates
37 | * **August 6, 2018** — first draft published
38 | * **August 21, 2018** — mailing list created
39 | * **August 22, 2018** — second draft published
40 | * **October 13, 2018** — third draft published
41 |
42 | ## TODO
43 | * [ ] Expand acronyms on first use
44 | * [x] List normative and informative references
45 |
--------------------------------------------------------------------------------
/rfc.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
12 |
13 |
16 |
17 | Distributing OpenPGP Key Fingerprints with Signed Keylist Subscriptions
18 |
19 |
20 |
21 | First Look Media
22 |
23 |
24 |
25 | ietf@sendmiles.email
26 |
27 |
28 | https://rmrm.io
29 |
30 |
31 |
32 |
33 |
34 | The Intercept
35 |
36 |
37 |
38 | micah.lee@theintercept.com
39 |
40 |
41 | https://micahflee.com/
42 |
43 |
44 |
45 |
46 |
47 | Google
48 |
49 |
50 |
51 | nat@natwelch.com
52 |
53 |
54 | https://natwelch.com
55 |
56 |
57 |
58 |
59 |
60 | Security
61 |
62 |
63 | OpenPGP
64 |
65 |
66 | GPGSync
67 |
68 |
69 | GPG
70 |
71 |
72 | Keylist
73 |
74 |
75 |
76 | This document specifies a system by which an OpenPGP client may subscribe
77 | to an organization's public keylist to keep its keystore up-to-date with
78 | correct keys from the correct keyserver(s), even in cases where the keys correspond to multiple
79 | (potentially uncontrolled) domains. Ensuring that all members or followers
80 | of an organization have their colleagues' most recent PGP public keys is
81 | critical to maintaining operational security. Without the most recent
82 | keys' fingerprints and a source of trust for those keys (as this document
83 | specifies), users must manually update and sign each others' keys -- a
84 | system that is untenable in larger organizations. This document proposes a
85 | experimental format for the keylist file as well as requirements for
86 | clients who wish to implement this experimental keylist subscription
87 | functionality.
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 | This document specifies a system by which clients may subscribe to
97 | cryptographically signed 'keylists' of public key fingerprints. The public
98 | keys do not necesssarily all correspond to a single domain. This system
99 | enhances operational security by allowing seamless key rotation across
100 | entire organizations without centralized public key hosting. To enable
101 | cross-client compatibility, this document provides a experimental format
102 | for the keylist, its cryptographic verification, and the method by which it
103 | is retreived by the client. The user interface by which a client provides
104 | this functionality to the user is out of scope, as is the process by which
105 | the client retrieves public keys. Other non-security-related implementation
106 | details are also out of scope.
107 |
108 |
109 |
110 | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
111 | "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
112 | and "OPTIONAL" in this document are to be interpreted as
113 | described in
114 |
115 | .
116 |
117 |
118 |
119 |
120 | This document uses the terms "OpenPGP", "public key",
121 | "private key", "signature", and "fingerprint" as defined by
122 | OpenPGP Message Format
123 |
124 | (the fingerprint type SHOULD be V4).
125 |
126 |
127 |
128 |
130 |
132 |
133 | The term "keylist" is defined as a list of OpenPGP public key fingerprints
134 | accessible via a URI in the format specified in
135 | . Keylists SHOULD be treated as public
136 | documents, however a system administrator MAY choose, for example, to
137 | restrict access to a keylist to a specific subnet or private network.
138 |
139 |
143 |
144 |
145 | An "authority key" is defined as the OpenPGP secret key used
146 | to sign a particular keylist. Every keylist has a
147 | corresponding authority key, and every authority key has at
148 | least one corresponding keylist. A single authority key
149 | SHOULD NOT be used to sign multiple keylists.
150 |
151 |
156 |
162 |
163 | To be "subscribed" to a keylist means that a program will
164 | retreive that keylist on a regular interval. After
165 | retrieval, that program will perform an update to an
166 | internal OpenPGP keystore.
167 |
168 |
169 |
170 | A "client" is a program that allows the user to subscribe to
171 | keylists. A client may be an OpenPGP client itself or a
172 | separate program that interfaces with an OpenPGP client to
173 | update its keystore.
174 |
175 |
176 |
177 | RFC Editor: please remove this section prior to
178 | publication.
179 | Development of this Internet draft takes place on GitHub at
180 | firstlookmedia/Keylist-RFC.
182 |
183 | We are still considering whether this Draft is better for the Experimental or
184 | Informational track. All feedback is appreciated.
185 |
186 |
187 |
188 |
189 | As new keys are created and other keys are revoked, it is
190 | critical that all members of an organization have the most
191 | recent set of keys available on their computers. Keylists enable
192 | organizations to publish a directory of OpenPGP keys that
193 | clients can use to keep their internal keystores up-to-date.
194 |
195 |
196 |
197 | A single client may subscribe to any number of keylists.
198 | When a client first subscribes to a keylist, it SHOULD
199 | update or import every key present in the keylist into its
200 | local keystore. Keylist subscriptions SHOULD be persistent
201 | -- that is, they should be permanently stored by the client
202 | to enable future automatic updates.
203 |
204 |
205 | To subscribe to a keylist, the client must be aware of the
206 | keylist URI (see ), and the
207 | fingerprint of the authority key used to sign the
208 | keylist. The protocol used to retrieve the keylist and its
209 | signature SHOULD be HTTPS (see ),
210 | however other implementation MAY be supported. A client
211 | implementing keylist functionality MUST support the
212 | retrieval of keylists and signatures over HTTPS. All other
213 | protocols are OPTIONAL.
214 |
215 |
216 | A client MUST NOT employ a trust-on-first-use (TOFU) model for
217 | determining the fingerprint of the authority public key; the
218 | authority public key fingerprint must be explicitly provided
219 | by the user.
220 |
221 |
222 | The process by which the client stores its keylist
223 | subscriptions is out of scope, as is the means by which
224 | subscription functionality is exposed to the end-user.
225 |
226 |
227 | The client MAY provide the option to perform all its network
228 | activity over a SOCKS5 proxy (see ).
229 |
230 |
231 |
232 |
233 | The primary purpose of keylists is to enable periodic
234 | updates of OpenPGP clients' internal keystores. We RECOMMEND
235 | that clients provide automatic 'background' update functionality;
236 | we also regonize that automatic background updates are not possible
237 | in every application (specifically cross-platform CLI tools).
238 |
239 | When automatic background updates are provided, we RECOMMEND
240 | that clients provide a default refresh interval of less than
241 | one day, however we also RECOMMEND that clients allow the
242 | user to select this interval. The exact time at which
243 | updates are performed is not critical.
244 |
245 |
246 | To perform an update, the client MUST perform the following
247 | steps on each keylist to which it is subscribed. The steps
248 | SHOULD be performed in the given order.
249 |
250 |
251 |
252 |
253 | Obtain a current copy of the keylist from its URI. If a
254 | current copy (i.e. not from local cache) cannot be obtained,
255 | the client SHOULD abort the update for this keylist and notify
256 | the user. The client SHOULD continue the update for other keylists
257 | to which it is subscribed, notwithstanding also failing the criteria
258 | described in this section.
259 |
260 |
261 | Obtain a current copy of the keylist's signature
262 | data from its URI, which is included in the keylist data
263 | format specified in . If a current copy
264 | cannot be obtained, the client SHOULD abort the update and notify
265 | the user. The client SHOULD continue the update for other keylists
266 | to which it is subscribed, notwithstanding also failing the criteria
267 | described in this section.
268 |
269 |
276 |
278 |
279 | Using the keylist and the keylist's signature,
280 | cryptographically verify that the keylist was signed
281 | using the authority key. If the signature does not
282 | verify, the client MUST abort the update of this
283 | keylist and SHOULD alert the user. The client SHOULD
284 | NOT abort the update of other keylists to which it
285 | is subscribed, unless they too fail signature
286 | verification.
287 |
288 |
289 | Validate the format of the keylist according to
290 |
291 | . If the keylist is in an invalid format, the client
292 | MUST abort the update this keylist and SHOULD alert
293 | the user. The client SHOULD continue the update for
294 | other keylists to which it is subscribed, notwithstanding
295 | also failing the criteria described in this section.
296 |
297 |
298 | For each fingerprint listed in the keyfile, if a
299 | copy of the associated public key is not present in
300 | the client's local keystore, retrieve it from the
301 | keyserver specified by either the key entry, the keylist (see
302 | ) or, if the keylist specifies
303 | no keyserver, from the user's default keyserver. If the public
304 | key cannot be found for a particular fingerprint, the client
305 | MUST NOT abort the entire update process; instead, it SHOULD
306 | notify the user that the key retrieval failed but otherwise
307 | merely skip updating the key and continue.
308 | If the key is already present and not revoked,
309 | refresh it from the keyserver determined in the same
310 | manner as above. If it is present and revoked, do nothing
311 | for that particular key.
312 |
313 |
317 |
322 |
323 |
324 |
325 |
326 |
327 |
328 | To ensure authenticity of a keylist during an update, the
329 | client MUST verify that the keylist's data matches its
330 | cryptographic signature, and that the public key used to
331 | verify the signature matches the authority key fingerprint
332 | given by the user.
333 |
334 |
335 | For enhanced security, it is RECOMMENDED that keylist
336 | operators sign each public key listed in their keylist with
337 | the authority private key. This way, an organization can
338 | have an internal trust relationship without requiring
339 | members of the organization to certify each other's public
340 | keys.
341 |
342 |
343 |
344 |
345 |
346 | The following are format specifications for the keylist file and
347 | its signature file.
348 |
349 |
350 |
351 | The keylist MUST be a valid JavaScript Object Notation
352 | (JSON) Data Interchange Format
353 | object with specific keys
354 | and values, as defined below. Note that unless otherwise specified,
355 | 'key' in this section refers to JSON keys -- not OpenPGP keys.
356 |
357 |
358 | To encode metadata, the keylist MUST have a "metadata" root key
359 | with an object as the value ("metadata object").
360 | The metadata object MUST contain a "signature_uri" key whose value
361 | is the URI string of the keylist's signature file. All metadata keys
362 | apart from "signature_uri" are OPTIONAL.
363 |
364 |
365 | The metadata object MAY contain a "keyserver" key with the value of the
366 | URI string of a HKP keyserver from which the OpenPGP keys in the keylist
367 | should be retrieved. Each PGP key listed in the keylist MAY have a
368 | "keyserver" JSON key; if a PGP key in the keylist specifies a HKP keyserver that is
369 | different from the one described in the metadata object, the PGP key-specific
370 | keyserver should be used to retrieve that particular key (and not the key listed
371 | in the metadata object).
372 |
373 |
374 | The metadata object MAY contain a "comment" key with the
375 | value of any string. The metadata object MAY also contain other arbitrary
376 | key-value pairs.
377 |
378 |
382 |
383 | The keylist MUST have a "keys" key with an array as the value.
384 | This array contains a list of OpenPGP key fingerprints and
385 | metadata about them. Each item in the array MUST be an object.
386 | Each of these objects MUST have a "fingerprint" key with the
387 | value of a string that contains the full 40-character
388 | hexadecimal public key fingerprint, as defined in OpenPGP
389 | Message Format
390 |
391 | . Any number of space characters (' ', U+0020) MAY be included
392 | at any location in the fingerprint string. These objects MAY
393 | contain "name" (the name of the PGP key's owner), "email"
394 | (an email of the PGP key's owner), "keyserver" (a HKP keyserver
395 | from which the key should be retrieved), and "comment" key-value pairs,
396 | as well as any other key-value pairs.
397 |
402 |
403 |
404 | The following is an example of a valid keylist.
405 |
406 |
407 |
408 | {
409 | "metadata": {
410 | "signature_uri": "https://www.example.com/keylist.json.asc",
411 | "comment": "This is an example of a keylist file"
412 | },
413 | "keys": [
414 | {
415 | "fingerprint": "927F419D7EC82C2F149C1BD1403C2657CD994F73",
416 | "name": "Micah Lee",
417 | "email": "micah.lee@theintercept.com",
418 | "comment": "Each key can have a comment"
419 | },
420 | {
421 | "fingerprint": "1326CB162C6921BF085F8459F3C78280DDBF52A1",
422 | "name": "R. Miles McCain",
423 | "email": "0@rmrm.io",
424 | "keyserver": "https://keys.openpgp.org/"
425 | },
426 | {
427 | "fingerprint": "E0BE0804CF04A65C1FC64CC4CAD802E066046C02",
428 | "name": "Nat Welch",
429 | "email": "nat.welch@firstlook.org"
430 | }
431 | ]
432 | }
433 |
434 |
435 |
436 |
437 |
438 | The signature file MUST be an ASCII-armored 'detached
439 | signature' of the keylist file, as defined in OpenPGP
440 | Message Format
441 |
442 | .
443 |
444 |
445 |
446 |
447 | Keylists SHOULD NOT be well-known resources .
448 | To subscribe to a keylist, the client must be aware not only of the keylist's
449 | location, but also of the fingerprint of the authority public key used to sign the keylist.
450 | Furthermore, because keylists can reference public keys from several different domains,
451 | the expected host of the well-known location for a keylist may not always be self-evident.
452 |
453 |
454 |
455 |
456 |
457 | GPG Sync, an open source program created by one of the authors,
458 | implements this experimental standard. GPG Sync is used by First
459 | Look Media and the Freedom of the Press Foundation to keep
460 | OpenPGP keys in sync across their organizations, as well as to
461 | publish their employee's OpenPGP keys to the world. These
462 | organizations collectively employ more than 200 people and have
463 | used the system described in this document successfully for
464 | multiple years.
465 |
466 |
467 | GPG Sync's existing code can be found at
468 | <https://github.com/firstlookmedia/gpgsync>
469 |
470 |
471 | First Look Media's keylist file can be found at
472 | <https://github.com/firstlookmedia/gpgsync-firstlook-fingerprints>
473 |
474 |
475 |
476 |
477 |
478 | The keylist subscription functionality defined in this
479 | document provides a number of security benefits, including:
480 |
481 |
482 |
483 |
484 | The ability for new keys to be quickly distributed
485 | across an organization.
486 |
487 |
488 | Removing the complexity of key distribution from
489 | end users, allowing them to focus on the content of
490 | their communications rather than on key management.
491 |
492 |
493 | The ability for an organization to prevent the
494 | spread of falsely attributed keys by centralizing
495 | the public key discovery process within their
496 | organization without centralized public key hosting.
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 | Unlike Web Key Directories, keylists are not domain specific. A keylist
506 | might contain public key fingerprints for email addresses across several
507 | different domains. Moreover, keylists only provide references to public
508 | keys by way of fingerprints; Web Key Directories provide the public keys
509 | themselves.
510 |
511 |
512 |
513 |
514 | A keylist MAY reference public keys corresponding to email addresses
515 | across several different domains. Because managing OPENPGPKEY DNS Records
516 | for a particular domain requires control of that
517 | domain, the OPENPGPKEY DNS Record system is not suitable for cases in
518 | which keys are strewn about several different domains, including ones
519 | outside of the control of an organization's system adminitrators.
520 |
521 |
522 |
523 |
524 |
525 |
526 | There is a situation in which keylist subscriptions could
527 | pose a potential security threat. If both the authority
528 | key and the keylist distribution system were to be
529 | compromised, it would be possible for an attacker to
530 | distribute any key of their choosing to the subscribers of the
531 | keylist. The potential consequences of this attack are limited,
532 | however, because the attacker cannot remove or modify the keys
533 | already present on subscribers' systems.
534 |
535 |
536 | Some organizations may wish to keep their keylists private. While
537 | this may be achievable by serving keylists at URIs only accessible from
538 | specific subnets, keylists are designed to be public
539 | documents. As such, clients may leak the contents of keylists to
540 | keyservers -- this specification ensures to the best of its ability
541 | the integrity of keylists, but not the privacy of keylists.
542 |
543 |
544 |
545 |
546 |
547 | This document has no actions for IANA.
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
558 |
559 |
560 |
561 |
564 |
565 |
566 |
--------------------------------------------------------------------------------
/submissions/draft-mccain-keylist-00.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
12 |
13 |
16 |
17 | Distributing OpenPGP Keys with Signed Keylist Subscriptions
18 |
19 |
20 |
21 | First Look Media
22 |
23 |
24 |
25 | ietf@sendmiles.email
26 |
27 |
28 | https://rmrm.io
29 |
30 |
31 |
32 |
33 |
34 | The Intercept
35 |
36 |
37 |
38 | micah.lee@theintercept.com
39 |
40 |
41 | https://micahflee.com/
42 |
43 |
44 |
45 |
46 |
47 | First Look Media
48 |
49 |
50 |
51 | nat.welch@firstlook.media
52 |
53 |
54 | https://natwelch.com
55 |
56 |
57 |
58 |
59 |
60 | Security
61 |
62 |
63 | OpenPGP
64 |
65 |
66 | GPGSync
67 |
68 |
69 | GPG
70 |
71 |
72 | Keylist
73 |
74 |
75 |
76 | This document specifies a system by which an OpenPGP client may
77 | subscribe to an organization's keylist to keep its internal
78 | keystore up-to-date. Ensuring that all members of an
79 | organization have their colleagues' most recent PGP public keys
80 | is critical to maintaining operational security. Without the
81 | most recent keys and a source of trust for those keys (as this
82 | document specifies), users must manually update and sign each
83 | others keys -- a system that is untenable in larger
84 | organizations. This document proposes a standard format for the
85 | keylist file as well as requirements for clients who wish to
86 | implement keylist subscription functionality.
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 | This document specifies a system by which clients may subscribe
96 | to cryptographically signed keylists. This system allows for
97 | seamless key rotation across entire organizations and enhances
98 | operational security. To enable cross-client compatibility, this
99 | document provides a standard format for the keylist, its
100 | cryptographic verification, and the method by which it is
101 | retreived by the client. The user interface by which a client
102 | provides this functionality to the user is out of scope, as is
103 | the process by which the client retrieves public keys. Other
104 | non-security-related implementation details are also out of
105 | scope.
106 |
107 |
108 |
109 | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
110 | "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
111 | and "OPTIONAL" in this document are to be interpreted as
112 | described in
113 |
114 | .
115 |
116 |
117 |
118 |
119 | This document uses the terms "OpenPGP", "public key",
120 | "private key", "signature", and "fingerprint" as defined by
121 | OpenPGP Message Format
122 |
123 | .
124 |
125 |
126 |
128 |
130 |
131 | The term "keylist" is defined as a list of OpenPGP public
132 | keys identified by their fingerprints and accessible via a
133 | URI. The exact format of this data is specified in
134 |
135 | .
136 |
137 |
141 |
142 |
143 | An "authority key" is defined as the OpenPGP secret key used
144 | to sign a particular keylist. Every keylist has a
145 | corresponding authority key, and every authority key has at
146 | least one corresponding keylist. A single authority key
147 | SHOULD NOT be used to sign multiple keylists.
148 |
149 |
154 |
160 |
161 | To be "subscribed" to a keylist means that a program will
162 | retreive that keylist on a regular interval. After
163 | retrieval, that program will perform an update to an
164 | internal OpenPGP keystore.
165 |
166 |
167 |
168 | A "client" is a program that allows the user to subscribe to
169 | keylists. A client may be an OpenPGP client itself or a
170 | separate program that interfaces with an OpenPGP client to
171 | update its keystore.
172 |
173 |
174 |
175 |
176 |
177 | As new keys are created and other keys are revoked, it is
178 | critical that all members of an organization have the most
179 | recent set of keys available on their computers. Keylists enable
180 | organizations to publish a directory of OpenPGP keys that
181 | clients can use to keep their internal keystores up-to-date.
182 |
183 |
184 |
185 | A single client may subscribe to any number of keylists.
186 | When a client first subscribes to a keylist, it SHOULD
187 | update or import every key present in the keylist into its
188 | local keystore. Keylist subscriptions SHOULD be persistent
189 | --that is, they should be permanently stored by the client
190 | to enable future automatic updates.
191 |
192 |
193 | To subscribe to a keylist, the client must be aware of the
194 | keylist URI (defined in
195 |
196 | ), the keylist's signature URI, and the fingerprint of the
197 | authority key used to sign the keylist. The protocol used to
198 | retrieve thbe keylist and its signature SHOULD be HTTPS (see
199 |
200 | ), however other implementation are possible. A client
201 | implementing keylist functionality MUST support the
202 | retrieval of keylists and signatures over HTTPS. All other
203 | protocols are OPTIONAL.
204 |
205 |
206 | A client MUST NOT employ a trust-on-first-use model for
207 | determining the fingerprint of the authority key; it must be
208 | explicitly provided by the user.
209 |
210 |
211 | The process by which the client stores its keylist
212 | subscriptions is out of scope, as is the means by which
213 | subscription functionality is exposed to the end-user.
214 |
215 |
216 |
217 |
218 | The primary purpose of keylists is to enable periodic
219 | updates of OpenPGP clients' internal keystores. We RECOMMEND
220 | that clients provide a default refresh interval of less than
221 | one day, however we also RECOMMEND that clients allow the
222 | user to select this interval. The exact time at which
223 | updates are performed is not critical.
224 |
225 |
226 | To perform an update, the client MUST perform the following
227 | steps on each keylist to which it is subscribed. The steps
228 | SHOULD be performed in the given order.
229 |
230 |
231 |
232 |
233 | Obtain a current copy of the keylist from its URI.
234 |
235 |
236 | Obtain a current copy of the keylist's signature
237 | data from its URI.
238 |
239 |
246 |
248 |
249 | Using the keylist and the keylist's signature,
250 | cryptographically verify that the keylist was signed
251 | using the authority key. If the signature does not
252 | verify, the client MUST abort the update of this
253 | keylist and SHOULD alert the user. The client SHOULD
254 | NOT abort the update of other keylists to which it
255 | is subscribed, unless they too fail signature
256 | verification.
257 |
258 |
259 | Validate the format of the keylist according to
260 |
261 | . If the keylist is in an invalid format, the client
262 | MUST abort the update this keylist and SHOULD alert
263 | the user.
264 |
265 |
266 | For each fingerprint listed in the keyfile, if a
267 | copy of the associated public key is not present in
268 | the client's local keystore, retrieve it from a
269 | keyserver. If it is already present and not revoked,
270 | refresh it from a keyserver. If it is present and
271 | revoked, ignore it. The method by which keys are
272 | retrieved and updated is out of scope.
273 |
274 |
278 |
283 |
284 |
285 |
286 |
287 |
289 |
290 | To ensure authenticity of a keylist during an update, the
291 | client MUST verify that the keylist's data matches its
292 | cryptographic signature, and that the public key used to
293 | verify the signature matches the authority key fingerprint
294 | given by the user.
295 |
296 |
297 | For enhanced security, it is RECOMMENDED that keylist
298 | operators sign each public key listed in their keylist with
299 | the authority private key. This way, an organization can
300 | have an internal trust relationship without requiring
301 | members of the organization to certify each other's public
302 | keys.
303 |
304 |
305 |
306 |
307 |
308 | The following are definitions of the data types we will be
309 | creating to support this new feature set.
310 |
311 |
312 |
313 | The keylist MUST be encoded in UTF-8
314 |
315 | . Each line MUST begin either with a comment, a public key
316 | fingerprint, or whitespace. A comment is defined as a string
317 | of characters between a hash symbol (#, U+0023) and a
318 | newline or an end of file (EOF). The keylist SHOULD end with
319 | a newline. The fingerprint MUST be the full 40-character
320 | hexadecimal public key fingerprint, as defined in OpenPGP
321 | Message Format
322 |
323 | . Space characters (' ', U+0020) MAY be included anywhere in
324 | the fingerprint. Lines SHOULD NOT exceed 128 characters in
325 | length.
326 |
327 |
328 | It is RECOMMENDED that keylist maintainers describe each key
329 | using a comment, for example:
330 |
331 |
332 | 1326 CB16 ... DDBF 52A1 # Miles' Key
333 |
334 |
335 |
336 |
340 |
342 |
343 | To extract the public key fingerprints from a keylist, a
344 | client SHOULD perform the following steps, in order:
345 |
346 |
347 |
348 |
349 | Strip the keylist of all comments, as defined above,
350 | including the preceding hash symbol but excluding
351 | the trailing newline.
352 |
353 |
354 | Strip the keylist of all non-breaking whitespace.
355 |
356 |
357 |
358 |
359 | Performing these steps will result in one public key
360 | fingerprint per line.
361 |
362 |
363 |
365 |
367 |
369 |
371 |
372 |
373 |
374 | The signature file MUST be an ASCII-armored 'detached
375 | signature' of the keylist file, as defined in OpenPGP
376 | Message Format
377 |
378 | .
379 |
380 |
387 |
390 |
391 |
392 |
393 |
394 | GPG Sync, an open source program created by one of the authors,
395 | implements this experimental standard. GPG Sync is used by First
396 | Look Media and the Freedom of the Press Foundation to keep
397 | OpenPGP keys in sync across their organizations, as well as to
398 | publish their employee's OpenPGP keys to the world. These
399 | organizations collectively employ more than 200 people and have
400 | used the system described in this document successfully for
401 | multiple years.
402 |
403 |
404 | GPG Sync's existing code can be found at
405 | <https://github.com/firstlookmedia/gpgsync>
406 |
407 |
408 | First Look Media's keylist file can be found at
409 | <https://github.com/firstlookmedia/gpgsync-firstlook-fingerprints>
410 |
411 |
412 |
413 |
414 |
415 |
416 | The keylist subscription functionality defined in this
417 | document provide a number of security benefits, including:
418 |
419 |
420 |
421 |
422 | The ability for new keys to be quickly distributed
423 | across an organization.
424 |
425 |
426 | It removes the complexity of key distribution from
427 | end users, allowing them to focus on the content of
428 | their communications rather than on key management.
429 |
430 |
431 | The ability for an organization to prevent the
432 | spread of falsely attributed keys by centralizing
433 | the public key discovery process within their
434 | organization.
435 |
436 |
437 |
438 |
439 |
440 |
441 |
442 | There is a situation in which keylist subscriptions could
443 | pose a potential security threat. If the authority key and
444 | the keylist distribution system were to both be compromised,
445 | it would be possible for an attacker to distribute false
446 | keys. We believe, however, that the security benefits of
447 | this system strongly outweigh the drawbacks.
448 |
449 |
450 | If the client does not perform an update regularly, there is
451 | the possibility that keys will be just as outdated as they
452 | would be without a keylist subscription.
453 |
454 |
455 |
456 |
457 |
458 |
459 | This document has no actions for IANA.
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 |
468 |
469 |
470 |
471 |
474 |
475 |
476 |
--------------------------------------------------------------------------------
/submissions/draft-mccain-keylist-01.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
12 |
13 |
16 |
17 | Distributing OpenPGP Keys with Signed Keylist Subscriptions
18 |
19 |
20 |
21 | First Look Media
22 |
23 |
24 |
25 | ietf@sendmiles.email
26 |
27 |
28 | https://rmrm.io
29 |
30 |
31 |
32 |
33 |
34 | The Intercept
35 |
36 |
37 |
38 | micah.lee@theintercept.com
39 |
40 |
41 | https://micahflee.com/
42 |
43 |
44 |
45 |
46 |
47 | First Look Media
48 |
49 |
50 |
51 | nat.welch@firstlook.media
52 |
53 |
54 | https://natwelch.com
55 |
56 |
57 |
58 |
59 |
60 | Security
61 |
62 |
63 | OpenPGP
64 |
65 |
66 | GPGSync
67 |
68 |
69 | GPG
70 |
71 |
72 | Keylist
73 |
74 |
75 |
76 | This document specifies a system by which an OpenPGP client may
77 | subscribe to an organization's keylist to keep its internal
78 | keystore up-to-date. Ensuring that all members of an
79 | organization have their colleagues' most recent PGP public keys
80 | is critical to maintaining operational security. Without the
81 | most recent keys and a source of trust for those keys (as this
82 | document specifies), users must manually update and sign each
83 | others keys -- a system that is untenable in larger
84 | organizations. This document proposes a experimental format for
85 | the keylist file as well as requirements for clients who wish to
86 | implement this experimental keylist subscription functionality.
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 | This document specifies a system by which clients may subscribe
96 | to cryptographically signed keylists. This system allows for
97 | seamless key rotation across entire organizations and enhances
98 | operational security. To enable cross-client compatibility, this
99 | document provides a experimental format for the keylist, its
100 | cryptographic verification, and the method by which it is
101 | retreived by the client. The user interface by which a client
102 | provides this functionality to the user is out of scope, as is
103 | the process by which the client retrieves public keys. Other
104 | non-security-related implementation details are also out of
105 | scope.
106 |
107 |
108 |
109 | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
110 | "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
111 | and "OPTIONAL" in this document are to be interpreted as
112 | described in
113 |
114 | .
115 |
116 |
117 |
118 |
119 | This document uses the terms "OpenPGP", "public key",
120 | "private key", "signature", and "fingerprint" as defined by
121 | OpenPGP Message Format
122 |
123 | .
124 |
125 |
126 |
128 |
130 |
131 | The term "keylist" is defined as a list of OpenPGP public
132 | keys identified by their fingerprints and accessible via a
133 | URI. The exact format of this data is specified in
134 |
135 | .
136 |
137 |
141 |
142 |
143 | An "authority key" is defined as the OpenPGP secret key used
144 | to sign a particular keylist. Every keylist has a
145 | corresponding authority key, and every authority key has at
146 | least one corresponding keylist. A single authority key
147 | SHOULD NOT be used to sign multiple keylists.
148 |
149 |
154 |
160 |
161 | To be "subscribed" to a keylist means that a program will
162 | retreive that keylist on a regular interval. After
163 | retrieval, that program will perform an update to an
164 | internal OpenPGP keystore.
165 |
166 |
167 |
168 | A "client" is a program that allows the user to subscribe to
169 | keylists. A client may be an OpenPGP client itself or a
170 | separate program that interfaces with an OpenPGP client to
171 | update its keystore.
172 |
173 |
174 |
175 | RFC Editor: please remove this section prior to
176 | publication.
177 | Development of this Internet draft takes place on GitHub at
178 | Keylist-RFC.
180 |
181 | A mailing list is available for discussion at Keylists
183 | mailing list.
184 |
185 |
186 |
187 |
188 | As new keys are created and other keys are revoked, it is
189 | critical that all members of an organization have the most
190 | recent set of keys available on their computers. Keylists enable
191 | organizations to publish a directory of OpenPGP keys that
192 | clients can use to keep their internal keystores up-to-date.
193 |
194 |
195 |
196 | A single client may subscribe to any number of keylists.
197 | When a client first subscribes to a keylist, it SHOULD
198 | update or import every key present in the keylist into its
199 | local keystore. Keylist subscriptions SHOULD be persistent
200 | --that is, they should be permanently stored by the client
201 | to enable future automatic updates.
202 |
203 |
204 | To subscribe to a keylist, the client must be aware of the
205 | keylist URI (defined in
206 |
207 | ), the keylist's signature URI, and the fingerprint of the
208 | authority key used to sign the keylist. The protocol used to
209 | retrieve thbe keylist and its signature SHOULD be HTTPS (see
210 |
211 | ), however other implementation are possible. A client
212 | implementing keylist functionality MUST support the
213 | retrieval of keylists and signatures over HTTPS. All other
214 | protocols are OPTIONAL.
215 |
216 |
217 | A client MUST NOT employ a trust-on-first-use model for
218 | determining the fingerprint of the authority key; it must be
219 | explicitly provided by the user.
220 |
221 |
222 | The process by which the client stores its keylist
223 | subscriptions is out of scope, as is the means by which
224 | subscription functionality is exposed to the end-user.
225 |
226 |
227 |
228 |
229 | The primary purpose of keylists is to enable periodic
230 | updates of OpenPGP clients' internal keystores. We RECOMMEND
231 | that clients provide a default refresh interval of less than
232 | one day, however we also RECOMMEND that clients allow the
233 | user to select this interval. The exact time at which
234 | updates are performed is not critical.
235 |
236 |
237 | To perform an update, the client MUST perform the following
238 | steps on each keylist to which it is subscribed. The steps
239 | SHOULD be performed in the given order.
240 |
241 |
242 |
243 |
244 | Obtain a current copy of the keylist from its URI.
245 |
246 |
247 | Obtain a current copy of the keylist's signature
248 | data from its URI.
249 |
250 |
257 |
259 |
260 | Using the keylist and the keylist's signature,
261 | cryptographically verify that the keylist was signed
262 | using the authority key. If the signature does not
263 | verify, the client MUST abort the update of this
264 | keylist and SHOULD alert the user. The client SHOULD
265 | NOT abort the update of other keylists to which it
266 | is subscribed, unless they too fail signature
267 | verification.
268 |
269 |
270 | Validate the format of the keylist according to
271 |
272 | . If the keylist is in an invalid format, the client
273 | MUST abort the update this keylist and SHOULD alert
274 | the user.
275 |
276 |
277 | For each fingerprint listed in the keyfile, if a
278 | copy of the associated public key is not present in
279 | the client's local keystore, retrieve it from a
280 | keyserver. If it is already present and not revoked,
281 | refresh it from a keyserver. If it is present and
282 | revoked, ignore it. The method by which keys are
283 | retrieved and updated is out of scope.
284 |
285 |
289 |
294 |
295 |
296 |
297 |
298 |
300 |
301 | To ensure authenticity of a keylist during an update, the
302 | client MUST verify that the keylist's data matches its
303 | cryptographic signature, and that the public key used to
304 | verify the signature matches the authority key fingerprint
305 | given by the user.
306 |
307 |
308 | For enhanced security, it is RECOMMENDED that keylist
309 | operators sign each public key listed in their keylist with
310 | the authority private key. This way, an organization can
311 | have an internal trust relationship without requiring
312 | members of the organization to certify each other's public
313 | keys.
314 |
315 |
316 |
317 |
318 |
319 | The following are definitions of the data types we will be
320 | creating to support this new feature set.
321 |
322 |
323 |
324 | The keylist MUST be encoded in UTF-8
325 |
326 | . Each line MUST begin either with a comment, a public key
327 | fingerprint, or whitespace. A comment is defined as a string
328 | of characters between a hash symbol (#, U+0023) and a
329 | newline or an end of file (EOF). The keylist SHOULD end with
330 | a newline. The fingerprint MUST be the full 40-character
331 | hexadecimal public key fingerprint, as defined in OpenPGP
332 | Message Format
333 |
334 | . Space characters (' ', U+0020) MAY be included anywhere in
335 | the fingerprint. Lines SHOULD NOT exceed 128 characters in
336 | length.
337 |
338 |
339 | It is RECOMMENDED that keylist maintainers describe each key
340 | using a comment, for example:
341 |
342 |
343 | 1326 CB16 ... DDBF 52A1 # Miles' Key
344 |
345 |
346 |
347 |
351 |
353 |
354 | To extract the public key fingerprints from a keylist, a
355 | client SHOULD perform the following steps, in order:
356 |
357 |
358 |
359 |
360 | Strip the keylist of all comments, as defined above,
361 | including the preceding hash symbol but excluding
362 | the trailing newline.
363 |
364 |
365 | Strip the keylist of all non-breaking whitespace.
366 |
367 |
368 |
369 |
370 | Performing these steps will result in one public key
371 | fingerprint per line.
372 |
373 |
374 |
376 |
378 |
380 |
382 |
383 |
384 |
385 | The signature file MUST be an ASCII-armored 'detached
386 | signature' of the keylist file, as defined in OpenPGP
387 | Message Format
388 |
389 | .
390 |
391 |
398 |
401 |
402 |
403 |
404 |
405 | GPG Sync, an open source program created by one of the authors,
406 | implements this experimental standard. GPG Sync is used by First
407 | Look Media and the Freedom of the Press Foundation to keep
408 | OpenPGP keys in sync across their organizations, as well as to
409 | publish their employee's OpenPGP keys to the world. These
410 | organizations collectively employ more than 200 people and have
411 | used the system described in this document successfully for
412 | multiple years.
413 |
414 |
415 | GPG Sync's existing code can be found at
416 | <https://github.com/firstlookmedia/gpgsync>
417 |
418 |
419 | First Look Media's keylist file can be found at
420 | <https://github.com/firstlookmedia/gpgsync-firstlook-fingerprints>
421 |
422 |
423 |
424 |
425 |
426 |
427 | The keylist subscription functionality defined in this
428 | document provide a number of security benefits, including:
429 |
430 |
431 |
432 |
433 | The ability for new keys to be quickly distributed
434 | across an organization.
435 |
436 |
437 | It removes the complexity of key distribution from
438 | end users, allowing them to focus on the content of
439 | their communications rather than on key management.
440 |
441 |
442 | The ability for an organization to prevent the
443 | spread of falsely attributed keys by centralizing
444 | the public key discovery process within their
445 | organization.
446 |
447 |
448 |
449 |
450 |
451 |
452 |
453 | There is a situation in which keylist subscriptions could
454 | pose a potential security threat. If the both the authority
455 | key and the keylist distribution system were to be
456 | compromised, it would be possible for an attacker to
457 | distribute false keys. We believe, however, that the
458 | security benefits of this system strongly outweigh the
459 | drawbacks.
460 |
461 |
462 |
463 |
464 |
465 |
466 | This document has no actions for IANA.
467 |
468 |
469 |
470 |
471 |
472 |
473 |
474 |
475 |
476 |
477 |
478 |
481 |
482 |
483 |
--------------------------------------------------------------------------------
/submissions/draft-mccain-keylist-02.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
12 |
13 |
16 |
17 | Distributing OpenPGP Keys with Signed Keylist Subscriptions
18 |
19 |
20 |
21 | First Look Media
22 |
23 |
24 |
25 | ietf@sendmiles.email
26 |
27 |
28 | https://rmrm.io
29 |
30 |
31 |
32 |
33 |
34 | The Intercept
35 |
36 |
37 |
38 | micah.lee@theintercept.com
39 |
40 |
41 | https://micahflee.com/
42 |
43 |
44 |
45 |
46 |
47 | First Look Media
48 |
49 |
50 |
51 | nat.welch@firstlook.media
52 |
53 |
54 | https://natwelch.com
55 |
56 |
57 |
58 |
59 |
60 | Security
61 |
62 |
63 | OpenPGP
64 |
65 |
66 | GPGSync
67 |
68 |
69 | GPG
70 |
71 |
72 | Keylist
73 |
74 |
75 |
76 | This document specifies a system by which an OpenPGP client may
77 | subscribe to an organization's keylist to keep its internal
78 | keystore up-to-date. Ensuring that all members of an
79 | organization have their colleagues' most recent PGP public keys
80 | is critical to maintaining operational security. Without the
81 | most recent keys and a source of trust for those keys (as this
82 | document specifies), users must manually update and sign each
83 | others keys -- a system that is untenable in larger
84 | organizations. This document proposes a experimental format for
85 | the keylist file as well as requirements for clients who wish to
86 | implement this experimental keylist subscription functionality.
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 | This document specifies a system by which clients may subscribe
96 | to cryptographically signed keylists. This system allows for
97 | seamless key rotation across entire organizations and enhances
98 | operational security. To enable cross-client compatibility, this
99 | document provides a experimental format for the keylist, its
100 | cryptographic verification, and the method by which it is
101 | retreived by the client. The user interface by which a client
102 | provides this functionality to the user is out of scope, as is
103 | the process by which the client retrieves public keys. Other
104 | non-security-related implementation details are also out of
105 | scope.
106 |
107 |
108 |
109 | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
110 | "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
111 | and "OPTIONAL" in this document are to be interpreted as
112 | described in
113 |
114 | .
115 |
116 |
117 |
118 |
119 | This document uses the terms "OpenPGP", "public key",
120 | "private key", "signature", and "fingerprint" as defined by
121 | OpenPGP Message Format
122 |
123 | .
124 |
125 |
126 |
128 |
130 |
131 | The term "keylist" is defined as a list of OpenPGP public
132 | key fingerprints and accessible via a URI. The exact format
133 | of this data is specified in
134 |
135 | .
136 |
137 |
141 |
142 |
143 | An "authority key" is defined as the OpenPGP secret key used
144 | to sign a particular keylist. Every keylist has a
145 | corresponding authority key, and every authority key has at
146 | least one corresponding keylist. A single authority key
147 | SHOULD NOT be used to sign multiple keylists.
148 |
149 |
154 |
160 |
161 | To be "subscribed" to a keylist means that a program will
162 | retreive that keylist on a regular interval. After
163 | retrieval, that program will perform an update to an
164 | internal OpenPGP keystore.
165 |
166 |
167 |
168 | A "client" is a program that allows the user to subscribe to
169 | keylists. A client may be an OpenPGP client itself or a
170 | separate program that interfaces with an OpenPGP client to
171 | update its keystore.
172 |
173 |
174 |
175 | RFC Editor: please remove this section prior to
176 | publication.
177 | Development of this Internet draft takes place on GitHub at
178 | Keylist-RFC.
180 |
181 | A mailing list is available for discussion at Keylists
183 | mailing list.
184 |
185 |
186 |
187 |
188 | As new keys are created and other keys are revoked, it is
189 | critical that all members of an organization have the most
190 | recent set of keys available on their computers. Keylists enable
191 | organizations to publish a directory of OpenPGP keys that
192 | clients can use to keep their internal keystores up-to-date.
193 |
194 |
195 |
196 | A single client may subscribe to any number of keylists.
197 | When a client first subscribes to a keylist, it SHOULD
198 | update or import every key present in the keylist into its
199 | local keystore. Keylist subscriptions SHOULD be persistent
200 | --that is, they should be permanently stored by the client
201 | to enable future automatic updates.
202 |
203 |
204 | To subscribe to a keylist, the client must be aware of the
205 | keylist URI (see ), and the
206 | fingerprint of the authority key used to sign the
207 | keylist. The protocol used to retrieve the keylist and its
208 | signature SHOULD be HTTPS (see ),
209 | however other implementation MAY be supported. A client
210 | implementing keylist functionality MUST support the
211 | retrieval of keylists and signatures over HTTPS. All other
212 | protocols are OPTIONAL.
213 |
214 |
215 | A client MUST NOT employ a trust-on-first-use model for
216 | determining the fingerprint of the authority key; it must be
217 | explicitly provided by the user.
218 |
219 |
220 | The process by which the client stores its keylist
221 | subscriptions is out of scope, as is the means by which
222 | subscription functionality is exposed to the end-user.
223 |
224 |
225 |
226 |
227 | The primary purpose of keylists is to enable periodic
228 | updates of OpenPGP clients' internal keystores. We RECOMMEND
229 | that clients provide a default refresh interval of less than
230 | one day, however we also RECOMMEND that clients allow the
231 | user to select this interval. The exact time at which
232 | updates are performed is not critical.
233 |
234 |
235 | To perform an update, the client MUST perform the following
236 | steps on each keylist to which it is subscribed. The steps
237 | SHOULD be performed in the given order.
238 |
239 |
240 |
241 |
242 | Obtain a current copy of the keylist from its URI.
243 |
244 |
245 | Obtain a current copy of the keylist's signature
246 | data from its URI, which is included in the keylist data
247 | format specified in .
248 |
249 |
256 |
258 |
259 | Using the keylist and the keylist's signature,
260 | cryptographically verify that the keylist was signed
261 | using the authority key. If the signature does not
262 | verify, the client MUST abort the update of this
263 | keylist and SHOULD alert the user. The client SHOULD
264 | NOT abort the update of other keylists to which it
265 | is subscribed, unless they too fail signature
266 | verification.
267 |
268 |
269 | Validate the format of the keylist according to
270 |
271 | . If the keylist is in an invalid format, the client
272 | MUST abort the update this keylist and SHOULD alert
273 | the user.
274 |
275 |
276 | For each fingerprint listed in the keyfile, if a
277 | copy of the associated public key is not present in
278 | the client's local keystore, retrieve it from the
279 | keyserver specified by the keylist (see
280 | ) or, if the keylist specifies
281 | no keyserver, from any keyserver.
282 | If the key is already present and not revoked,
283 | refresh it from a keyserver. If it is present and
284 | revoked, do nothing.
285 |
286 |
290 |
295 |
296 |
297 |
298 |
299 |
300 |
301 | To ensure authenticity of a keylist during an update, the
302 | client MUST verify that the keylist's data matches its
303 | cryptographic signature, and that the public key used to
304 | verify the signature matches the authority key fingerprint
305 | given by the user.
306 |
307 |
308 | For enhanced security, it is RECOMMENDED that keylist
309 | operators sign each public key listed in their keylist with
310 | the authority private key. This way, an organization can
311 | have an internal trust relationship without requiring
312 | members of the organization to certify each other's public
313 | keys.
314 |
315 |
316 |
317 |
318 |
319 | The following are format specifications for the keylist file and
320 | its signature file.
321 |
322 |
323 |
324 | The keylist MUST be a valid JavaScript Object Notation
325 | (JSON) Data Interchange Format
326 | object with specific keys
327 | and values, as defined below. Note that unless otherwise specified,
328 | 'key' in this section refers to JSON keys--not OpenPGP keys.
329 |
330 |
331 | To encode metadata, the keylist MUST have a "metadata" root key
332 | with an object as the value ("metadata object").
333 | The metadata object MUST contain a "signature_uri" key whose value
334 | is the URI string of the keylist's signature file. All metadata keys
335 | apart from "signature_uri" are OPTIONAL.
336 |
337 |
338 | The metadata object MAY contain a "keyserver" key with the value of the
339 | URI string of the keyserver from which the OpenPGP keys in the keylist
340 | should be retrieved.
341 |
342 |
343 | The metadata object MAY contain a "comment" key with the
344 | value of any string. The metadata object MAY also contain other arbitrary
345 | key-value pairs.
346 |
347 |
351 |
352 | The keylist MUST have a "keys" key with an array as the value.
353 | This array contains a list of OpenPGP key fingerprints and
354 | metadata about them. Each item in the array MUST be an object.
355 | Each of these objects MUST have a "fingerprint" key with the
356 | value of a string that contains the full 40-character
357 | hexadecimal public key fingerprint, as defined in OpenPGP
358 | Message Format
359 |
360 | . Any number of space characters (' ', U+0020) MAY be included
361 | at any location in the fingerprint string. These objects MAY
362 | contain "name", "email", and "comment" key-value pairs, as well
363 | as any other key-value pairs relevant.
364 |
369 |
370 |
371 | The following is an example of a valid keylist.
372 |
373 |
374 |
375 | {
376 | "metadata": {
377 | "signature_uri": "https://www.example.com/keylist.json.asc"
378 | "comment": "This is an example of a keylist file"
379 | },
380 | "keys": [
381 | {
382 | "fingerprint": "927F419D7EC82C2F149C1BD1403C2657CD994F73",
383 | "name": "Micah Lee",
384 | "email": "micah.lee@theintercept.com",
385 | "comment": "Each key can have a comment"
386 | },
387 | {
388 | "fingerprint": "1326CB162C6921BF085F8459F3C78280DDBF52A1",
389 | "name": "R. Miles McCain",
390 | "email": "0@rmrm.io"
391 | },
392 | {
393 | "fingerprint": "E0BE0804CF04A65C1FC64CC4CAD802E066046C02",
394 | "name": "Nat Welch",
395 | "email": "nat.welch@firstlook.org"
396 | }
397 | ]
398 | }
399 |
400 |
401 |
402 |
403 |
404 | The signature file MUST be an ASCII-armored 'detached
405 | signature' of the keylist file, as defined in OpenPGP
406 | Message Format
407 |
408 | .
409 |
410 |
411 |
412 |
413 |
414 | GPG Sync, an open source program created by one of the authors,
415 | implements this experimental standard. GPG Sync is used by First
416 | Look Media and the Freedom of the Press Foundation to keep
417 | OpenPGP keys in sync across their organizations, as well as to
418 | publish their employee's OpenPGP keys to the world. These
419 | organizations collectively employ more than 200 people and have
420 | used the system described in this document successfully for
421 | multiple years.
422 |
423 |
424 | GPG Sync's existing code can be found at
425 | <https://github.com/firstlookmedia/gpgsync>
426 |
427 |
428 | First Look Media's keylist file can be found at
429 | <https://github.com/firstlookmedia/gpgsync-firstlook-fingerprints>
430 |
431 |
432 |
433 |
434 |
435 |
436 | The keylist subscription functionality defined in this
437 | document provide a number of security benefits, including:
438 |
439 |
440 |
441 |
442 | The ability for new keys to be quickly distributed
443 | across an organization.
444 |
445 |
446 | It removes the complexity of key distribution from
447 | end users, allowing them to focus on the content of
448 | their communications rather than on key management.
449 |
450 |
451 | The ability for an organization to prevent the
452 | spread of falsely attributed keys by centralizing
453 | the public key discovery process within their
454 | organization.
455 |
456 |
457 |
458 |
459 |
460 |
461 |
462 | There is a situation in which keylist subscriptions could
463 | pose a potential security threat. If the both the authority
464 | key and the keylist distribution system were to be
465 | compromised, it would be possible for an attacker to
466 | distribute false keys. We believe, however, that the
467 | security benefits of this system strongly outweigh the
468 | drawbacks.
469 |
470 |
471 |
472 |
473 |
474 |
475 | This document has no actions for IANA.
476 |
477 |
478 |
479 |
480 |
481 |
482 |
483 |
484 |
485 |
486 |
487 |
490 |
491 |
492 |
--------------------------------------------------------------------------------
/submissions/draft-mccain-keylist-03.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
12 |
13 |
16 |
17 | Distributing OpenPGP Keys with Signed Keylist Subscriptions
18 |
19 |
20 |
21 | First Look Media
22 |
23 |
24 |
25 | ietf@sendmiles.email
26 |
27 |
28 | https://rmrm.io
29 |
30 |
31 |
32 |
33 |
34 | The Intercept
35 |
36 |
37 |
38 | micah.lee@theintercept.com
39 |
40 |
41 | https://micahflee.com/
42 |
43 |
44 |
45 |
46 |
47 | Google
48 |
49 |
50 |
51 | nat@natwelch.com
52 |
53 |
54 | https://natwelch.com
55 |
56 |
57 |
58 |
59 |
60 | Security
61 |
62 |
63 | OpenPGP
64 |
65 |
66 | GPGSync
67 |
68 |
69 | GPG
70 |
71 |
72 | Keylist
73 |
74 |
75 |
76 | This document specifies a system by which an OpenPGP client may
77 | subscribe to an organization's keylist to keep its internal
78 | keystore up-to-date. Ensuring that all members of an
79 | organization have their colleagues' most recent PGP public keys
80 | is critical to maintaining operational security. Without the
81 | most recent keys and a source of trust for those keys (as this
82 | document specifies), users must manually update and sign each
83 | others keys -- a system that is untenable in larger
84 | organizations. This document proposes a experimental format for
85 | the keylist file as well as requirements for clients who wish to
86 | implement this experimental keylist subscription functionality.
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 | This document specifies a system by which clients may subscribe
96 | to cryptographically signed keylists. This system allows for
97 | seamless key rotation across entire organizations and enhances
98 | operational security. To enable cross-client compatibility, this
99 | document provides a experimental format for the keylist, its
100 | cryptographic verification, and the method by which it is
101 | retreived by the client. The user interface by which a client
102 | provides this functionality to the user is out of scope, as is
103 | the process by which the client retrieves public keys. Other
104 | non-security-related implementation details are also out of
105 | scope.
106 |
107 |
108 |
109 | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
110 | "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
111 | and "OPTIONAL" in this document are to be interpreted as
112 | described in
113 |
114 | .
115 |
116 |
117 |
118 |
119 | This document uses the terms "OpenPGP", "public key",
120 | "private key", "signature", and "fingerprint" as defined by
121 | OpenPGP Message Format
122 |
123 | .
124 |
125 |
126 |
128 |
130 |
131 | The term "keylist" is defined as a list of OpenPGP public
132 | key fingerprints and accessible via a URI. The exact format
133 | of this data is specified in
134 |
135 | .
136 |
137 |
141 |
142 |
143 | An "authority key" is defined as the OpenPGP secret key used
144 | to sign a particular keylist. Every keylist has a
145 | corresponding authority key, and every authority key has at
146 | least one corresponding keylist. A single authority key
147 | SHOULD NOT be used to sign multiple keylists.
148 |
149 |
154 |
160 |
161 | To be "subscribed" to a keylist means that a program will
162 | retreive that keylist on a regular interval. After
163 | retrieval, that program will perform an update to an
164 | internal OpenPGP keystore.
165 |
166 |
167 |
168 | A "client" is a program that allows the user to subscribe to
169 | keylists. A client may be an OpenPGP client itself or a
170 | separate program that interfaces with an OpenPGP client to
171 | update its keystore.
172 |
173 |
174 |
175 | RFC Editor: please remove this section prior to
176 | publication.
177 | Development of this Internet draft takes place on GitHub at
178 | Keylist-RFC.
180 |
181 | A mailing list is available for discussion at Keylists
183 | mailing list.
184 |
185 |
186 |
187 |
188 | As new keys are created and other keys are revoked, it is
189 | critical that all members of an organization have the most
190 | recent set of keys available on their computers. Keylists enable
191 | organizations to publish a directory of OpenPGP keys that
192 | clients can use to keep their internal keystores up-to-date.
193 |
194 |
195 |
196 | A single client may subscribe to any number of keylists.
197 | When a client first subscribes to a keylist, it SHOULD
198 | update or import every key present in the keylist into its
199 | local keystore. Keylist subscriptions SHOULD be persistent
200 | -- that is, they should be permanently stored by the client
201 | to enable future automatic updates.
202 |
203 |
204 | To subscribe to a keylist, the client must be aware of the
205 | keylist URI (see ), and the
206 | fingerprint of the authority key used to sign the
207 | keylist. The protocol used to retrieve the keylist and its
208 | signature SHOULD be HTTPS (see ),
209 | however other implementation MAY be supported. A client
210 | implementing keylist functionality MUST support the
211 | retrieval of keylists and signatures over HTTPS. All other
212 | protocols are OPTIONAL.
213 |
214 |
215 | A client MUST NOT employ a trust-on-first-use (TOFU) model for
216 | determining the fingerprint of the authority key; it must be
217 | explicitly provided by the user.
218 |
219 |
220 | The process by which the client stores its keylist
221 | subscriptions is out of scope, as is the means by which
222 | subscription functionality is exposed to the end-user.
223 |
224 |
225 |
226 |
227 | The primary purpose of keylists is to enable periodic
228 | updates of OpenPGP clients' internal keystores. We RECOMMEND
229 | that clients provide automatic 'background' update functionality;
230 | we also regonize that automatic background updates are not possible
231 | in every application (specifically cross-platform CLI tools).
232 |
233 | When automatic background updates are provided, we RECOMMEND
234 | that clients provide a default refresh interval of less than
235 | one day, however we also RECOMMEND that clients allow the
236 | user to select this interval. The exact time at which
237 | updates are performed is not critical.
238 |
239 |
240 | To perform an update, the client MUST perform the following
241 | steps on each keylist to which it is subscribed. The steps
242 | SHOULD be performed in the given order.
243 |
244 |
245 |
246 |
247 | Obtain a current copy of the keylist from its URI.
248 |
249 |
250 | Obtain a current copy of the keylist's signature
251 | data from its URI, which is included in the keylist data
252 | format specified in .
253 |
254 |
261 |
263 |
264 | Using the keylist and the keylist's signature,
265 | cryptographically verify that the keylist was signed
266 | using the authority key. If the signature does not
267 | verify, the client MUST abort the update of this
268 | keylist and SHOULD alert the user. The client SHOULD
269 | NOT abort the update of other keylists to which it
270 | is subscribed, unless they too fail signature
271 | verification.
272 |
273 |
274 | Validate the format of the keylist according to
275 |
276 | . If the keylist is in an invalid format, the client
277 | MUST abort the update this keylist and SHOULD alert
278 | the user.
279 |
280 |
281 | For each fingerprint listed in the keyfile, if a
282 | copy of the associated public key is not present in
283 | the client's local keystore, retrieve it from the
284 | keyserver specified by the keylist (see
285 | ) or, if the keylist specifies
286 | no keyserver, from any keyserver.
287 | If the key is already present and not revoked,
288 | refresh it from a keyserver. If it is present and
289 | revoked, do nothing.
290 |
291 |
295 |
300 |
301 |
302 |
303 |
304 |
305 |
306 | To ensure authenticity of a keylist during an update, the
307 | client MUST verify that the keylist's data matches its
308 | cryptographic signature, and that the public key used to
309 | verify the signature matches the authority key fingerprint
310 | given by the user.
311 |
312 |
313 | For enhanced security, it is RECOMMENDED that keylist
314 | operators sign each public key listed in their keylist with
315 | the authority private key. This way, an organization can
316 | have an internal trust relationship without requiring
317 | members of the organization to certify each other's public
318 | keys.
319 |
320 |
321 |
322 |
323 |
324 | The following are format specifications for the keylist file and
325 | its signature file.
326 |
327 |
328 |
329 | The keylist MUST be a valid JavaScript Object Notation
330 | (JSON) Data Interchange Format
331 | object with specific keys
332 | and values, as defined below. Note that unless otherwise specified,
333 | 'key' in this section refers to JSON keys -- not OpenPGP keys.
334 |
335 |
336 | To encode metadata, the keylist MUST have a "metadata" root key
337 | with an object as the value ("metadata object").
338 | The metadata object MUST contain a "signature_uri" key whose value
339 | is the URI string of the keylist's signature file. All metadata keys
340 | apart from "signature_uri" are OPTIONAL.
341 |
342 |
343 | The metadata object MAY contain a "keyserver" key with the value of the
344 | URI string of the keyserver from which the OpenPGP keys in the keylist
345 | should be retrieved.
346 |
347 |
348 | The metadata object MAY contain a "comment" key with the
349 | value of any string. The metadata object MAY also contain other arbitrary
350 | key-value pairs.
351 |
352 |
356 |
357 | The keylist MUST have a "keys" key with an array as the value.
358 | This array contains a list of OpenPGP key fingerprints and
359 | metadata about them. Each item in the array MUST be an object.
360 | Each of these objects MUST have a "fingerprint" key with the
361 | value of a string that contains the full 40-character
362 | hexadecimal public key fingerprint, as defined in OpenPGP
363 | Message Format
364 |
365 | . Any number of space characters (' ', U+0020) MAY be included
366 | at any location in the fingerprint string. These objects MAY
367 | contain "name", "email", and "comment" key-value pairs, as well
368 | as any other key-value pairs relevant.
369 |
374 |
375 |
376 | The following is an example of a valid keylist.
377 |
378 |
379 |
380 | {
381 | "metadata": {
382 | "signature_uri": "https://www.example.com/keylist.json.asc",
383 | "comment": "This is an example of a keylist file"
384 | },
385 | "keys": [
386 | {
387 | "fingerprint": "927F419D7EC82C2F149C1BD1403C2657CD994F73",
388 | "name": "Micah Lee",
389 | "email": "micah.lee@theintercept.com",
390 | "comment": "Each key can have a comment"
391 | },
392 | {
393 | "fingerprint": "1326CB162C6921BF085F8459F3C78280DDBF52A1",
394 | "name": "R. Miles McCain",
395 | "email": "0@rmrm.io"
396 | },
397 | {
398 | "fingerprint": "E0BE0804CF04A65C1FC64CC4CAD802E066046C02",
399 | "name": "Nat Welch",
400 | "email": "nat.welch@firstlook.org"
401 | }
402 | ]
403 | }
404 |
405 |
406 |
407 |
408 |
409 | The signature file MUST be an ASCII-armored 'detached
410 | signature' of the keylist file, as defined in OpenPGP
411 | Message Format
412 |
413 | .
414 |
415 |
416 |
417 |
418 |
419 | GPG Sync, an open source program created by one of the authors,
420 | implements this experimental standard. GPG Sync is used by First
421 | Look Media and the Freedom of the Press Foundation to keep
422 | OpenPGP keys in sync across their organizations, as well as to
423 | publish their employee's OpenPGP keys to the world. These
424 | organizations collectively employ more than 200 people and have
425 | used the system described in this document successfully for
426 | multiple years.
427 |
428 |
429 | GPG Sync's existing code can be found at
430 | <https://github.com/firstlookmedia/gpgsync>
431 |
432 |
433 | First Look Media's keylist file can be found at
434 | <https://github.com/firstlookmedia/gpgsync-firstlook-fingerprints>
435 |
436 |
437 |
438 |
439 |
440 |
441 | The keylist subscription functionality defined in this
442 | document provide a number of security benefits, including:
443 |
444 |
445 |
446 |
447 | The ability for new keys to be quickly distributed
448 | across an organization.
449 |
450 |
451 | It removes the complexity of key distribution from
452 | end users, allowing them to focus on the content of
453 | their communications rather than on key management.
454 |
455 |
456 | The ability for an organization to prevent the
457 | spread of falsely attributed keys by centralizing
458 | the public key discovery process within their
459 | organization.
460 |
461 |
462 |
463 |
464 |
465 |
466 |
467 | There is a situation in which keylist subscriptions could
468 | pose a potential security threat. If the both the authority
469 | key and the keylist distribution system were to be
470 | compromised, it would be possible for an attacker to
471 | distribute any key of their choosing to the subscribers of the
472 | keylist. The potential consequences of this attack are limited,
473 | however, because the attacker cannot remove or modify the keys
474 | already present on subscribers' systems.
475 |
476 |
477 |
478 |
479 |
480 |
481 | This document has no actions for IANA.
482 |
483 |
484 |
485 |
486 |
487 |
488 |
489 |
490 |
491 |
492 |
493 |
496 |
497 |
498 |
--------------------------------------------------------------------------------
/submissions/draft-mccain-keylist-04.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
12 |
13 |
16 |
17 | Distributing OpenPGP Key Fingerprints with Signed Keylist Subscriptions
18 |
19 |
20 |
21 | First Look Media
22 |
23 |
24 |
25 | ietf@sendmiles.email
26 |
27 |
28 | https://rmrm.io
29 |
30 |
31 |
32 |
33 |
34 | The Intercept
35 |
36 |
37 |
38 | micah.lee@theintercept.com
39 |
40 |
41 | https://micahflee.com/
42 |
43 |
44 |
45 |
46 |
47 | Google
48 |
49 |
50 |
51 | nat@natwelch.com
52 |
53 |
54 | https://natwelch.com
55 |
56 |
57 |
58 |
59 |
60 | Security
61 |
62 |
63 | OpenPGP
64 |
65 |
66 | GPGSync
67 |
68 |
69 | GPG
70 |
71 |
72 | Keylist
73 |
74 |
75 |
76 | This document specifies a system by which an OpenPGP client may subscribe
77 | to an organization's public keylist to keep its keystore up-to-date with
78 | correct keys, even in cases where the keys correspond to multiple
79 | (potentially uncontrolled) domains. Ensuring that all members or followers
80 | of an organization have their colleagues' most recent PGP public keys is
81 | critical to maintaining operational security. Without the most recent
82 | keys' fingerprints and a source of trust for those keys (as this document
83 | specifies), users must manually update and sign each others' keys -- a
84 | system that is untenable in larger organizations. This document proposes a
85 | experimental format for the keylist file as well as requirements for
86 | clients who wish to implement this experimental keylist subscription
87 | functionality.
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 | This document specifies a system by which clients may subscribe to
97 | cryptographically signed 'keylists' of public key fingerprints. The public
98 | keys do not necesssarily all correspond to a single domain. This system
99 | enhances operational security by allowing seamless key rotation across
100 | entire organizations without centralized public key hosting. To enable
101 | cross-client compatibility, this document provides a experimental format
102 | for the keylist, its cryptographic verification, and the method by which it
103 | is retreived by the client. The user interface by which a client provides
104 | this functionality to the user is out of scope, as is the process by which
105 | the client retrieves public keys. Other non-security-related implementation
106 | details are also out of scope.
107 |
108 |
109 |
110 | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
111 | "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
112 | and "OPTIONAL" in this document are to be interpreted as
113 | described in
114 |
115 | .
116 |
117 |
118 |
119 |
120 | This document uses the terms "OpenPGP", "public key",
121 | "private key", "signature", and "fingerprint" as defined by
122 | OpenPGP Message Format
123 |
124 | .
125 |
126 |
127 |
128 |
130 |
132 |
133 | The term "keylist" is defined as a list of OpenPGP public key fingerprints
134 | and accessible via a URI. The exact format of this data is specified in
135 | . Keylists SHOULD be treated as public
136 | documents; although a system administrator MAY choose, for example, to
137 | restrict access to a keylist to a specific subnet.
138 |
139 |
143 |
144 |
145 | An "authority key" is defined as the OpenPGP secret key used
146 | to sign a particular keylist. Every keylist has a
147 | corresponding authority key, and every authority key has at
148 | least one corresponding keylist. A single authority key
149 | SHOULD NOT be used to sign multiple keylists.
150 |
151 |
156 |
162 |
163 | To be "subscribed" to a keylist means that a program will
164 | retreive that keylist on a regular interval. After
165 | retrieval, that program will perform an update to an
166 | internal OpenPGP keystore.
167 |
168 |
169 |
170 | A "client" is a program that allows the user to subscribe to
171 | keylists. A client may be an OpenPGP client itself or a
172 | separate program that interfaces with an OpenPGP client to
173 | update its keystore.
174 |
175 |
176 |
177 | RFC Editor: please remove this section prior to
178 | publication.
179 | Development of this Internet draft takes place on GitHub at
180 | firstlookmedia/Keylist-RFC.
182 |
183 | We are still considering whether this Draft is better for the Experimental or
184 | Informational track.
185 |
186 |
187 |
188 |
189 | As new keys are created and other keys are revoked, it is
190 | critical that all members of an organization have the most
191 | recent set of keys available on their computers. Keylists enable
192 | organizations to publish a directory of OpenPGP keys that
193 | clients can use to keep their internal keystores up-to-date.
194 |
195 |
196 |
197 | A single client may subscribe to any number of keylists.
198 | When a client first subscribes to a keylist, it SHOULD
199 | update or import every key present in the keylist into its
200 | local keystore. Keylist subscriptions SHOULD be persistent
201 | -- that is, they should be permanently stored by the client
202 | to enable future automatic updates.
203 |
204 |
205 | To subscribe to a keylist, the client must be aware of the
206 | keylist URI (see ), and the
207 | fingerprint of the authority key used to sign the
208 | keylist. The protocol used to retrieve the keylist and its
209 | signature SHOULD be HTTPS (see ),
210 | however other implementation MAY be supported. A client
211 | implementing keylist functionality MUST support the
212 | retrieval of keylists and signatures over HTTPS. All other
213 | protocols are OPTIONAL.
214 |
215 |
216 | A client MUST NOT employ a trust-on-first-use (TOFU) model for
217 | determining the fingerprint of the authority public key; the
218 | authority public key fingerprint must be explicitly provided
219 | by the user.
220 |
221 |
222 | The process by which the client stores its keylist
223 | subscriptions is out of scope, as is the means by which
224 | subscription functionality is exposed to the end-user.
225 |
226 |
227 | The client MAY provide the option to perform all its network
228 | activity over a SOCKS5 proxy (see ).
229 |
230 |
231 |
232 |
233 | The primary purpose of keylists is to enable periodic
234 | updates of OpenPGP clients' internal keystores. We RECOMMEND
235 | that clients provide automatic 'background' update functionality;
236 | we also regonize that automatic background updates are not possible
237 | in every application (specifically cross-platform CLI tools).
238 |
239 | When automatic background updates are provided, we RECOMMEND
240 | that clients provide a default refresh interval of less than
241 | one day, however we also RECOMMEND that clients allow the
242 | user to select this interval. The exact time at which
243 | updates are performed is not critical.
244 |
245 |
246 | To perform an update, the client MUST perform the following
247 | steps on each keylist to which it is subscribed. The steps
248 | SHOULD be performed in the given order.
249 |
250 |
251 |
252 |
253 | Obtain a current copy of the keylist from its URI.
254 |
255 |
256 | Obtain a current copy of the keylist's signature
257 | data from its URI, which is included in the keylist data
258 | format specified in .
259 |
260 |
267 |
269 |
270 | Using the keylist and the keylist's signature,
271 | cryptographically verify that the keylist was signed
272 | using the authority key. If the signature does not
273 | verify, the client MUST abort the update of this
274 | keylist and SHOULD alert the user. The client SHOULD
275 | NOT abort the update of other keylists to which it
276 | is subscribed, unless they too fail signature
277 | verification.
278 |
279 |
280 | Validate the format of the keylist according to
281 |
282 | . If the keylist is in an invalid format, the client
283 | MUST abort the update this keylist and SHOULD alert
284 | the user.
285 |
286 |
287 | For each fingerprint listed in the keyfile, if a
288 | copy of the associated public key is not present in
289 | the client's local keystore, retrieve it from the
290 | keyserver specified by the keylist (see
291 | ) or, if the keylist specifies
292 | no keyserver, from any keyserver.
293 | If the key is already present and not revoked,
294 | refresh it from a keyserver. If it is present and
295 | revoked, do nothing.
296 |
297 |
301 |
306 |
307 |
308 |
309 |
310 |
311 |
312 | To ensure authenticity of a keylist during an update, the
313 | client MUST verify that the keylist's data matches its
314 | cryptographic signature, and that the public key used to
315 | verify the signature matches the authority key fingerprint
316 | given by the user.
317 |
318 |
319 | For enhanced security, it is RECOMMENDED that keylist
320 | operators sign each public key listed in their keylist with
321 | the authority private key. This way, an organization can
322 | have an internal trust relationship without requiring
323 | members of the organization to certify each other's public
324 | keys.
325 |
326 |
327 |
328 |
329 |
330 | The following are format specifications for the keylist file and
331 | its signature file.
332 |
333 |
334 |
335 | The keylist MUST be a valid JavaScript Object Notation
336 | (JSON) Data Interchange Format
337 | object with specific keys
338 | and values, as defined below. Note that unless otherwise specified,
339 | 'key' in this section refers to JSON keys -- not OpenPGP keys.
340 |
341 |
342 | To encode metadata, the keylist MUST have a "metadata" root key
343 | with an object as the value ("metadata object").
344 | The metadata object MUST contain a "signature_uri" key whose value
345 | is the URI string of the keylist's signature file. All metadata keys
346 | apart from "signature_uri" are OPTIONAL.
347 |
348 |
349 | The metadata object MAY contain a "keyserver" key with the value of the
350 | URI string of the keyserver from which the OpenPGP keys in the keylist
351 | should be retrieved.
352 |
353 |
354 | The metadata object MAY contain a "comment" key with the
355 | value of any string. The metadata object MAY also contain other arbitrary
356 | key-value pairs.
357 |
358 |
362 |
363 | The keylist MUST have a "keys" key with an array as the value.
364 | This array contains a list of OpenPGP key fingerprints and
365 | metadata about them. Each item in the array MUST be an object.
366 | Each of these objects MUST have a "fingerprint" key with the
367 | value of a string that contains the full 40-character
368 | hexadecimal public key fingerprint, as defined in OpenPGP
369 | Message Format
370 |
371 | . Any number of space characters (' ', U+0020) MAY be included
372 | at any location in the fingerprint string. These objects MAY
373 | contain "name", "email", and "comment" key-value pairs, as well
374 | as any other key-value pairs relevant.
375 |
380 |
381 |
382 | The following is an example of a valid keylist.
383 |
384 |
385 |
386 | {
387 | "metadata": {
388 | "signature_uri": "https://www.example.com/keylist.json.asc",
389 | "comment": "This is an example of a keylist file"
390 | },
391 | "keys": [
392 | {
393 | "fingerprint": "927F419D7EC82C2F149C1BD1403C2657CD994F73",
394 | "name": "Micah Lee",
395 | "email": "micah.lee@theintercept.com",
396 | "comment": "Each key can have a comment"
397 | },
398 | {
399 | "fingerprint": "1326CB162C6921BF085F8459F3C78280DDBF52A1",
400 | "name": "R. Miles McCain",
401 | "email": "0@rmrm.io"
402 | },
403 | {
404 | "fingerprint": "E0BE0804CF04A65C1FC64CC4CAD802E066046C02",
405 | "name": "Nat Welch",
406 | "email": "nat.welch@firstlook.org"
407 | }
408 | ]
409 | }
410 |
411 |
412 |
413 |
414 |
415 | The signature file MUST be an ASCII-armored 'detached
416 | signature' of the keylist file, as defined in OpenPGP
417 | Message Format
418 |
419 | .
420 |
421 |
422 |
423 |
424 | Keylists SHOULD NOT be well-known resources .
425 | To subscribe to a keylist, the client must be aware not only of the keylist's
426 | location, but also of the fingerprint of the authority public key used to sign the keylist.
427 | Furthermore, because keylists can reference public keys from several different domains,
428 | the host of the well-known location for a keylist may not always be clear.
429 |
430 |
431 |
432 |
433 |
434 | GPG Sync, an open source program created by one of the authors,
435 | implements this experimental standard. GPG Sync is used by First
436 | Look Media and the Freedom of the Press Foundation to keep
437 | OpenPGP keys in sync across their organizations, as well as to
438 | publish their employee's OpenPGP keys to the world. These
439 | organizations collectively employ more than 200 people and have
440 | used the system described in this document successfully for
441 | multiple years.
442 |
443 |
444 | GPG Sync's existing code can be found at
445 | <https://github.com/firstlookmedia/gpgsync>
446 |
447 |
448 | First Look Media's keylist file can be found at
449 | <https://github.com/firstlookmedia/gpgsync-firstlook-fingerprints>
450 |
451 |
452 |
453 |
454 |
455 | The keylist subscription functionality defined in this
456 | document provides a number of security benefits, including:
457 |
458 |
459 |
460 |
461 | The ability for new keys to be quickly distributed
462 | across an organization.
463 |
464 |
465 | Removing the complexity of key distribution from
466 | end users, allowing them to focus on the content of
467 | their communications rather than on key management.
468 |
469 |
470 | The ability for an organization to prevent the
471 | spread of falsely attributed keys by centralizing
472 | the public key discovery process within their
473 | organization without centralized public key hosting.
474 |
475 |
476 |
477 |
478 |
479 |
480 |
481 |
482 | Unlike Web Key Directories, keylists are not domain specific. A keylist
483 | might contain public key fingerprints for email addresses across several
484 | different domains. Moreover, keylists only provide references to public
485 | keys by way of fingerprints; Web Key Directories provide the public keys
486 | themselves.
487 |
488 |
489 |
490 |
491 | A keylist MAY reference public keys corresponding to email addresses
492 | across several different domains. Because managing OPENPGPKEY DNS Records
493 | for a particular domain requires control of that
494 | domain, the OPENPGPKEY DNS Record system is not suitable for cases in
495 | which keys are strewn about several different domains, including ones
496 | outside of the control of an organization's system adminitrators.
497 |
498 |
499 |
500 |
501 |
502 |
503 | There is a situation in which keylist subscriptions could
504 | pose a potential security threat. If both the authority
505 | key and the keylist distribution system were to be
506 | compromised, it would be possible for an attacker to
507 | distribute any key of their choosing to the subscribers of the
508 | keylist. The potential consequences of this attack are limited,
509 | however, because the attacker cannot remove or modify the keys
510 | already present on subscribers' systems.
511 |
512 |
513 | Some organizations may wish to keep their keylists private. While
514 | this may be achievable by serving keylists at URIs only accessible from
515 | specific subnets, keylists are designed to be public
516 | documents. As such, clients may leak the contents of keylists to
517 | keyservers -- this specification ensures to the best of its ability
518 | the integrity of keylists, but not the privacy of keylists.
519 |
520 |
521 |
522 |
523 |
524 | This document has no actions for IANA.
525 |
526 |
527 |
528 |
529 |
530 |
531 |
532 |
533 |
534 |
535 |
536 |
537 |
538 |
541 |
542 |
543 |
--------------------------------------------------------------------------------
/submissions/draft-mccain-keylist-05.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
11 |
12 |
13 |
16 |
17 | Distributing OpenPGP Key Fingerprints with Signed Keylist Subscriptions
18 |
19 |
20 |
21 | First Look Media
22 |
23 |
24 |
25 | ietf@sendmiles.email
26 |
27 |
28 | https://rmrm.io
29 |
30 |
31 |
32 |
33 |
34 | The Intercept
35 |
36 |
37 |
38 | micah.lee@theintercept.com
39 |
40 |
41 | https://micahflee.com/
42 |
43 |
44 |
45 |
46 |
47 | Google
48 |
49 |
50 |
51 | nat@natwelch.com
52 |
53 |
54 | https://natwelch.com
55 |
56 |
57 |
58 |
59 |
60 | Security
61 |
62 |
63 | OpenPGP
64 |
65 |
66 | GPGSync
67 |
68 |
69 | GPG
70 |
71 |
72 | Keylist
73 |
74 |
75 |
76 | This document specifies a system by which an OpenPGP client may subscribe
77 | to an organization's public keylist to keep its keystore up-to-date with
78 | correct keys from the correct keyserver(s), even in cases where the keys correspond to multiple
79 | (potentially uncontrolled) domains. Ensuring that all members or followers
80 | of an organization have their colleagues' most recent PGP public keys is
81 | critical to maintaining operational security. Without the most recent
82 | keys' fingerprints and a source of trust for those keys (as this document
83 | specifies), users must manually update and sign each others' keys -- a
84 | system that is untenable in larger organizations. This document proposes a
85 | experimental format for the keylist file as well as requirements for
86 | clients who wish to implement this experimental keylist subscription
87 | functionality.
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 | This document specifies a system by which clients may subscribe to
97 | cryptographically signed 'keylists' of public key fingerprints. The public
98 | keys do not necesssarily all correspond to a single domain. This system
99 | enhances operational security by allowing seamless key rotation across
100 | entire organizations without centralized public key hosting. To enable
101 | cross-client compatibility, this document provides a experimental format
102 | for the keylist, its cryptographic verification, and the method by which it
103 | is retreived by the client. The user interface by which a client provides
104 | this functionality to the user is out of scope, as is the process by which
105 | the client retrieves public keys. Other non-security-related implementation
106 | details are also out of scope.
107 |
108 |
109 |
110 | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL",
111 | "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY",
112 | and "OPTIONAL" in this document are to be interpreted as
113 | described in
114 |
115 | .
116 |
117 |
118 |
119 |
120 | This document uses the terms "OpenPGP", "public key",
121 | "private key", "signature", and "fingerprint" as defined by
122 | OpenPGP Message Format
123 |
124 | (the fingerprint type SHOULD be V4).
125 |
126 |
127 |
128 |
130 |
132 |
133 | The term "keylist" is defined as a list of OpenPGP public key fingerprints
134 | accessible via a URI in the format specified in
135 | . Keylists SHOULD be treated as public
136 | documents, however a system administrator MAY choose, for example, to
137 | restrict access to a keylist to a specific subnet or private network.
138 |
139 |
143 |
144 |
145 | An "authority key" is defined as the OpenPGP secret key used
146 | to sign a particular keylist. Every keylist has a
147 | corresponding authority key, and every authority key has at
148 | least one corresponding keylist. A single authority key
149 | SHOULD NOT be used to sign multiple keylists.
150 |
151 |
156 |
162 |
163 | To be "subscribed" to a keylist means that a program will
164 | retreive that keylist on a regular interval. After
165 | retrieval, that program will perform an update to an
166 | internal OpenPGP keystore.
167 |
168 |
169 |
170 | A "client" is a program that allows the user to subscribe to
171 | keylists. A client may be an OpenPGP client itself or a
172 | separate program that interfaces with an OpenPGP client to
173 | update its keystore.
174 |
175 |
176 |
177 | RFC Editor: please remove this section prior to
178 | publication.
179 | Development of this Internet draft takes place on GitHub at
180 | firstlookmedia/Keylist-RFC.
182 |
183 | We are still considering whether this Draft is better for the Experimental or
184 | Informational track. All feedback is appreciated.
185 |
186 |
187 |
188 |
189 | As new keys are created and other keys are revoked, it is
190 | critical that all members of an organization have the most
191 | recent set of keys available on their computers. Keylists enable
192 | organizations to publish a directory of OpenPGP keys that
193 | clients can use to keep their internal keystores up-to-date.
194 |
195 |
196 |
197 | A single client may subscribe to any number of keylists.
198 | When a client first subscribes to a keylist, it SHOULD
199 | update or import every key present in the keylist into its
200 | local keystore. Keylist subscriptions SHOULD be persistent
201 | -- that is, they should be permanently stored by the client
202 | to enable future automatic updates.
203 |
204 |
205 | To subscribe to a keylist, the client must be aware of the
206 | keylist URI (see ), and the
207 | fingerprint of the authority key used to sign the
208 | keylist. The protocol used to retrieve the keylist and its
209 | signature SHOULD be HTTPS (see ),
210 | however other implementation MAY be supported. A client
211 | implementing keylist functionality MUST support the
212 | retrieval of keylists and signatures over HTTPS. All other
213 | protocols are OPTIONAL.
214 |
215 |
216 | A client MUST NOT employ a trust-on-first-use (TOFU) model for
217 | determining the fingerprint of the authority public key; the
218 | authority public key fingerprint must be explicitly provided
219 | by the user.
220 |
221 |
222 | The process by which the client stores its keylist
223 | subscriptions is out of scope, as is the means by which
224 | subscription functionality is exposed to the end-user.
225 |
226 |
227 | The client MAY provide the option to perform all its network
228 | activity over a SOCKS5 proxy (see ).
229 |
230 |
231 |
232 |
233 | The primary purpose of keylists is to enable periodic
234 | updates of OpenPGP clients' internal keystores. We RECOMMEND
235 | that clients provide automatic 'background' update functionality;
236 | we also regonize that automatic background updates are not possible
237 | in every application (specifically cross-platform CLI tools).
238 |
239 | When automatic background updates are provided, we RECOMMEND
240 | that clients provide a default refresh interval of less than
241 | one day, however we also RECOMMEND that clients allow the
242 | user to select this interval. The exact time at which
243 | updates are performed is not critical.
244 |
245 |
246 | To perform an update, the client MUST perform the following
247 | steps on each keylist to which it is subscribed. The steps
248 | SHOULD be performed in the given order.
249 |
250 |
251 |
252 |
253 | Obtain a current copy of the keylist from its URI. If a
254 | current copy (i.e. not from local cache) cannot be obtained,
255 | the client SHOULD abort the update for this keylist and notify
256 | the user. The client SHOULD continue the update for other keylists
257 | to which it is subscribed, notwithstanding also failing the criteria
258 | described in this section.
259 |
260 |
261 | Obtain a current copy of the keylist's signature
262 | data from its URI, which is included in the keylist data
263 | format specified in . If a current copy
264 | cannot be obtained, the client SHOULD abort the update and notify
265 | the user. The client SHOULD continue the update for other keylists
266 | to which it is subscribed, notwithstanding also failing the criteria
267 | described in this section.
268 |
269 |
276 |
278 |
279 | Using the keylist and the keylist's signature,
280 | cryptographically verify that the keylist was signed
281 | using the authority key. If the signature does not
282 | verify, the client MUST abort the update of this
283 | keylist and SHOULD alert the user. The client SHOULD
284 | NOT abort the update of other keylists to which it
285 | is subscribed, unless they too fail signature
286 | verification.
287 |
288 |
289 | Validate the format of the keylist according to
290 |
291 | . If the keylist is in an invalid format, the client
292 | MUST abort the update this keylist and SHOULD alert
293 | the user. The client SHOULD continue the update for
294 | other keylists to which it is subscribed, notwithstanding
295 | also failing the criteria described in this section.
296 |
297 |
298 | For each fingerprint listed in the keyfile, if a
299 | copy of the associated public key is not present in
300 | the client's local keystore, retrieve it from the
301 | keyserver specified by either the key entry, the keylist (see
302 | ) or, if the keylist specifies
303 | no keyserver, from the user's default keyserver. If the public
304 | key cannot be found for a particular fingerprint, the client
305 | MUST NOT abort the entire update process; instead, it SHOULD
306 | notify the user that the key retrieval failed but otherwise
307 | merely skip updating the key and continue.
308 | If the key is already present and not revoked,
309 | refresh it from the keyserver determined in the same
310 | manner as above. If it is present and revoked, do nothing
311 | for that particular key.
312 |
313 |
317 |
322 |
323 |
324 |
325 |
326 |
327 |
328 | To ensure authenticity of a keylist during an update, the
329 | client MUST verify that the keylist's data matches its
330 | cryptographic signature, and that the public key used to
331 | verify the signature matches the authority key fingerprint
332 | given by the user.
333 |
334 |
335 | For enhanced security, it is RECOMMENDED that keylist
336 | operators sign each public key listed in their keylist with
337 | the authority private key. This way, an organization can
338 | have an internal trust relationship without requiring
339 | members of the organization to certify each other's public
340 | keys.
341 |
342 |
343 |
344 |
345 |
346 | The following are format specifications for the keylist file and
347 | its signature file.
348 |
349 |
350 |
351 | The keylist MUST be a valid JavaScript Object Notation
352 | (JSON) Data Interchange Format
353 | object with specific keys
354 | and values, as defined below. Note that unless otherwise specified,
355 | 'key' in this section refers to JSON keys -- not OpenPGP keys.
356 |
357 |
358 | To encode metadata, the keylist MUST have a "metadata" root key
359 | with an object as the value ("metadata object").
360 | The metadata object MUST contain a "signature_uri" key whose value
361 | is the URI string of the keylist's signature file. All metadata keys
362 | apart from "signature_uri" are OPTIONAL.
363 |
364 |
365 | The metadata object MAY contain a "keyserver" key with the value of the
366 | URI string of a HKP keyserver from which the OpenPGP keys in the keylist
367 | should be retrieved. Each PGP key listed in the keylist MAY have a
368 | "keyserver" JSON key; if a PGP key in the keylist specifies a HKP keyserver that is
369 | different from the one described in the metadata object, the PGP key-specific
370 | keyserver should be used to retrieve that particular key (and not the key listed
371 | in the metadata object).
372 |
373 |
374 | The metadata object MAY contain a "comment" key with the
375 | value of any string. The metadata object MAY also contain other arbitrary
376 | key-value pairs.
377 |
378 |
382 |
383 | The keylist MUST have a "keys" key with an array as the value.
384 | This array contains a list of OpenPGP key fingerprints and
385 | metadata about them. Each item in the array MUST be an object.
386 | Each of these objects MUST have a "fingerprint" key with the
387 | value of a string that contains the full 40-character
388 | hexadecimal public key fingerprint, as defined in OpenPGP
389 | Message Format
390 |
391 | . Any number of space characters (' ', U+0020) MAY be included
392 | at any location in the fingerprint string. These objects MAY
393 | contain "name" (the name of the PGP key's owner), "email"
394 | (an email of the PGP key's owner), "keyserver" (a HKP keyserver
395 | from which the key should be retrieved), and "comment" key-value pairs,
396 | as well as any other key-value pairs.
397 |
402 |
403 |
404 | The following is an example of a valid keylist.
405 |
406 |
407 |
408 | {
409 | "metadata": {
410 | "signature_uri": "https://www.example.com/keylist.json.asc",
411 | "comment": "This is an example of a keylist file"
412 | },
413 | "keys": [
414 | {
415 | "fingerprint": "927F419D7EC82C2F149C1BD1403C2657CD994F73",
416 | "name": "Micah Lee",
417 | "email": "micah.lee@theintercept.com",
418 | "comment": "Each key can have a comment"
419 | },
420 | {
421 | "fingerprint": "1326CB162C6921BF085F8459F3C78280DDBF52A1",
422 | "name": "R. Miles McCain",
423 | "email": "0@rmrm.io",
424 | "keyserver": "https://keys.openpgp.org/"
425 | },
426 | {
427 | "fingerprint": "E0BE0804CF04A65C1FC64CC4CAD802E066046C02",
428 | "name": "Nat Welch",
429 | "email": "nat.welch@firstlook.org"
430 | }
431 | ]
432 | }
433 |
434 |
435 |
436 |
437 |
438 | The signature file MUST be an ASCII-armored 'detached
439 | signature' of the keylist file, as defined in OpenPGP
440 | Message Format
441 |
442 | .
443 |
444 |
445 |
446 |
447 | Keylists SHOULD NOT be well-known resources .
448 | To subscribe to a keylist, the client must be aware not only of the keylist's
449 | location, but also of the fingerprint of the authority public key used to sign the keylist.
450 | Furthermore, because keylists can reference public keys from several different domains,
451 | the expected host of the well-known location for a keylist may not always be self-evident.
452 |
453 |
454 |
455 |
456 |
457 | GPG Sync, an open source program created by one of the authors,
458 | implements this experimental standard. GPG Sync is used by First
459 | Look Media and the Freedom of the Press Foundation to keep
460 | OpenPGP keys in sync across their organizations, as well as to
461 | publish their employee's OpenPGP keys to the world. These
462 | organizations collectively employ more than 200 people and have
463 | used the system described in this document successfully for
464 | multiple years.
465 |
466 |
467 | GPG Sync's existing code can be found at
468 | <https://github.com/firstlookmedia/gpgsync>
469 |
470 |
471 | First Look Media's keylist file can be found at
472 | <https://github.com/firstlookmedia/gpgsync-firstlook-fingerprints>
473 |
474 |
475 |
476 |
477 |
478 | The keylist subscription functionality defined in this
479 | document provides a number of security benefits, including:
480 |
481 |
482 |
483 |
484 | The ability for new keys to be quickly distributed
485 | across an organization.
486 |
487 |
488 | Removing the complexity of key distribution from
489 | end users, allowing them to focus on the content of
490 | their communications rather than on key management.
491 |
492 |
493 | The ability for an organization to prevent the
494 | spread of falsely attributed keys by centralizing
495 | the public key discovery process within their
496 | organization without centralized public key hosting.
497 |
498 |
499 |
500 |
501 |
502 |
503 |
504 |
505 | Unlike Web Key Directories, keylists are not domain specific. A keylist
506 | might contain public key fingerprints for email addresses across several
507 | different domains. Moreover, keylists only provide references to public
508 | keys by way of fingerprints; Web Key Directories provide the public keys
509 | themselves.
510 |
511 |
512 |
513 |
514 | A keylist MAY reference public keys corresponding to email addresses
515 | across several different domains. Because managing OPENPGPKEY DNS Records
516 | for a particular domain requires control of that
517 | domain, the OPENPGPKEY DNS Record system is not suitable for cases in
518 | which keys are strewn about several different domains, including ones
519 | outside of the control of an organization's system adminitrators.
520 |
521 |
522 |
523 |
524 |
525 |
526 | There is a situation in which keylist subscriptions could
527 | pose a potential security threat. If both the authority
528 | key and the keylist distribution system were to be
529 | compromised, it would be possible for an attacker to
530 | distribute any key of their choosing to the subscribers of the
531 | keylist. The potential consequences of this attack are limited,
532 | however, because the attacker cannot remove or modify the keys
533 | already present on subscribers' systems.
534 |
535 |
536 | Some organizations may wish to keep their keylists private. While
537 | this may be achievable by serving keylists at URIs only accessible from
538 | specific subnets, keylists are designed to be public
539 | documents. As such, clients may leak the contents of keylists to
540 | keyservers -- this specification ensures to the best of its ability
541 | the integrity of keylists, but not the privacy of keylists.
542 |
543 |
544 |
545 |
546 |
547 | This document has no actions for IANA.
548 |
549 |
550 |
551 |
552 |
553 |
554 |
555 |
556 |
557 |
558 |
559 |
560 |
561 |
564 |
565 |
566 |
--------------------------------------------------------------------------------