GPG is een van die tools die iedereen “ooit moet leren” maar waar niemand zin in heeft. De documentatie is overweldigend, de terminologie verwarrend, en de error messages cryptisch (pun intended).
Maar GPG is ook onmisbaar. Het is de basis voor pass, voor signed git commits, voor versleutelde email, en voor het verifiëren van software downloads. Als je serieus bent over security, ontkom je er niet aan.
Dit is de gids die ik zelf had willen hebben toen ik begon.
Wat is GPG eigenlijk?
GPG (GNU Privacy Guard) is een implementatie van het OpenPGP protocol. Het doet twee dingen:
- Encryptie: Bestanden versleutelen zodat alleen de bedoelde ontvanger ze kan lezen
- Signing: Digitaal ondertekenen zodat anderen kunnen verifiëren dat iets van jou komt
Dit werkt met asymmetrische cryptografie: je hebt een public key (die je deelt) en een private key (die je geheim houdt).
- Iemand wil jou een geheim sturen → versleutelt met jouw public key → alleen jij kunt ontsleutelen met je private key
- Jij wilt bewijzen dat iets van jou komt → onderteken met je private key → anderen verifiëren met je public key
Dat is het. De rest is implementatiedetails.
In 5 minuten je eerste keypair
Installatie
# macOS
brew install gnupg
# Debian/Ubuntu
sudo apt install gnupg
# Arch
sudo pacman -S gnupg
Keypair genereren
gpg --full-generate-key
Je krijgt een paar vragen:
Please select what kind of key you want:
(1) RSA and RSA
(9) ECC (sign and encrypt)
Kies (1) RSA and RSA voor maximale compatibiliteit, of (9) ECC voor moderne, kortere keys.
What keysize do you want? (3072)
Kies 4096 voor RSA. Meer is beter (binnen redelijke grenzen).
Key is valid for? (0)
Kies 2y (2 jaar). Je kunt later verlengen. Een key zonder expiry is riskant — als je ’m verliest, is hij voor altijd geldig.
Real name: Tom Meurs
Email address: tom@example.com
Comment:
Vul je naam en email in. Comment mag leeg.
Enter passphrase:
Kies een sterke passphrase. Dit is de laatste verdedigingslinie als iemand je private key steelt.
Klaar. Je hebt nu een GPG keypair.
Keys bekijken
# Lijst je public keys
gpg --list-keys
# Lijst je private keys
gpg --list-secret-keys
Output ziet er zo uit:
pub rsa4096 2026-01-26 [SC] [expires: 2028-01-26]
ABC123DEF456GHI789JKL012MNO345PQR678STU9
uid [ultimate] Tom Meurs <tom@example.com>
sub rsa4096 2026-01-26 [E] [expires: 2028-01-26]
Die lange string is je key ID (fingerprint). De korte versie (laatste 16 karakters) wordt vaak gebruikt: MNO345PQR678STU9.
Direct bruikbaar: bestanden versleutelen
Versleutelen voor jezelf
# Versleutel een bestand
gpg --encrypt --recipient tom@example.com secret.txt
# Maakt secret.txt.gpg
# Ontsleutel
gpg --decrypt secret.txt.gpg > secret.txt
Versleutelen voor iemand anders
Eerst heb je hun public key nodig:
# Importeer een public key
gpg --import colleague-key.asc
# Of haal op van een keyserver
gpg --keyserver keyserver.ubuntu.com --recv-keys THEIR_KEY_ID
Dan versleutelen:
gpg --encrypt --recipient colleague@example.com secret.txt
Alleen zij kunnen het nu ontsleutelen.
Symmetrische encryptie (wachtwoord)
Geen keys nodig, gewoon een wachtwoord:
gpg --symmetric secret.txt
# Vraagt om wachtwoord, maakt secret.txt.gpg
Handig voor quick-and-dirty encryptie, maar minder veilig dan asymmetrisch.
Signing: bewijzen dat iets van jou komt
Een bestand ondertekenen
# Maak een losse signature
gpg --detach-sign document.pdf
# Maakt document.pdf.sig
# Of embed de signature
gpg --sign document.pdf
# Maakt document.pdf.gpg (signed + compressed)
# Of clearsign (leesbaar met signature erin)
gpg --clearsign message.txt
# Maakt message.txt.asc
Signature verifiëren
gpg --verify document.pdf.sig document.pdf
Output:
gpg: Signature made Mon Jan 26 12:00:00 2026 CET
gpg: using RSA key ABC123...
gpg: Good signature from "Tom Meurs <tom@example.com>"
Als je “BAD signature” ziet, is het bestand gewijzigd of de signature fake.
Git commits signen
Dit is misschien wel de meest praktische use case voor GPG.
Git configureren
# Vertel git welke key te gebruiken
git config --global user.signingkey YOUR_KEY_ID
# Automatisch alle commits signen
git config --global commit.gpgsign true
# Automatisch alle tags signen
git config --global tag.gpgsign true
Signed commit maken
git commit -S -m "This commit is signed"
GitHub/GitLab tonen een “Verified” badge bij signed commits.
Je public key aan GitHub toevoegen
# Exporteer je public key
gpg --armor --export tom@example.com
Kopieer de output (inclusief -----BEGIN PGP PUBLIC KEY BLOCK-----) en plak in GitHub → Settings → SSH and GPG keys → New GPG key.
Je public key delen
Exporteren
# Als ASCII (voor email, websites)
gpg --armor --export tom@example.com > tom-public.asc
# Als binary
gpg --export tom@example.com > tom-public.gpg
Naar een keyserver uploaden
gpg --keyserver keyserver.ubuntu.com --send-keys YOUR_KEY_ID
Nu kan iedereen je key vinden met:
gpg --keyserver keyserver.ubuntu.com --search-keys tom@example.com
Op je website zetten
Veel mensen zetten hun public key op example.com/.well-known/openpgpkey/ of gewoon example.com/pgp.asc.
Deep dive: subkeys
Tot nu toe heb je één keypair. Maar GPG ondersteunt subkeys: aparte keys die onder je master key hangen.
Waarom subkeys?
Je master key is heilig. Als die gecompromitteerd raakt, is alles verloren. Met subkeys:
- Je master key blijft offline (cold storage)
- Subkeys gebruik je dagelijks
- Als een subkey lekt, revoke je alleen die subkey
- Je identiteit (master key) blijft intact
Subkey structuur
Typische setup:
Master key [C] (certify) - offline bewaren
├── Subkey [S] (signing) - dagelijks gebruik
├── Subkey [E] (encryption) - dagelijks gebruik
└── Subkey [A] (authentication) - SSH login
Subkeys aanmaken
gpg --edit-key tom@example.com
In de GPG prompt:
gpg> addkey
Please select what kind of key you want:
(4) RSA (sign only)
(6) RSA (encrypt only)
# Maak een sign-only subkey
# Maak een encrypt-only subkey
gpg> save
Master key offline halen
Dit is waar het serieus wordt:
# Exporteer alles (backup!)
gpg --armor --export-secret-keys tom@example.com > master-backup.asc
# Exporteer alleen subkeys
gpg --armor --export-secret-subkeys tom@example.com > subkeys.asc
# Verwijder secret keys van je machine
gpg --delete-secret-keys tom@example.com
# Importeer alleen de subkeys
gpg --import subkeys.asc
Nu heb je alleen subkeys op je machine. De master key zit veilig op een USB stick in een kluis.
gpg --list-secret-keys
# sec# rsa4096 ... ← de # betekent: master key niet aanwezig
Hardware keys: YubiKey
De ultieme setup: je private keys op een hardware token.
Waarom?
- Keys verlaten nooit de hardware
- Malware kan je keys niet stelen
- Fysieke beveiliging (je moet de YubiKey hebben)
Keys naar YubiKey verplaatsen
gpg --edit-key tom@example.com
gpg> key 1 # selecteer subkey
gpg> keytocard
Please select where to store the key:
(1) Signature key
(3) Authentication key
gpg> key 2 # selecteer volgende subkey
gpg> keytocard
gpg> save
Nu moet je de YubiKey aansluiten om te kunnen signen of decrypten.
GPG + SSH met YubiKey
Je kunt GPG authentication keys gebruiken voor SSH:
# In ~/.bashrc of ~/.zshrc
export SSH_AUTH_SOCK=$(gpgconf --list-dirs agent-ssh-socket)
# Enable SSH support in gpg-agent
echo "enable-ssh-support" >> ~/.gnupg/gpg-agent.conf
gpgconf --kill gpg-agent
Nu werkt ssh via je YubiKey. Eén hardware token voor GPG én SSH.
De nadelen van GPG
En hier wordt het eerlijk. GPG heeft serieuze problemen.
De UX is verschrikkelijk
GPG is ontworpen in de jaren ‘90 en het voelt zo. De command-line interface is inconsistent, de error messages zijn cryptisch, en simpele taken vereisen obscure flags.
gpg: decryption failed: No secret key
# Wat betekent dit? Key verlopen? Verkeerde key? Geen idee.
Er zijn GUI’s (Kleopatra, GPG Keychain), maar die zijn ook niet geweldig.
Key management is complex
- Hoe backup je keys veilig?
- Hoe roteer je keys zonder alles te breken?
- Hoe revoke je een gecompromitteerde key zodat iedereen het weet?
- Hoe deel je keys met mensen die GPG niet snappen?
Dit zijn opgeloste problemen, maar de oplossingen zijn niet intuïtief.
Web of Trust is effectief dood
Het originele PGP model was: mensen signen elkaars keys om vertrouwen op te bouwen. In de praktijk doet bijna niemand dit. De meeste mensen vertrouwen keys op basis van… hopen dat het klopt.
Keyservers zijn problematisch
Keyservers zijn:
- Vaak traag of offline
- Kunnen niet verifiëren of uploads legitiem zijn
- Hebben in het verleden spam/abuse gehad
- SKS keyserver network is grotendeels kapot
Alternatief: keys.openpgp.org verifieert email adressen.
Metadata lekt
GPG versleutelt de inhoud, maar niet:
- Wie de ontvanger is (zichtbaar in encrypted blob)
- Bestandsnaam en grootte
- Wanneer het versleuteld is
Voor hoogrisico situaties is dit een probleem.
Email encryptie is grotendeels gefaald
PGP email (via Enigmail, etc.) heeft nooit mainstream adoptie bereikt. De setup is te complex, de UX te slecht, en alternatieven (Signal, encrypted messaging) zijn veel gebruiksvriendelijker.
Alternatieven bestaan
- age: Moderne, simpele encryptie tool. Geen key management gedoe.
- Signal: Voor messaging, veel betere UX.
- Keybase: Was een poging om PGP gebruiksvriendelijk te maken (nu onderdeel van Zoom).
Wanneer GPG wél de juiste keuze is
Ondanks de nadelen is GPG nog steeds de beste optie voor:
- Git commit signing: Geen goed alternatief
- Password managers (pass): GPG is de standaard
- Software signing: Package managers verwachten GPG signatures
- Encrypted backups: Battle-tested, breed ondersteund
- Interoperabiliteit: Iedereen met GPG kan je berichten lezen
Mijn setup
# ~/.gnupg/gpg.conf
default-key ABC123...
keyserver hkps://keys.openpgp.org
auto-key-retrieve
# Moderne crypto voorkeuren
personal-cipher-preferences AES256 AES192 AES
personal-digest-preferences SHA512 SHA384 SHA256
personal-compress-preferences ZLIB BZIP2 ZIP Uncompressed
Mijn master key zit op een air-gapped machine. Subkeys zitten op een YubiKey. Ik gebruik GPG primair voor:
- Git commit signing
- Pass (password manager)
- Incidenteel bestanden versleutelen
Voor messaging gebruik ik Signal. Voor ad-hoc encryptie soms age.
Praktische tips
1. Backup je keys
# Nu. Voordat je het vergeet.
gpg --armor --export-secret-keys > ~/backup/gpg-secret-keys.asc
gpg --armor --export > ~/backup/gpg-public-keys.asc
gpg --export-ownertrust > ~/backup/gpg-ownertrust.txt
Zet dit op een encrypted USB stick. In een kluis. Serieus.
2. Zet een calendar reminder voor expiry
Keys verlopen. Als je niet op tijd verlengt, kun je je eigen bestanden niet meer ontsleutelen.
gpg --edit-key tom@example.com
gpg> expire
# Kies nieuwe datum
gpg> save
3. Gebruik een goede passphrase
Je passphrase beschermt je private key. Maak het lang, onvoorspelbaar, en gebruik een password manager om het op te slaan.
4. Verifieer fingerprints out-of-band
Als je iemands public key importeert, verifieer de fingerprint via een ander kanaal (telefoon, in persoon). Keyservers kunnen gehackt zijn.
Conclusie
GPG is krachtig maar complex. Het is de de-facto standaard voor asymmetrische cryptografie op de command line, maar de UX is een constante bron van frustratie.
Is het de moeite waard om te leren? Ja, als je:
- Git commits wilt signen
- Pass wilt gebruiken
- Bestanden veilig wilt versleutelen
- Software wilt verifiëren
Nee, als je:
- Alleen veilig wilt chatten (gebruik Signal)
- Eenvoudige file encryptie wilt (overweeg age)
- Niet tegen CLI-frustratie kunt
Start simpel: genereer een key, sign je git commits, en bouw van daaruit op. Je hoeft niet meteen subkeys en YubiKeys te begrijpen. Dat komt later, als je er klaar voor bent.
GPG is als vim: een steile leercurve, maar als je eenmaal over de heuvel bent, wil je niet meer terug.
Resources:
- GnuPG documentatie
- OpenPGP Best Practices
- keys.openpgp.org — moderne keyserver met email verificatie
- age — simpel alternatief voor file encryptie
