page header photo

januari 2014 Archieven

GnuPG gebruiksklaar maken


Geplaatst door stefan op 2014-01-22 11:15:33 | Permanente link | Categorie: Systeembeheer, Tips and Tricks | Reacties: 0

GnuPG2 installeren

Alvorens je van GPG gebruik kunt maken zul je het eerst moeten installeren. En om het in samenwerking met je e-mail client te gebruiken is het raadzaam om te controleren of deze GPG ondersteunt of dat die functionaliteit mogelijk kan worden toegevoegd met bijv. een plug-in. De populaire client Thunderbird kan door plug-in Enigmail toe te voegen prima met GPG overweg.

Op Debian en Ubuntu GNU/Linux systemen kun je "gnupg2" installeren met APT, op RPM gebaseerde systemen heeft het pakket dezelfde naam. Er is overigens ook een package "gnupg", maar het is voor desktopgebruik aan te raden om de variant uit de 2.0 serie te installeren. Deze bevat ondersteuning voor zogenaamde "agents" waar je later profijt van kunt hebben. Meer daarover in een volgend blog over dit onderwerp.

$ sudo apt-get update
$ sudo apt-get install gnupg2

Loop de stappen door de stappen om gnupg2 te installeren. Vervang indien nodig natuurlijk apt-get voor jouw package manager of gebruik de meegeleverde grafisch alternatieven zoals het "Software Center". Afhankelijk van je Linux distributie is de software mogelijk zelfs al geïnstalleerd.

Aanmaken sleutelpaar

Voor het aanmaken van een sleutelpaar zal ik eerst de beoogde opzet uitleggen. Standaard maak je een sleutelpaar aan waarbij een private & publieke sleutel ontstaat. Met PGP/GPG wordt dan tevens een sub-sleutelpaar (subkey) aangemaakt, deze is bedoeld voor Encryptie. Terwijl het hoofdsleutelpaar ingezet wordt voor Signeren en voor Certificatie. Certificatie wordt gebruikt voor het ondertekenen van andermans keys en het opbouwen van een vertrouwensrelatie, waarover ik in de toekomst ook nog iets zal vertellen.

Dit stappenplan beschikt over een extraatje: er wordt een extra (sub-)sleutelpaar aangemaakt voor het Signeren. Dit maakt het mogelijk om dagelijks gebruik van GnuPG volledig met subkeys te doen, zodat het hoofdsleutelpaar niet aanwezig hoeft te zijn op de PC en volledig offline bewaard kan worden. Mocht je de controle over de subkeys verliezen, bijvoorbeeld wanneer je laptop gestolen wordt, dan kun je met het offline bewaarde hoofdsleutelpaar een nieuwe set subkeys maken. Na het ongeldig verklaren van je oude subkeys kun je met de nieuwe set weer veilig gaan werken, zonder dat iedereen de identiteit van de eigenaar van deze nieuwe set sleutels moet gaan controleren. Ze hebben immers het nog veilige hoofdsleutelpaar al gecontroleerd en daar hun vertrouwen, dat jij daadwerkelijk de eigenaar van dat hoofdsleutelpaar bent, in uitgesproken.

Ook maakt deze methode het mogelijk om eventuele "schade" te beperken door subkeys met regelmaat te wisselen. Als een aanvaller je subkeys in handen krijgt, en op slinkse wijze ook jouw goede wachtwoordzin (passphrase) weet te raden, dan kan deze aanvaller alleen bij de data die is versleuteld met dit paar subkeys. Je kunt de tijdspanne van informatie die zo leesbaar wordt voor een aanvaller inperken. Al is dit voor veel gewone gebruikers minder van belang, het is wel een leuk extraatje.

Het uitgangspunt van deze handleiding is als volgt:

  • Aanmaken van hoofdsleutelpaar, deze kan Certificeren en Signeren. Deze is gekoppeld aan jouw identiteit en dit is de sleutel waar anderen hun vertrouwen aan zullen toekennen. Deze sleutel gaat in de praktijk eigenlijk alleen gebruikt worden voor Certificatie, waar je subkeys aan koppelt die gebruikt worden voor resp. Signeren en Encryptie.
  • Aanmaken van een subkey voor encryptie. Deze wordt standaard al door GPG aangemaakt en wordt gebruikt voor het versleutelen van berichten.
  • Aanmaken van een subkey voor het signeren van berichten.

