PGP keys met subkeys maken door Guus Sliepen Juli 2005 For those of you who don't read Dutch ------------------------------------- Please read http://fortytwo.ch/gpg/subkeys if you want to know how to make a PGP key with subkeys. Someone with clue said about that page, in March 2008: "while the page claims it's horribly outdated I don't see why it wouldn't still work." Samenvatting ------------ Deze handleiding legt de best practice uit van het aanmaken van een nieuwe PGP key, in ±47 eenvoudige stappen. Dit document is in juli 2005 geschreven, maar met GnuPG 1.4.8 (mei 2008) werkt het allemaal ook nog, melde men. Theorie ------- Het is mogelijk om een PGP key te maken die bestaat uit een zeer veilige master key en wegwerpbare subkeys. Het is mogelijk om alleen de subkeys te exporteren naar werkstations, alwaar van deze subkeys gebruik gemaakt kan worden om bestanden te signen en te decrypten. Is een subkey gecompromitteerd, dan is er vrijwel niets aan de hand; een subkey kan met de master key gerevoked worden en een nieuwe subkey kan aangemaakt worden. Aangezien anderen (het publieke deel van) de master key signen, en niet de subkeys, verliezen geen van de signatures van je PGP key hun waardigheid als een subkey gecompromitteerd is. Als je liever niet een nieuwe key maakt, maar je liever je oude "upgrade", lees dan http://atom.smasher.org/gpg/gpg-migrate.txt. Praktijk -------- Zorg voor een veilige computer, eentje die het liefst nooit met een network verbonden is geweest. Een oude laptop of koop gewoon een EeePC. Installeer het met een officiële Debian GNU/Linux CD of een OpenBSD CD ofzo. Als alternatief kun je ook een Live-CD van één of ander OS gebruiken in een computer waarvan je de netwerkkabel hebt verwijderd en de keys op een USB-stokje opslaan. Gebruik dit USB-stokje daarna nooit in een computer die wel aan het netwerk hangt. Hierbij kun je ‘gpg --homedir /mnt/usbstokje/gnupg …’ gebruiken, of de GNUPGHOME omgevingsvariabele zetten (gnupg voert dan alle bewerkingen in die directory uit). Op deze computer wordt de nieuwe key aangemaakt: 1. gpg --gen-key 2. Kies 5 (RSA, sign only) 3. Kies 4096 bits 4. Kies 0 (key does not expire) 5. Vul je volledige naam in. 6. Vul een leeg email adres is. 7. Vul als commentaar je sofinummer of geboorteplaats+datum in 8. Kies een lange passphrase met veel gekke karakters en tik die twee keer in. Je kunt de passphrase op het geheime deel van je subkeys later wijzigen. De passphrase die je hier kiest zul je dus alleen maar hoeven te gebruiken bij het tekenen van van andere keys; niet bij het tekenen of ontcijferen van berichten. Het uiteindelijke genereren van de key kan even duren, oefen je geduld. Toevoegen subkeys: 9. gpg --edit-key 10. addkey 11. Vul je passphrase in. 12. Kies 5 (RSA, sign only) 13. Kies 2048 (of als je wil, 4096) 14. Kies 1y (of meer of minder) 15. Ja echt waar (2×) 16. addkey 17. Vul je passphrase in. 18. Kies 6 (RSA, encrypt only) 19. Kies 2048 (of als je wil, 4096) 20. Kies 1y (of meer of minder) 21. Ja echt waar (2×) Toevoegen email uids: 22. adduid 23. Vul je volledige naam in. 24. Vul je email adres in. 25. Vul eventueel commentaar in. 26. Vul je passphrase in. 27. Herhaal stap 20 t/m 24 voor eventuele andere emailadressen. Toevoegen photo uid (optioneel): 28. addphoto 29. Vul de bestandsnaam in van een JPEG bestand dat een goede foto van je bevat. 30. Vul je passphrase in. Eén van deze uids primair maken: 31. uid 1 32. primary 33. Vul je passphrase in. Opslaan: 34. save Revocation certificate aanmaken (optioneel): 35. gpg --gen-revoke keyid > revcert.keyid 36. Kies 1. 37. Laat description maar lekker leeg. 38. Vul je passphrase in. Exporteer de public keys en de secret subkeys: 39. gpg --export keyid > export.keyid 40. gpg --export-secret-subkeys > exportss.keyid Sla de revocation certificate (indien aangemaakt) op op een flop, CD of papier en berg het op in een kluis of op een andere veilige plek. Sla de geëxporteerde keys op op een flop, CD, of USB stick. Lees deze flop, CD, of USB stick in op je werkstation(s), alwaar je de keys importeert en publiceert: 41. gpg --import export.keyid exportss.keyid 42. gpg --edit-key keyid 43. trust 44. Kies 5 (ultimate) 45. save 46. gpg --update-trustdb 47. gpg --send-key keyid Nu kun je bestanden signen en naar jou geëncrypte bestanden decrypten. Mochten je keys gecompromitteerd worden dan kunnen de subkeys gerevoked worden en kunnen nieuwe aangemaakt worden op de laptop. Je hoeft hierna niet opnieuw signatures te verzamelen. Log --- Hier volgt een log van het bovenstaande voor een fictieve key. Op je laptop: > gpg --gen-key Please select what kind of key you want: (1) DSA and Elgamal (default) (2) DSA (sign only) (5) RSA (sign only) Your selection? 5 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096 Requested keysize is 4096 bits Please specify how long the key should be valid. 0 = key does not expire = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n years Key is valid for? (0) Key does not expire at all Is this correct? (y/N) y You need a user ID to identify your key; the software constructs the user ID from the Real Name, Comment and Email Address in this form: "Heinrich Heine (Der Dichter) " Real name: Guus Sliepen Email address: Comment: geboren 15-2-1978 te Tiel, Nederland You selected this USER-ID: "Guus Sliepen (geboren 15-2-1978 te Tiel, Nederland)" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o You need a Passphrase to protect your secret key. We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. +++++ ....+++++ gpg: key D47D3C0F marked as ultimately trusted public and secret key created and signed. gpg: please do a --check-trustdb pub 4096R/D47D3C0F 2005-07-28 Key fingerprint = 2F7E 0441 2B4E 11D6 097A FA7C CA7A 073E D47D 3C0F uid Guus Sliepen (geboren 15-2-1978 te Tiel, Nederland) Note that this key cannot be used for encryption. You may want to use the command "--edit-key" to generate a subkey for this purpose. >gpg --edit-key D47D3C0F Secret key is available. gpg: please do a --check-trustdb pub 4096R/D47D3C0F created: 2005-07-28 expires: never usage: CS trust: ultimate validity: unknown [ unknown] (1). Guus Sliepen (geboren 15-2-1978 te Tiel, Nederland) Please note that the shown key validity is not necessarily correct unless you restart the program. Command> addkey Key is protected. You need a passphrase to unlock the secret key for user: "Guus Sliepen (geboren 15-2-1978 te Tiel, Nederland)" 4096-bit RSA key, ID D47D3C0F, created 2005-07-28 Please select what kind of key you want: (2) DSA (sign only) (4) Elgamal (encrypt only) (5) RSA (sign only) (6) RSA (encrypt only) Your selection? 5 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) Requested keysize is 2048 bits Please specify how long the key should be valid. 0 = key does not expire = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n years Key is valid for? (0) 1y Key expires at vr 28 jul 2006 16:27:34 CEST Is this correct? (y/N) y Really create? (y/N) y We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. ..+++++ ..+++++ pub 4096R/D47D3C0F created: 2005-07-28 expires: never usage: CS trust: ultimate validity: unknown sub 2048R/1613454C created: 2005-07-28 expires: 2006-07-28 usage: S [ unknown] (1). Guus Sliepen (geboren 15-2-1978 te Tiel, Nederland) Command> addkey Key is protected. You need a passphrase to unlock the secret key for user: "Guus Sliepen (geboren 15-2-1978 te Tiel, Nederland)" 4096-bit RSA key, ID D47D3C0F, created 2005-07-28 Please select what kind of key you want: (2) DSA (sign only) (4) Elgamal (encrypt only) (5) RSA (sign only) (6) RSA (encrypt only) Your selection? 6 RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) Requested keysize is 2048 bits Please specify how long the key should be valid. 0 = key does not expire = key expires in n days w = key expires in n weeks m = key expires in n months y = key expires in n years Key is valid for? (0) 1y Key expires at vr 28 jul 2006 16:29:24 CEST Is this correct? (y/N) y Really create? (y/N) y We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. ..+++++ .+++++ pub 4096R/D47D3C0F created: 2005-07-28 expires: never usage: CS trust: ultimate validity: unknown sub 2048R/1613454C created: 2005-07-28 expires: 2006-07-28 usage: S sub 2048R/8E744433 created: 2005-07-28 expires: 2006-07-28 usage: E [ unknown] (1). Guus Sliepen (geboren 15-2-1978 te Tiel, Nederland) Command> adduid Real name: Guus Sliepen Email address: guus.uvt.nl Comment: UNIX system adminstrator You selected this USER-ID: "Guus Sliepen (UNIX system adminstrator) " Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o You need a passphrase to unlock the secret key for user: "Guus Sliepen (geboren 15-2-1978 te Tiel, Nederland)" 4096-bit RSA key, ID D47D3C0F, created 2005-07-28 pub 4096R/D47D3C0F created: 2005-07-28 expires: never usage: CS trust: ultimate validity: unknown sub 2048R/1613454C created: 2005-07-28 expires: 2006-07-28 usage: S sub 2048R/8E744433 created: 2005-07-28 expires: 2006-07-28 usage: E [ unknown] (1) Guus Sliepen (geboren 15-2-1978 te Tiel, Nederland) [ unknown] (2). Guus Sliepen (UNIX system adminstrator) Command> addphoto Pick an image to use for your photo ID. The image must be a JPEG file. Remember that the image is stored within your public key. If you use a very large picture, your key will become very large as well! Keeping the image close to 240x288 is a good size to use. Enter JPEG filename for photo ID: guus.jpg Is this photo correct (y/N/q)? y You need a passphrase to unlock the secret key for user: "Guus Sliepen (geboren 15-2-1978 te Tiel, Nederland)" 4096-bit RSA key, ID D47D3C0F, created 2005-07-28 pub 4096R/D47D3C0F created: 2005-07-28 expires: never usage: CS trust: ultimate validity: unknown sub 2048R/1613454C created: 2005-07-28 expires: 2006-07-28 usage: S sub 2048R/8E744433 created: 2005-07-28 expires: 2006-07-28 usage: E [ unknown] (1) Guus Sliepen (geboren 15-2-1978 te Tiel, Nederland) [ unknown] (2). Guus Sliepen (UNIX system adminstrator) [ unknown] (3) [jpeg image of size 2225] Command> save >gpg --gen-revoke D47D3C0F > revcert.D47D3C0F sec 4096R/D47D3C0F 2005-07-28 Guus Sliepen (UNIX system adminstrator) Create a revocation certificate for this key? (y/N) y Please select the reason for the revocation: 0 = No reason specified 1 = Key has been compromised 2 = Key is superseded 3 = Key is no longer used Q = Cancel (Probably you want to select 1 here) Your decision? 0 Enter an optional description; end it with an empty line: > Reason for revocation: No reason specified (No description given) Is this okay? (y/N) y You need a passphrase to unlock the secret key for user: "Guus Sliepen (UNIX system adminstrator) " 4096-bit RSA key, ID D47D3C0F, created 2005-07-28 ASCII armored output forced. Revocation certificate created. Please move it to a medium which you can hide away; if Mallory gets access to this certificate he can use it to make your key unusable. It is smart to print this certificate and store it away, just in case your media become unreadable. But have some caution: The print system of your machine might store the data and make it available to others! > gpg --export D47D3C0F > export.D47D3C0F > gpg --export-secret-subkeys D47D3C0F > exportss.D47D3C0F Op je werkstation: > gpg --import export.D47D3C0F exportss.D47D3C0F gpg: key D47D3C0F: public key "Guus Sliepen (UNIX system adminstrator) " imported gpg: key D47D3C0F: secret key imported gpg: key D47D3C0F: "Guus Sliepen (UNIX system adminstrator) " 1 new signature gpg: Total number processed: 2 gpg: imported: 1 (RSA: 1) gpg: new signatures: 1 gpg: secret keys read: 1 gpg: secret keys imported: 1 -- $Id: gpgkeys-met-subkeys-maken.txt 24620 2008-05-18 13:52:25Z joostvb $ $URL: https://infix.uvt.nl/its-id/trunk/sources/uvt-unix-doc/gpgkeys-met-subkeys-maken.txt $