├── .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 | --------------------------------------------------------------------------------