Mocht je toch op de traditionele wijze willen werken dan mag dat natuurlijk, maar dan kun je misschien beter op zoek naar een andere handleiding, of zelf gewoon gpg2 --gen-key intypen en de instructies op je beeldscherm volgen. Ook is het mogelijk om een grafische wizard te gebruiken om volgens de conventionele wijze een sleutelpaar aan te maken, zoals dat kan met de Enigmail plugin voor Mozilla Thunderbird, zoals uitgelegd in deze handleiding.

Genoeg theorie denk ik, wellicht duizelt het je al een beetje... laten we beginnen met de praktijk en het aanmaken van een hoofdsleutelpaar, al doende leert men immers. Daarvoor gaan we weer naar de terminal:

$ gpg2 --gen-key

Kies voor optie 4 om enkel een hoofdsleutelpaar (je master key) aan te maken:

gpg (GnuPG) 2.0.19; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Please select what kind of key you want:
    (1) RSA and RSA (default)
    (2) DSA and Elgamal
    (3) DSA (sign only)
    (4) RSA (sign only)
Your selection? 4

De volgende vraag betreft de lengte van de key. Voor je hoofdsleutelpaar doe je er goed aan om de sleutel zo sterk mogelijk te maken, en dit bereik je o.a. door een zo lang mogelijke sleutellengte. Daarom is mijn voorstel om voor het maximum te kiezen voor deze key, en dat is op dit moment 4096 bits voor een RSA key. Mocht je minder willen gebruiken, dan zou ik dezer dagen niet voor minder dan 2048 bits kiezen.

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
Requested keysize is 4096 bits

Nu kun je een houdbaarheidsdatum instellen voor het hoofdsleutelpaar en het is aan te raden dit te doen. Vrees niet, je kunt deze datum te allen tijde aanpassen en zo ook verlengen. Als je nu een sleutelpaar een levensduur geeft van 2 jaar, kun je over anderhalf jaar de geldigheid weer een jaar vooruit zetten. Deze geldigheid zet je in zodat de keys ongeldig worden in geval van verlies van de private sleutel, of wanneer je de passphrase voor je sleutelpaar vergeet, of wanneer je stopt ze te gebruiken. Zo zweeft er van de auteur nog een sleutelpaar uit 2010 rond op het internet waarvan ik het private deel niet meer heb, maar gelukkig vervalt deze in 2015.

In het voorbeeld heb ik gekozen voor 3 jaar. Maar je kunt altijd beginnen met een kortere geldigheid, als je bijvoorbeeld GPG voor het eerst probeert, je kunt het later immers toch aanpassen.

Please specify how long the key should be valid.
       0 = key does not expire
    <n>  = key expires in n days
    <n>w = key expires in n weeks
    <n>m = key expires in n months
    <n>y = key expires in n years
    Key is valid for? (0) 3y
Key expires at Sun 18 Dec 2016 10:43:03 AM CET
Is this correct? (y/N) y

Nu zal GnuPG vragen om je identiteit, om deze te graveren in het sleutelpaar. Geef bij "Real Name" bij voorkeur je hele voor- en achternaam op, je bent vrij om eventuele doopnamen ook te vermelden. Laat het e-mailadres blanco, dat komt later pas in een aparte "uid". Bij commentaar kun je wat meer details verstrekken waarmee je geïdentificeerd kunt worden. Ik heb gekozen voor een geboortejaar en een geboorteplaats. Denk er aan dat de informatie die je hier in zet o.a. in je publieke sleutel wordt opgenomen, en daarmee geschikt is openbaar te zijn. Zet hier dus niet je BSN in, want dat heb ik een andere handleiding eens zien aanraden... Je kunt ook andere details gebruiken waaraan anderen jou kunnen herkennen of zelfs besluiten om deze informatie in zijn geheel weg te laten als je je identiteit zoveel mogelijk wilt verbergen

GnuPG needs to construct a user ID to identify your key.

Real name: Stefan Joosten
Email address: 
Comment: born in 1987, Nijmegen, the Netherlands
You selected this USER-ID:
    "Stefan Joosten (born in 1987, Nijmegen, the Netherlands)"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.

Een geschikte passphrase is lekker lang en moeilijk te raden. Een zinnetje kan hartstikke geschikt zijn. Iets in de trant van "Veilig communiceren in een boze wereld!1234AB" is een voorbeeld van een (voor mij) makkelijk te onthouden passphrase. Bedenk rustig een ander zinnetje of bedenk een paar losse woorden die je in een rijtje kunt zetten voor jezelf, zolang het maar uniek, niet kort en voor jou goed te onthouden is.

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.

Nu wordt het hoofdsleutelpaar daadwerkelijk gemaakt. Dit proces kan even duren, zeker als er weinig bronnen zijn waar de computer willekeurige getallen uit kan halen. Zoals GnuPG zelf aangeeft: gebruik de computer, ga wat bestanden en/of e-mail opruimen, speel een spelletje, bekijk een schattig/grappig kattenfilmpje en heb vooral even geduld.

Uiteindelijk krijg je een uitslag als deze terug:

gpg: /home/stefan/.gnupg/trustdb.gpg: trustdb created
gpg: key 346E1FCB marked as ultimately trusted
public and secret key created and signed.

gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2016-12-18
pub   4096R/346E1FCB 2013-12-19 [expires: 2016-12-18]
    Key fingerprint = EABB 2F9A 3BE1 B2CB DD9E  7828 839C AAC7 346E 1FCB
uid                  Stefan Joosten (born in 1987, Nijmegen, the Netherlands)

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.

Het hoofdsleutelpaar is nu aangemaakt. De "key fingerprint" wordt gebruikt om verschillende keys te onderscheiden, je kunt ze gebruiken om een unieke key te selecteren. Ook kan aan zo'n vingerafdruk een zekere mate van vertrouwen worden toegekend. Je eigen sleutel vertrouw je standaard natuurlijk, daarom krijgt die een zogenaamd "Ultimate" vertrouwen toegekend. Over dit "Trust" concept vertel ik in een later blog wellicht nog wat meer.

Nu is het tijd om één of meerdere e-mailadressen toe te voegen aan je sleutels zodat je deze adressen straks in combinatie met GnuPG kunt gaan gebruiken. Doe zoals GnuPG in het eerdere bericht voorstelt met de --edit-key vlag. Wel dien je GnuPG te vertellen welke key je wilt aanpassen. Die selectie kan zowel op naam als met de eerder genoemde vingerafdruk.

$ gpg2 --edit-key "Stefan Joosten"

Vervang mijn naam hier met de naam die jij hebt gebruikt voor je hoofdsleutelpaar. Je kunt hier ook een uniek deel van de key fingerprint gebruiken.

$ gpg2 --edit-key "Stefan Joosten"                                                                                                                            
gpg (GnuPG) 2.0.19; Copyright (C) 2012 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

pub  4096R/346E1FCB  created: 2013-12-19  expires: 2016-12-18  usage: SC  
                    trust: ultimate      validity: ultimate
[ultimate] (1). Stefan Joosten (born in 1987, Nijmegen, the Netherlands)

Met adduid kun je nu een uid toevoegen, welke bijvoorbeeld een e-mailadres bevat. Gebruik weer je volledige voor- en achternaam en vul nu wel een e-mailadres in. Het commentaarveld kan leeg blijven, of je moet een goede reden hebben om hier wat commentaar te plaatsen.

gpg> adduid
Real name: Stefan Joosten
Email address: stefan@atcomputing.nl
Comment: 
You selected this USER-ID:
    "Stefan Joosten <stefan@atcomputing.nl>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O

You need a passphrase to unlock the secret key for
user: "Stefan Joosten (born in 1987, Nijmegen, the Netherlands)"
4096-bit RSA key, ID 346E1FCB, created 2013-12-19

pub  4096R/346E1FCB  created: 2013-12-19  expires: 2016-12-18  usage: SC  
                    trust: ultimate      validity: ultimate
[ultimate] (1)  Stefan Joosten (born in 1987, Nijmegen, the Netherlands)
[ unknown] (2). Stefan Joosten <stefan@atcomputing.nl>

Zoals je kunt zien is het gewenste e-mailadres toegevoegd. Al wordt deze nog niet standaard vertrouwd. Daar kun je gemakkelijk verandering in brengen met trust gevolgd door het nummer van het uid waarvan je het vertrouwen er in wilt bewerken. In dit geval dus:

gpg> trust 2
..output ingekort..
Your decision? 5
Do you really want to set this key to ultimate trust? (y/N) y

pub  4096R/346E1FCB  created: 2013-12-19  expires: 2016-12-18  usage: SC  
                    trust: ultimate      validity: ultimate
[ultimate] (1)  Stefan Joosten (born in 1987, Nijmegen, the Netherlands)
[ unknown] (2). Stefan Joosten <stefan@atcomputing.nl>

Je ziet dat er niks is veranderd! Toch is dat niet het geval, de wijzigingen in vertrouwen worden pas zichtbaar zodra je deze wijzigingen hebt opgeslagen met save, maar wacht daar nog even mee, want GnuPG beëindigt zichzelf na deze opdracht. Als je graag nu het resultaat wilt zien, open dan daarna nogmaals gpg2 --edit-key <jouw keyid of naam>.

Wil je nog meer e-mailadressen toevoegen? Geen probleem, herhaal de bovenstaande stappen dan nogmaals.

Aanmaken subkeys

Nu kunnen de twee subkeys worden aangemaakt waarmee je berichten (en data) kunt gaan signeren en versleutelen. Laten we beginnen met de subkey voor het signeren. Het toevoegen van een subkey doe je met het commando addkey en kies optie 4:

gpg> addkey
Key is protected.

You need a passphrase to unlock the secret key for
user: "Stefan Joosten <stefan@atcomputing.nl>"
4096-bit RSA key, ID 346E1FCB, created 2013-12-19

Please select what kind of key you want:
    (3) DSA (sign only)
    (4) RSA (sign only)
    (5) Elgamal (encrypt only)
    (6) RSA (encrypt only)
Your selection? 4

Ook hier mag weer de lengte van de sleutel opgegeven worden. In het voorbeeld heb ik voor 3072 bits gekozen, omdat ik weet dat dit het maximum is wat de OpenPGP Smartcard v2 ondersteunt. Mocht je die ooit willen gebruiken om je sleutels met je mee te dragen, dan is 3072 bits je maximum op dit moment. Zelf gebruik ik voor mijn echte key 4096 bits grote subkeys, want ik maak (nog?) geen gebruik van een dergelijk kaart.

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 3072
Requested keysize is 3072 bits

Ook hier geef je weer een houdbaarheidsdatum op. Zo'n subkey kun je makkelijker doorwisselen, dus daar kun je met de geldigheidsduur rekening mee houden, maar dat verhaal heb ik al eerder uitgelegd. Ik heb de geldigheid hier op een jaar gezet, maar als je hogere veiligheidseisen hebt kun bijvoorbeeld ook 6 maanden (of nog minder) opgeven. Het is misschien handig om even een herinnering in je agenda te zetten, zodat je bijvoorbeeld een maand voordat de keys vervallen een paar nieuwe kunt aanmaken en je contacten op de hoogte stellen zodat zij de nieuwe publieke delen er van kunnen binnenhalen.

Please specify how long the key should be valid.
        0 = key does not expire
     <n>  = key expires in n days
     <n>w = key expires in n weeks
     <n>m = key expires in n months
     <n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Fri 19 Dec 2014 05:19:19 PM CET
Is this correct? (y/N) y
Really create? (y/N) y

Wederom even geduld hebben:

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.

Et voila:

pub  4096R/346E1FCB  created: 2013-12-19  expires: 2016-12-18  usage: SC  
                    trust: ultimate      validity: ultimate
sub  3072R/E794016A  created: 2013-12-19  expires: 2014-12-19  usage: S   
[ultimate] (1). Stefan Joosten <stefan@atcomputing.nl>
[ unknown] (2)  Stefan Joosten (born in 1987, Nijmegen, the Netherlands)

Er is een subkey bijgekomen met eigenschap "usage: S" wat inhoudt dat deze gebruikt wordt voor Signing. Nu kunnen we de volgende subkey aanmaken, deze gaat functie "usage: E" vervullen. De output heb ik wat ingekort.

gpg> addkey
..
Your selection? 6

What keysize do you want? (2048) 3072
Key is valid for? (0) 1y
Key expires at Fri 19 Dec 2014 05:34:20 PM CET
Is this correct? (y/N) y
Really create? (y/N) y

En is het resultaat als volgt:

pub  4096R/346E1FCB  created: 2013-12-19  expires: 2016-12-18  usage: SC  
                    trust: ultimate      validity: ultimate
sub  3072R/E794016A  created: 2013-12-19  expires: 2014-12-19  usage: S   
sub  3072R/C06FF3C8  created: 2013-12-19  expires: 2014-12-19  usage: E   
[ultimate] (1). Stefan Joosten <stefan@atcomputing.nl>
[ unknown] (2)  Stefan Joosten (born in 1987, Nijmegen, the Netherlands)

Bewaar je wijzigingen nu met save, waarna GnuPG zal sluiten:

gpg> save

Proficiat! Je hebt nu een hoofdsleutelpaar welke jouw identiteit representeert en twee subsleutelparen welke gebruikt kunnen worden voor het Signeren en de Encryptie van data, zoals de inhoud van e-mail. Je bent nu dus klaar om deze techniek in gebruik te nemen. Al zijn er nog wel huishoudelijke taken te verrichten om eventueel verlies van de key tegen te gaan, en om in geval van zo'n situatie de sleutel ongeldig te kunnen verklaren.

Maken van een revocation certificate

Hiermee kun je een key ongeldig verklaren zonder dat je het private deel van de hoofdsleutel dient te bezitten, je hoeft enkel de passphrase te weten. Het maken van zo'n bestand kan van pas komen wanneer je de controle over je hoofdsleutelpaar verliest om wat voor reden dan ook. Sla dit bestand veilig op, want net als het private deel van het hoofdsleutelpaar wil je niet dat deze in vreemde handen valt. Ik bewaar mijn kopie hiervan buiten een PC op een USB stick op een veilige plek. Verander "JouwNaam" in je eigen naam of een andere gewenste filename.

$ gpg2 --output JouwNaam.revoke.asc --gen-revoke 346E1FCB

"346E1FCB" is het ID van de key die ik zojuist heb aangemaakt. Het is ook mogelijk hier een naam op te geven zoals "Stefan", maar als je meerdere personen genaamd "Stefan" kent, dan wordt het wat lastig onderscheiden voor gpg2 welke je precies bedoelt.

sec  4096R/346E1FCB 2013-12-19 Stefan Joosten (born in 1987, Nijmegen, the Netherlands)

Create a revocation certificate for this key? (y/N) y

Nu mag ik een reden opgeven waarom ik deze key wil intrekken. Ik volg hier de suggestie van GnuPG, optie 1. Omdat ik dit nood-revocation-certificate enkel zal gebruiken wanneer ik de controle over het private deel van mijn hoofdsleutelpaar ben verloren. Ook mag je nog wat vrij commentaar invullen als je dat zou wensen, ik heb dat leeg gelaten.

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? 1
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

Na het invullen van je passphrase wordt dan een revocation certificaat weggeschreven naar het eerder opgegeven uitvoerbestand. Dit bestand is een doodnormaal tekstbestand en kun je dan ook met elke gewenste editor bekijken. Kopieer het naar een ander opslagmedium, zoals een USB stick of CD-ROM, welke je vervolgens veilig opbergt. En verwijder het origineel van je computer.

Reservekopie maken van je sleutelpaar

Het is zeker verstandig om een reservekopie te maken van je sleutels. Stel je verwijdert per ongeluk wat bestanden, zoals een collega van mij recent nog is overkomen, of je computer raakt in zijn geheel defect, dan zou je je sleutels kwijt zijn. Met zo'n reservekopie kun je ze gemakkelijk weer inladen op een andere computer. Er zijn meerdere manieren om je sleutels te kopiëren. Je kunt bijvoorbeeld je gehele ~/.gnupg kopëren en indien nodig weer terug zetten, dat werkt prima. Je kunt ook sleutels, hun publieke en private delen los van elkaar, exporteren en importeren. Een manier om alle sleutels naar een bestand te kopiëren zodat je deze op je reserve-medium kunt bewaren:

Allereerst de publieke delen van de sleutels exporteren. Vervang uiteraard "JouwNaam" weer met je eigen invulling:

$ gpg2 --output JouwNaam.public.asc --export 346E1FCB

En de private delen:

$ gpg2 --output JouwNaam.private.asc --export-secret-keys 346E1FCB

Wees voorzichtig met dit tweede bestand, want deze wil je zoveel mogelijk uit vreemde handen houden. Verplaats deze twee bestanden naar je reservemedium en verwijder ze van je computer.

Referenties

Interessante materie en bronnen die ik heb gebruikt voor dit stukje: