GnuPG Logo
GnuPG Logo, Thomas Wittek, GnuPG Projekt, Gemeinfrei

Gnu Privavy Guard oder GnuPG (gpg) ist eine freie Kryptographiesoftware, die das OpenPGP Message Format gemäß RFC 48801 implementiert. GnuPG ist unter Windows (Gpg4win), Android (OpenKeychain), MacOS (GPG Suite) und Linux (dort meistens per Default an Board) sowie anderen unixioden System verfügbar.

Die primären Anwendungsgebiete von GnuPG sind die Sicherstellung von Integrität beziehungsweise vertraulicher digitaler Kommunikation und Privatsphäre. Beispiele für Sicherstellung von Integrität sind signierte Emails, signierte Softwarepakete wie z.B. unter Debian2 oder signierte Git3 Commits4 und Tags/Releases5 auf wie Github, durch die man Echtheit und Quelle überprüfen kann. Das wohl bekannteste Beispiel für die Sicherstellung von digitaler Privatsphäre ist neben dem Ver- und Entschlüsseln von Dateien die verschlüsselte Emailkommunikation

Dieses Howto beschreibt unter anderem die Erstellung eines GnuPG Schlüsselpaares, das Hinzufügen weiterer Emailadressen als Unterschlüssel, die Konfiguration von GnuPG und des GPG-Agents, der Einrichtung eines Web Key Directories (WKD Direct Method) und gebräuchliche Anwendungsfälle auf der Kommandozeile (gpg), wie z.B. dem Arbeiten mit Keyservern6.
Es ist auf die oben genannten Systeme übertragbar.

Inhaltverzeichnis

Konzept und Terminologie

GnuPG verwendet das sogenannte Asymmetrische Verschlüsselungsverfahren7, das heißt, dass es 2 Arten von Schlüssel gibt, Öffentliche- (Public Keys)8 und Private Schlüssel (private Keys)9. Jeder Schlüssel hat sein dazugehöriges Gegenstück, allgemein als Schlüsselpaar bezeichnet.

Der öffentliche Schlüssel wird zum Verschlüsseln und zur Überprüfung von Signaturen genutzt und muss deinem Kommunikationspartner zur Verfügung stehen, damit er diese Aktionen ausführen kann. Öffentliche Schlüssel können z.B. über Keyserver oder Web Key Directory (WKD) verbreitet werden.

Der private Schlüssel wird hingegen zum Signieren und Entschlüsseln genutzt und sollte, wie der Name schon vermuten lässt, eher nicht weitergegeben werden und ist i.d.R mit einem Passwort geschützt.

Die Schlüssel werden über Schlüsselbunde verwaltet, auch hier wieder die Unterscheidung:

  • einen für die Öffentlichen, ~/.gnupg/pubring.gpg, eigenen Keys und die deiner Kommunikationspartner
  • und den für die Privaten, ~/.gnupg/secring.gpg

Erstellung eines GnuPG Schlüsselpaares

Zur Erstellung eines GnuPG Schlüsselpaares ist der folgende Befehl unter deiner Benutzer-ID, also dem Benutzer, unter dem der Key auch genutzt werden soll, auszuführen. Andernfalls müssen der Ort durch --homedir angegeben und ggf. Berechtigungen angepasst werden.

gpg --full-generate-key 

Anstelle der --full-generate-key kann auch --gen-key verwendet werden, es werden aber deutlich mehr Voreinstellungen, wie z.B. die Schlüsselgröße von 3072 Bits oder einem Ablaufdatum von 2 Jahren gemacht.

gpg (GnuPG) 2.2.4; Copyright (C) 2017 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.

gpg: Verzeichnis `/home/florian/.gnupg' erzeugt
gpg: Die "Keybox" `/home/florian/.gnupg/pubring.kbx' wurde erstellt

Verschüsselungsalgorithmus wählen:

Bitte wählen Sie, welche Art von Schlüssel Sie möchten:
   (1) RSA und RSA (voreingestellt)
   (2) DSA und Elgamal
   (3) DSA (nur signieren/beglaubigen)
   (4) RSA (nur signieren/beglaubigen)
Ihre Auswahl? 1

Wir entscheiden uns mit 1 für die Voreinstellung RSA und RSA und bestätigen mit Enter.

Wahl der Länge bzw. Stärke des Schlüssels voreingestellt 3072 Bit.

RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie? (3072) 4096

Wir wählen den Maximalwert von 4096 und bestätigen mit Enter.
Es folgt die Quittierung von GnuPG:

Die verlangte Schlüssellänge beträgt 4096 Bit

Gültigkeitzeitraum des Schlüssels.
Hier kann spezifiziert werden, ob und wann der Schlüssel verfällt. Hier sollte entgegen dem Defaults (0) auf jeden Fall ein Ablaufdatum gewählt werden, denn in Falle eines korrumpierten Rechners oder Schlüssel verfällt dieser immerhin irgendann.

Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
         0 = Schlüssel verfällt nie
      <n>  = Schlüssel verfällt nach n Tagen
      <n>w = Schlüssel verfällt nach n Wochen
      <n>m = Schlüssel verfällt nach n Monaten
      <n>y = Schlüssel verfällt nach n Jahren
Wie lange bleibt der Schlüssel gültig? (0) 2y

Wir möchten, dass unser Schlüssel 2 Jahr gültig ist und geben entsprechend 2y über die Tastatur ein. Nach einem Enter quittiert gpg:

Key verfällt am Sa 01 Jul 2023 13:12:45 CEST

Anschließend wird die Eingabe nochmal hinterfragt:

Ist dies richtig? (j/N) j

Das bestätigen wir mit j gefolgt von Enter.

Jetzt kommen wir zur Eingabe von Name, Emailadresse und optionalen Kommentar

GnuPG erstellt eine User-ID, um Ihren Schlüssel identifizierbar zu machen.

Voller bzw. Realname:

Ihr Name: Florian Latzel

Die Email-Adresse, die unsere spätere UID wird…

Email-Adresse: florian@latzel.io

Die Email-Adresse florian@latzel.io, gefolgt von Enter.

Und ein optionaler Kommentar, den wir mit Enter überspringen.

Kommentar: 

Es folgt eine letzte Überprüfung:

Sie haben diese User-ID gewählt:
    "Florian Latzel <florian@latzel.io>"
Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(A)bbrechen? F

Wir wollen die Schlüsselerstellung abschließen und geben F gefolgt von Enter ein.

Wir müssen eine ganze Menge Zufallswerte erzeugen.  Sie können dies
unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas
tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen.
gpg: /home/florian/.gnupg/trustdb.gpg: trust-db erzeugt
gpg: Schlüssel F4F62999C3BA4866 ist als ultimativ vertrauenswürdig gekennzeichnet
gpg: Verzeichnis `/home/florian/.gnupg/openpgp-revocs.d' erzeugt
gpg: Widerrufzertifikat wurde als '/home/florian/.gnupg/openpgp-revocs.d/3F9F644542DD63E82165D376F4F62999C3BA4866.rev' gespeichert.
Öffentlichen und geheimen Schlüssel erzeugt und signiert.

pub   rsa4096 2021-07-01 [SC] [verfällt: 2023-07-01]
      3F9F644542DD63E82165D376F4F62999C3BA4866
uid                      Florian Latzel <florian@latzel.io>
sub   rsa4096 2021-07-01 [E] [verfällt: 2023-07-01]

Ein GPG Widerrufs (Revoke) Zertifikat erstellen

Es gibt Falle, in dem du deinen Schlüssel auf den Keyservern widerrufen möchtest, wie z.B. eine nicht genutzte Emailadresse, eine unzureichende Stärke des Schlüssels oder im schlimmsten Fall sind dein Schlüssel oder Rechner korrumpiert worden.

Mittlerweile generiert GnuPG (unter Ubuntu) via Default ein Widerrufszertifikat bei der Schlüsselerstellung(s.o).
Ein GnuPG Widerrufszertifikat solltest du unbedingt erstellen und sicher aufbewahren.

Manuelle Erstellung des Widerrufszertikats.
Die Nutzer-ID kann EMail oder die Key-ID sein. Hier mit der User-ID florian@latzel.io, der Revoke-Key wird in die Datei ~/florian@latzel.io-F4F62999C3BA4866-revoke-key.rev geschrieben.

gpg --gen-revoke florian@latzel.io > ~/florian@latzel.io-F4F62999C3BA4866-revoke-key.rev

GnuPG fragt, ob du mit der Erstellung des Widerrufszertifikats fortfahren möchtest, j - ja wollen wir:

sec  rsa4096/F4F62999C3BA4866 2021-07-01 Florian Latzel <florian@latzel.io>

Ein Widerrufszertifikat für diesen Schlüssel erzeugen? (j/N) j

Dann kannst du mögliche Gründe angeben. Hier lassen wir den Grund mal offen und wählen 0

Grund für den Widerruf:
  0 = Kein Grund angegeben
  1 = Hinweis: Dieser Schlüssel ist nicht mehr sicher
  2 = Schlüssel ist überholt
  3 = Schlüssel wird nicht mehr benutzt
  Q = Abbruch
(Wahrscheinlich möchten Sie hier 1 auswählen)
Ihre Auswahl? 0

…gleiches für die Beschreibung, wir überspringen mit Enter:

Geben Sie eine optionale Beschreibung ein. Beenden mit einer leeren Zeile:
> 

Grund für Widerruf: Kein Grund angegeben (Keine Beschreibung angegeben)

Abschließend wird gefragt, ob wir mit den vorher gemachten Eingaben OK sind und sagen mit j OK.

Ist das OK? (j/N) j

Wir bekommen noch ein paar Tipps für den Umgang mit den Widerrufszertifikat mit:

Ausgabe mit ASCII Hülle erzwungen
Widerrufszertifikat wurde erzeugt.

Bitte speichern Sie es auf einem Medium, welches Sie wegschließen
können; falls Mallory (ein Angreifer) Zugang zu diesem Zertifikat
erhält, kann er Ihren Schlüssel unbrauchbar machen.  Es wäre klug,
dieses Widerrufszertifikat auch auszudrucken und sicher aufzubewahren,
falls das ursprüngliche Medium nicht mehr lesbar ist.  Aber Obacht: Das
Drucksystem kann unter Umständen anderen Nutzern eine Kopie zugänglich
machen.

Unterschlüssel: mehrere Emailadressen mit einem GPG-Key nutzen

Statt der Erstellung eines neuen Schlüssels für jede weitere Emailadresse, besteht die Möglichkeit einem Schlüssel weitere Identitäten hinzufügen.

Weitere Emailadresse (User-ID) hinzufügen

Wir starten mit der Bearbeitung unseres Schlüssels via Key-ID, spezifizierbar über Emailadresse

gpg --edit-key florian@latzel.io

oder hexadizmalschreibweise

gpg --edit-key 3F9F644542DD63E82165D376F4F62999C3BA4866
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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.

Geheimer Schlüssel ist vorhanden.

sec  rsa4096/F4F62999C3BA4866
     erzeugt: 2021-07-01  verfällt: 2023-07-01  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/4260D8234C49E8D6
     erzeugt: 2021-07-01  verfällt: 2023-07-01  Nutzung: E   
[uneingeschränkt] (1). Florian Latzel <florian@latzel.io>

Wir befinden uns jetzt im interaktiven Modus von gnupg (erkennbar im Prompt gpg>), mit adduid initieren die Erstellung des Unterschlüssels.

adduid

Wie bei der Erstellung des Schlüssels, wird bei dem Erzeugen eines Unterschlüssels nach einem Namen…

Ihr Name: Florian Latzel

und einer Email-Adresse gefragt.

Email-Adresse: florian.latzel@is-loesungen.de

Kommentar: Wenn gewollt, kann auch der Unterschlüssel kommentiert werden.

Kommentar: 

Abschließend eine Zusammenfassung der gemachten Angaben, die wir mit F bestätigen:

Sie haben diese User-ID gewählt:
    "Florian Latzel <florian.latzel@is-loesungen.de>"

Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(A)bbrechen? F

Hier geht ein Pinentry Dialog auf, der zu Entsperrung des geheimen OpenPGP Schlüssels die entsprechende Passphrase verlangt.

Pinentry Dialog: Eingabe der Passphrase zum Entsperren des geheimen OpenPGP Schlüssels
Pinentry Dialog: Eingabe der Passphrase zum Entsperren des geheimen OpenPGP Schlüssels

Der neu hinzugefügte Unterschlüssel wird aufgelistet:

sec  rsa4096/F4F62999C3BA4866
     erzeugt: 2021-07-01  verfällt: 2023-07-01  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/4260D8234C49E8D6
     erzeugt: 2021-07-01  verfällt: 2023-07-01  Nutzung: E   
[ ultimativ ] (1)  Florian Latzel <florian@latzel.io>
[ unbekannt ] (2). Florian Latzel <florian.is-loesungen.de>
save

Nach dem Speichern mit save verlassen wir den interaktiven Modus von gpg und bekommen wieder den Prompt der Shell zu sehen.

Primäre User-ID kennzeichnen

Bei GnuPG lässt sich die primäre User-ID kennzeichnen.
Diese oder die zuletzt erstellte User-ID wird zuerst gelistet.

Wir müssen zur Kennzeichnung der primären User-ID in den Bearbeiten Modus:

gpg --edit-key florian@latzel.io

Im Listing ist die zuletzt erstellt User-ID oben und durch den Punkt hinter der numerischen Uid gekennzeichnet:

gpg (GnuPG) 2.2.27; Copyright (C) 2021 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.

Geheimer Schlüssel ist vorhanden.

sec  rsa4096/0A341CC78C16A22B
     erzeugt: 2023-07-06  verfällt: 2025-07-05  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/09CECAEE0F0A0039
     erzeugt: 2023-07-06  verfällt: 2025-07-05  Nutzung: E   
[ ultimativ ] (1). Florian Latzel <florian.latzel@is-loesungen.de>
[ ultimativ ] (2)  Florian Latzel <florian@latzel.io>

Wir wollen die User-ID florian@latzel.io, mit der wir den Schlüssel erstellt haben als primäre User-ID kennzeichnen. Dafür wählen wir die numerische Uid 2:

uid 2

Wir sehen anschließend die ausgewählte Uid durch den Stern hinter der Uid markiert:

sec  rsa4096/0A341CC78C16A22B
     erzeugt: 2023-07-06  verfällt: 2025-07-05  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/09CECAEE0F0A0039
     erzeugt: 2023-07-06  verfällt: 2025-07-05  Nutzung: E   
[ ultimativ ] (1). Florian Alexander Latzel <florian.latzel@is-loesungen.de>
[ ultimativ ] (2)* Florian Alexander Latzel <florian@latzel.io>

Zu guter letzt kennzeichnen wir primary gefolgt von der Uid, welche wir davor markiert haben die primäre User-ID:

primary 2

Es folgt ein Pinentry-Dialog zur Eingabe der Passphrase und die folgende Ausgabe:

sec  rsa4096/0A341CC78C16A22B
     erzeugt: 2023-07-06  verfällt: 2025-07-05  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/09CECAEE0F0A0039
     erzeugt: 2023-07-06  verfällt: 2025-07-05  Nutzung: E   
[ ultimativ ] (1)  Florian Alexander Latzel <florian.latzel@is-loesungen.de>
[ ultimativ ] (2)* Florian Alexander Latzel <florian@latzel.io>

Wir speichern unsere Änderung:

save

Wir überprüfen die Änderung:

gpg --list-key       

Die eben festgelegte Haupt User-ID steht jetzt oben.

/home/florian/.gnupg/pubring.kbx
--------------------------------
pub   rsa4096 2023-07-06 [SC] [verfällt: 2025-07-05]
      C4C820FFD9E7B564A31EBC960A341CC78C16A22B
uid        [ ultimativ ] Florian Latzel <florian@latzel.io>
uid        [ ultimativ ] Florian Latzel <florian.latzel@is-loesungen.de>
sub   rsa4096 2023-07-06 [E] [verfällt: 2025-07-05]

Wenn wir unseren Schlüssel bearbeiten, steht die primäre User-ID jetzt an erster Stelle und ist mit einem Punkt hinter der Uid gekennzeichnet.

gpg --edit-key florian@latzel.io
gpg (GnuPG) 2.2.27; Copyright (C) 2021 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.

Geheimer Schlüssel ist vorhanden.

sec  rsa4096/0A341CC78C16A22B
     erzeugt: 2023-07-06  verfällt: 2025-07-05  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/09CECAEE0F0A0039
     erzeugt: 2023-07-06  verfällt: 2025-07-05  Nutzung: E   
[ ultimativ ] (1). Florian Latzel <florian@latzel.io>
[ ultimativ ] (2)  Florian Latzel <florian.latzel@is-loesungen.de>
quit

Unterschlüssel (User-ID) entfernen

gpg --edit-key 768146CD269B69D1 
Der folgende Schlüssel wurde am 2007-05-27 von DSA Schlüssel 768146CD269B69D1 Florian Latzel <florian.latzel@is-loesungen.de> widerrufen
pub  dsa1024/768146CD269B69D1
     erzeugt: 2007-05-25  widerrufen: 2007-05-27  Nutzung: SC  
     Vertrauen: unbekannt     Gültigkeit: widerrufen
Der folgende Schlüssel wurde am 2007-05-27 von DSA Schlüssel 768146CD269B69D1 Florian Latzel <florian.latzel@is-loesungen.de> widerrufen
sub  elg2048/0D12C6401914C2F9
     erzeugt: 2007-05-25  widerrufen: 2007-05-27  Nutzung: E   
[ widerrufen] (1)  Florian Latzel <florian.latzel@is-loesungen.de>
[ widerrufen] (2)  Florian Latzel <f.latzel@is-loesungen.de>

Wir wählen den zu löschenden Unterschlüssel. Dieser wird durch die entsprechende Zahl in der runden Klammer (1) spezifiziert:

uid 1

Der entsprechende Unterschlüssel ist für die weitere Aktion ausgewählt, erkennbar am * hinter der Zahl:

Der folgende Schlüssel wurde am 2007-05-27 von DSA Schlüssel 768146CD269B69D1 Florian Latzel <florian.latzel@is-loesungen.de> widerrufen
pub  dsa1024/768146CD269B69D1
     erzeugt: 2007-05-25  widerrufen: 2007-05-27  Nutzung: SC  
     Vertrauen: unbekannt     Gültigkeit: widerrufen
Der folgende Schlüssel wurde am 2007-05-27 von DSA Schlüssel 768146CD269B69D1 Florian Latzel <florian.latzel@is-loesungen.de> widerrufen
sub  elg2048/0D12C6401914C2F9
     erzeugt: 2007-05-25  widerrufen: 2007-05-27  Nutzung: E   
[ widerrufen] (1)* Florian Latzel <florian.latzel@is-loesungen.de>
[ widerrufen] (2)  Florian Latzel <f.latzel@is-loesungen.de>

Jetzt die entsprechende Aktion:

deluid

Es folgt eine weitere Sicherheitsabfrage, die wir mit j quittieren:

Diese User-ID wirklich entfernen? (j/N) j
Der folgende Schlüssel wurde am 2007-05-27 von DSA Schlüssel 768146CD269B69D1 Florian Latzel <florian.latzel@is-loesungen.de> widerrufen
pub  dsa1024/768146CD269B69D1
     erzeugt: 2007-05-25  widerrufen: 2007-05-27  Nutzung: SC  
     Vertrauen: unbekannt     Gültigkeit: widerrufen
Der folgende Schlüssel wurde am 2007-05-27 von DSA Schlüssel 768146CD269B69D1 Florian Latzel <florian.latzel@is-loesungen.de> widerrufen
sub  elg2048/0D12C6401914C2F9
     erzeugt: 2007-05-25  widerrufen: 2007-05-27  Nutzung: E   
[ widerrufen] (1)  Florian Latzel <f.latzel@is-loesungen.de>

Mit save beenden wir die Bearbeitung und den interaktiven Modus.

save

Konfiguration von GnuPG

~/.gnupg/options

Grundlegende Konfiguration von gnupg in ~/.gnupg/options

default-key 3F9F644542DD63E82165D376F4F62999C3BA4866
charset utf-8
require-cross-certification
use-agent
keyserver hkps://keys.openpgp.org  
  • default-key, Schlüssel-ID unseres Hauptschlüssels
  • keyserver, Angabe des Default Keyservers, der genutzt werden soll
  • require-cross-certification, Schutz vor subtilen Angriffen auf Subkeys beim signieren (Default). Siehe auch no-require-cross-certification.
  • use agent, Dummy Option, wird immer benötigt

~/.gnupg/gpg-agent.conf

Konfiguration des gpg-agents in ~/.gnupg/gpg-agent.conf

default-cache-ttl 18000
max-cache-ttl 86400
ignore-cache-for-signing
no-grab
pinentry-program /usr/bin/pinentry-gnome3
debug-level basic
  • default-cache-ttl, Zeit in Sekunden, die ein Cache-Eintrags gülig ist
  • max-cache-ttl, Maximale Zeit in Sekunden, die ein Cache-Eintrag gültig ist
  • ignore-cache-for-signing Bypass des Passwort Caches bei Signing
  • no-grab Zur Vorbeugung von sog. X-Sniffing-Angriffen bei Nutzung von Pinentry.
  • pinentry-program, Absolute Pfadangabe dazu

Web Key Directory (WKD)

WKD10 ist einfaches Konzept zur Verteilung öffentlicher PGP-Schlüssel via HTTPS.

WKD bietet zwei Methoden um öffentliche Schlüssel abzurufen, die direct method und die advanced method. Neben einer unterschiedlichen Verzeichnisstruktur benötigt die advanced method zusätzlich eine Subdomain namens openpgpkey und einen entsprechenden TXT-Eintrag hierfür.

Die WKD direct method nutzt folgendes Schema für URLs:

https://$DOMAIN/.well-known/openpgpkey/hu/$HASHED_USERID,    

für florian@latzel.io ergibt sich daraus die folgende URL:
https://latzel.io/.well-known/openpgpkey/hu/qcuniwbujk3zrj7166onyz4t5cxgy3wb

Viele Mailcients11 wie z.B. Thunderbird, Outlook (GpgOL) oder Failmail (via OpenKeychain) nutzen WKD automatisch und einige Email-Provider (die cooleren12) haben WKD im Funktionsumfang.

Die folgende Schritte befassen sich mit der Einrichtung von WKD in der direct method.

WKD einrichten

So sieht die entsprechende Verzeichnisstruktur, für meine im Beispiel genutzte Emailadresse florian@latzel.io aus.
Wir blicken auf die Document Root für die Domain latzel.io auf uberspace.
Im Verzeichnis hu liegen die Dateien .htaccess und die Hashed-UserID aus florian.

/var/www/virtual/${USER}/latzel.io
└── .well-known
    └── openpgpkey
        ├── hu
        │   ├── .htaccess
        │   └── qcuniwbujk3zrj7166onyz4t5cxgy3wb
        └── policy

Voraussetzungen für die nächsten Schritte sind ein Webserver, der via HTTPS ausliefert, ein gültiges TLS Zertifikat besitzt und dir die Möglichkeit gibt .htaccess-Dateien zu nutzen (oder du hast entsprechend hohe Privilegien um Einstellungen an Webserver bzw. Konfiguration vornehmen zu können).

Sofern unsere Domain13, wie im hier genutzten Beispiel von uberspace13 ausgeliefert wird und ein entsprechender A- oder AAA-Eintrag existiert, wird der Webserver, dank des Let’s Encrypt Zertifikats den via WKD angefragten Key via TLS/SSL ausliefern.

Erzeugen der Verzeichnisstruktur für WKD:

mkdir -p /var/www/virtual/${USER}/latzel.io/.well-known/openpgpkey/hu

Symlink im Home Verzeichnis mit Namen der Domain erstellen:

ln -s /var/www/virtual/${USER}/latzel.io ~/

Anlegen der (leeren) Datei policy :

touch /var/www/virtual/${USER}/latzel.io/.well-known/openpgpkey/policy

Damit der Webserver die benötigten HTTP-Header ausliefert, legen wir eine .htaccess-Datei mit folgendem Inhalt an:

vi /var/www/virtual/${USER}/latzel.io/.well-known/openpgpkey/hu/.htaccess
<IfModule mod_mime.c>
   ForceType application/octet-stream
   Header always set Access-Control-Allow-Origin "*"
</IfModule>

Upload der Public Keys in das WKD

So kommst du an die WKD Hashes der Emailadressen:
Die sog. hashed-userid, ist ein SHA1 Hash, der aus dem lokalen Teil(User/Prefix), der anschließend mit dem Z-Base-32 Verfahren kodiert wird14.

Diese entspricht dem späteren Dateinamen.

gpg --with-wkd-hash --fingerprint florian@latzel.io 

Das wäre qcuniwbujk3zrj7166onyz4t5cxgy3wb für florian, wie wir in Zeile 4 sehen.

pub   rsa4096 2021-07-01 [SC] [verfällt: 2023-07-01]
      3F9F 6445 42DD 63E8 2165  D376 F4F6 2999 C3BA 4866
uid        [uneingeschränkt] Florian Latzel <florian@latzel.io>
           qcuniwbujk3zrj7166onyz4t5cxgy3wb@latzel.io
uid        [uneingeschränkt] Florian Latzel <florian.latzel@is-loesungen.de>
           t66qdyuka3hnekbqs31pd3jqtuyqp3z5@is-loesungen.de
uid        [uneingeschränkt] Florian Latzel <floh@netzaffe.de>
           4ucicrgmurtefmgehpbqdm3bf49kmk6b@netzaffe.de
uid        [uneingeschränkt] Florian Latzel <florian.latzel@gmail.com>
           t66qdyuka3hnekbqs31pd3jqtuyqp3z5@gmail.com
sub   rsa4096 2021-07-01 [E] [verfällt: 2023-07-01]

Wir übertragen den Key auf dem Server, indem die Ausgabe von gpg --export an den SSH-Befehl via Pipe weitergeben. So entsteht keine Datei, die wir gar nicht brauchen und nach der Übertragung löschen müssten.

gpg --no-armor --export florian@latzel.io | ssh ssh-server-oder-ip "cat > latzel.io/.well-known/openpgpkey/hu/qcuniwbujk3zrj7166onyz4t5cxgy3wb"

Testen der Schlüsselerkennung via WKD

Via Zugriff auf HTTPS

Via Browser https://latzel.io/.well-known/openpgpkey/hu/qcuniwbujk3zrj7166onyz4t5cxgy3wb aufrufen. Im Erfolgsfall sollte eine Datei zum Download angeboten werden.

Oder via Curl:

curl -I https://latzel.io/.well-known/openpgpkey/hu/qcuniwbujk3zrj7166onyz4t5cxgy3wb 

Hier können wir gut Statuscode und die ausgespielten Header sehen:

HTTP/2 200 
date: Sun, 11 Jul 2021 10:50:13 GMT
content-type: application/octet-stream
content-length: 4193
server: nginx
access-control-allow-origin: *
last-modified: Sun, 11 Jul 2021 10:50:07 GMT
etag: "1061-5c6d6c49ad544"
accept-ranges: bytes
x-xss-protection: 1; mode=block
x-frame-options: SAMEORIGIN
strict-transport-security: max-age=31536000
x-content-type-options: nosniff
referrer-policy: strict-origin-when-cross-origin

Via WKD Checker Webfrontend

Auf https://metacode.biz/openpgp/web-key-directory findest du ein Webfrontend zum Testen des Deployments deiner Keys in ein Web Key Directory.

Überprüfung des WKD Deployments via Webfrontend
Überprüfung des WKD Deployments via Webfrontend

Via gpg

gpg -v --auto-key-locate clear,wkd,nodefault --locate-key florian@latzel.io  
gpg: verwende Vertrauensmodell pgp
gpg: pub  rsa4096/F4F62999C3BA4866 2021-07-01  Florian Latzel <florian@latzel.io>
gpg: Schlüssel F4F62999C3BA4866: "Florian Latzel <florian@latzel.io>" nicht geändert
gpg: Anzahl insgesamt bearbeiteter Schlüssel: 1
gpg:              unverändert: 1
gpg: auto-key-locate found fingerprint 3F9F644542DD63E82165D376F4F62999C3BA4866
gpg: `florian@latzel.io' automatisch via WKD geholt
pub   rsa4096 2021-07-01 [SC] [verfällt: 2023-07-01]
      3F9F644542DD63E82165D376F4F62999C3BA4866
uid        [uneingeschränkt] Florian Latzel <florian@latzel.io>
uid        [uneingeschränkt] Florian Latzel <florian.latzel@is-loesungen.de>
uid        [uneingeschränkt] Florian Latzel <floh@netzaffe.de>
uid        [uneingeschränkt] Florian Latzel <florian.latzel@gmail.com>
sub   rsa4096 2021-07-01 [E] [verfällt: 2023-07-01]

Arbeiten mit GnuPG

Eine Sammlung von gebräuchlichen von GnuPG-Befehlen und -Optionen..

Geheime Schlüssel auflisten

Anzeigen aller Private-Keys, alternativ steht noch -K als Shortoption zur Verfügung.

gpg --list-secret-keys

Export eines geheimen Schlüssels

Für eine Sicherheitskopie oder das Arbeiten auf mehreren Maschinen exportieren wir den Geheimen Schlüssel (Private Key). Dieser sollte auf einem externen Datenträger gespeichert und an einem sicheren Ort aufbewahrt werden.

Um den den Schlüssel auf einen anderen Rechner zu transferieren sollte eine verschlüsselte Verbindung benutzt werden.

gpg --export-secret-key 269B69D1 > 269B69D1-private.key

Geheimen Schlüssel löschen

Um einen geheimen Schlüssel zu löschen wird das folgende Kommando verwendet, der zu löschende Schlüssel muss durch Key-ID oder EMail angegeben werden.

gpg --delete-secret-keys 269B69D1

Public-Keys auflisten

Public-Keys auflisten. Erzeugt eine Auflistung aller Public-Keys im Keyring. Short Option -k.

gpg --list-keys

Es erscheint unser frisch erzeugter Schlüssel

Fingerprint ausgeben

Fingerprint ausgeben. Analog zur Ausgabe wie mit –list-keys lässt zusätzlich noch der Fingerprint anzeigen.

gpg --fingerprint

Der Fingerprint besteht aus 10 4er Paaren(hexadezimal), die letzen 2 4er Paare sind gleichzeitig die Key-ID.

B043 7BFD 2D37 E901 4F88 2463 7681 46CD 269B 69D1

Public-Keys in Datei exportieren.

Den Public-Key in eine sog. ASCII-Armored Datei (via -a) exportieren. Die Ausgabe, hier die Datei florian-at-latzel-io.asc wird via -o festgelegt, Default ist Stdout.

gpg --export -a -o florian-at-latzel-io.asc florian@latzel.io

Public-Key aus Datei importieren

Mit dem folgendem Befehl wird Keyring importiert:

gpg --import <Datei>

Arbeiten mit Keyservern

Key- beziehungsweise Schlüsselserver stellen öffentliche Schlüssel bereit, die du oder andere zum Verschlüsseln oder zur Überprüfung von Signaturen brauchen.

Kleiner geschichtlicher Abriss: Ende Juni 2019 15 16 wurde das SKS Keyserver Netzwerk wiedermal angegriffen. GnuPG in der Version 2.2.17 ignorierte bereits standardmäßig alle Signaturen, die von einem Keyserver stammen. Im Juni 2021 wurde das SKS abgeschaltet17.

Mittlerweile gibt es Keyserver mit Überprüfung der Schlüssel via Double-Opt-In und Löschmöglichkeit18, allerdings zulasten des sogenannten Web of Trust19. Zwei Vertreter davon sind keys.mailvelope.com betrieben mit Mailvelope und der De-Facto-Standard keys.openpgp.org betrieben mit Hagrid.
Mit keyserver.ubuntu.com (betrieben mit Hockeypuck) steht dir ein Keyserver zur Verfügung, der zwar Signaturen erhält, allerdings keine Überprüfung oder Löschmöglichkeit der Schlüssel bietet

Public-Key auf keys.openpgp.org veröffentlichen

Von der Startseite, https://keys.openpgp.org/ kommen wir über den Link hochladen auf das Upload-Formular https://keys.openpgp.org/upload. Dort laden wir unseren öffentlichen Schlüssel (siehe Public-Keys in Datei exportieren.) hoch.

Alternativ können wir unseren öffentlichen Schlüssel nach curl pipen

    gpg --export florian@latzel.io | curl -T - https://keys.openpgp.org

In der Ausgabe des Befehls finden wir den Link zur Bestätigungsseite.

Key successfully uploaded. Proceed with verification here:
https://keys.openpgp.org/upload/$LONG_RANDOM_VERIFICATION_STRING

Die weiteren Schritte verlaufen analog zum Upload über den Browser.

Öffentlichen PGP Schlüssel auf keys.openpgp.org hochladen

Anschließend senden wir uns je Schlüssel eine Bestätigungs-Email via Klick auf den Button Bestätigungs-Email senden und folgen dem Link in der Email um diesen auf dem Keyserver zu veröffentlichen.

Verifizierung der Öffentlichens PGP Schlüssel auf keys.openpgp.org, Bestätigungs-Email senden

Nachdem die Überprüfung aller Schlüssel abgeschlossen ist, sieht das so aus:

Verifizierte Identitäten des öffentlichens PGP Schlüssels auf keys.openpgp.org

Public-Key von keys.openpgp.org entfernen

Mit Klick auf verwalten kommen wir nach https://keys.openpgp.org/manage. Hier haben wir die Möglichkeit nach Email-Adresse, Schlüssel-ID oder Fingerprint zu suchen. Nach erfolgreicher Suche wird eine Email mit dem Link zur Verwaltung unserer Schlüssel versand.

Schlüssels auf keys.openpgp.org verwalten, Sende Link

Hier können wir unser Schlüssel aus der Suche entfernen. Achtung, der nächste Schritt erfordert keine Bestätigung!

Aus der Suche entfernte Keys könnten wir durch erneutes Hochladen wieder in die Suche aufnehmen.

Schlüssels von keys.openpgp.org entfernen

Schlüssel auf Keyserver suchen

Suche nach EMail-Adresse (uid)

gpg --search-keys florian@latzel.io

oder Key-ID

gpg --search-keys F4F62999C3BA4866

Die Suche nach Namen oder Teilstrings klappt bei keys.openpgp.org nicht, aber auf dem mit Hagrid betriebenen keyserver, https://keyserver.ubuntu.com. Den Default Keyserver aus der ~/.gnupg/options können wir durch die Angabe eines anderen Keyservers via --keyserver Option überschreiben.

Suche nach Namen…

gpg --keyserver keyserver.ubuntu.com --search-keys 'Florian Latzel' 

…nach Teilstring des Namens, z.B. dem Nachnamen…

gpg --keyserver keyserver.ubuntu.com --search-keys 'Latzel' 

…oder der Suche nach eine Teilstring der E-Mailadresse, z.B. der Domain…

gpg --keyserver keyserver.ubuntu.com --search-keys 'netzaffe.de' 

Bei einer erfolgreichen Suchanfrage besteht die Möglichkeit, gefundenen Schlüssel interaktiv in den Schlüsselbund zu importieren. Im folgenden Besispiel geschieht das über die Eingabe der Nummer des Schlüssels, hier 1, für den einen gefundenen Schlüssel (1), erkennbar in Zeile 2.

gpg: data source: https://keys.openpgp.org:443
(1)     Florian Latzel <floh@netzaffe.de>
        Florian Latzel <florian.latzel@gmail.com>
        Florian Latzel <florian.latzel@is-loesungen.de>
        Florian Latzel <florian@latzel.io>
          4096 bit RSA key F4F62999C3BA4866, erzeugt: 2021-07-01
Keys 1-1 of 1 for "florian@latzel.io".  Eingabe von Nummern, Nächste (N) oder Abbrechen (Q) > 1

Public-Key von Keyserver importieren

Einen Public-Key, dessen Key-ID bekannt ist, können wir direkt vom Keyserver herunterzuladen

gpg --recv-keys F4F62999C3BA4866

Schlüssel widerrufen

Sofern Hockeypuck basierte Keyserver genutzt werden, ist der folgende Absatz relevant. Während bei Hagrid (siehe oben) und Mailvelope die Einträge aus der Suche entfernt werden können, verbleibt bei Hockeypuck der Schlüssel als widerrufen gekennzeichnet auf dem Server.

Primärschlüssel widerrufen

Wir importieren den Revoke-Key in unseren Keyring:

gpg --import 269B69D1-revoke-key.asc

Nun senden wir senden unseren Schlüssel, in dem sich jetzt unser Revoke-Key befindet zum Keyserver, um ihn dort zu widerufen.

gpg --send-keys F4F62999C3BA4866

Unterschlüssel (User-ID) widerrufen

Analog zum Widerruf des Primärschlüssel, können auch Unterschlüssel widerufen werden.

gpg --edit-key B0437BFD2D37E9014F882463768146CD269B69D1

Es folgt eine Auflistung alle Schlüssel.

gpg (GnuPG) 2.2.4; Copyright (C) 2017 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.

Geheimer Schlüssel ist vorhanden.

sec  dsa1024/768146CD269B69D1
     erzeugt: 2007-05-25  verfällt: 2021-07-01  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  elg2048/0D12C6401914C2F9
     erzeugt: 2007-05-25  verfällt: niemals       Nutzung: E   
[uneingeschränkt] (1). Florian Latzel <florian.latzel@is-loesungen.de>
[uneingeschränkt] (2)  Florian Latzel (M\xfc\x6cheim ist nett - K\xf6\x6cn- M\xfc\x6cheim Punkt Net - http://koeln-muelheim.net) <floh@koeln-muelheim.net>
[uneingeschränkt] (3)  Florian "floh" Latzel (gib dem Netzaffen Zucker!) <floh@netzaffe.de>
[uneingeschränkt] (4)  Florian Latzel (is-loesungen.de) <f.latzel@is-loesungen.de>
[uneingeschränkt] (5)  Florian Latzel <f.latzel@is-loesungen.de>
[ widerrufen] (6)  Florian Latzel <latzel@silpion.de>
[ widerrufen] (7)  Florian Latzel <florian@datengarten.com>
[ widerrufen] (8)  Florian Latzel <florian@funpromotion.eu>
[uneingeschränkt] (9)  Florian Latzel (Reinblau CMS Framworkers) <florian.latzel@reinblau.de>
[uneingeschränkt] (10)  Florian Latzel <developer@optona.de>
[uneingeschränkt] (11)  Florian Latzel <florian.latzel@gmail.com>

Wir wollen die Reinblau User-ID (unter 9) widerufen, dafür wählen wir die entsprechend Zahl.

9

Die User-ID ist, erkennbar durch den Stern, ausgewählt.

sec  dsa1024/768146CD269B69D1
     erzeugt: 2007-05-25  verfällt: 2021-07-01  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  elg2048/0D12C6401914C2F9
     erzeugt: 2007-05-25  verfällt: niemals       Nutzung: E   
[uneingeschränkt] (1). Florian Latzel <florian.latzel@is-loesungen.de>
[uneingeschränkt] (2)  Florian Latzel (M\xfc\x6cheim ist nett - K\xf6\x6cn- M\xfc\x6cheim Punkt Net - http://koeln-muelheim.net) <floh@koeln-muelheim.net>
[uneingeschränkt] (3)  Florian "floh" Latzel (gib dem Netzaffen Zucker!) <floh@netzaffe.de>
[uneingeschränkt] (4)  Florian Latzel (is-loesungen.de) <f.latzel@is-loesungen.de>
[uneingeschränkt] (5)  Florian Latzel <f.latzel@is-loesungen.de>
[ widerrufen] (6)  Florian Latzel <latzel@silpion.de>
[ widerrufen] (7)  Florian Latzel <florian@datengarten.com>
[ widerrufen] (8)  Florian Latzel <florian@funpromotion.eu>
[uneingeschränkt] (9)* Florian Latzel (Reinblau CMS Framworkers) <florian.latzel@reinblau.de>
[uneingeschränkt] (10)  Florian Latzel <developer@optona.de>
[uneingeschränkt] (11)  Florian Latzel <florian.latzel@gmail.com>

Mit revuid leiten wir die entsprechende Aktion ein.

revuid

Es folgt eine Sicherheitsabfrage.

Diese User-ID wirklich widerrufen? (j/N) j

Und ein Grund für den Wideruf.

Grund für den Widerruf:
  0 = Kein Grund angegeben
  4 = User-ID ist nicht mehr gültig
  Q = Abbruch
(Wahrscheinlich möchten Sie hier 4 auswählen)

Wir wählen 4.

Ihre Auswahl? 4

Wir haben noch die Möglichkeit einer optionalen Beschreibung, die wir jedoch leerlassen.

Geben Sie eine optionale Beschreibung ein. Beenden mit einer leeren Zeile:
> 
Grund für Widerruf: User-ID ist nicht mehr gültig
(Keine Beschreibung angegeben)

Es folgt eine letzte Abfrage zur Bestätigung.

Ist das OK? (j/N) j

Jetzt wird die User-ID 9 in den eckigen Klammern als widerufen gekennzeichnet.

sec  dsa1024/768146CD269B69D1
     erzeugt: 2007-05-25  verfällt: 2021-07-01  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  elg2048/0D12C6401914C2F9
     erzeugt: 2007-05-25  verfällt: niemals       Nutzung: E   
[uneingeschränkt] (1). Florian Latzel <florian.latzel@is-loesungen.de>
[uneingeschränkt] (2)  Florian Latzel (M\xfc\x6cheim ist nett - K\xf6\x6cn- M\xfc\x6cheim Punkt Net - http://koeln-muelheim.net) <floh@koeln-muelheim.net>
[uneingeschränkt] (3)  Florian "floh" Latzel (gib dem Netzaffen Zucker!) <floh@netzaffe.de>
[uneingeschränkt] (4)  Florian Latzel (is-loesungen.de) <f.latzel@is-loesungen.de>
[uneingeschränkt] (5)  Florian Latzel <f.latzel@is-loesungen.de>
[ widerrufen] (6)  Florian Latzel <latzel@silpion.de>
[ widerrufen] (7)  Florian Latzel <florian@datengarten.com>
[ widerrufen] (8)  Florian Latzel <florian@funpromotion.eu>
[ widerrufen] (9)  Florian Latzel (Reinblau CMS Framworkers) <florian.latzel@reinblau.de>
[uneingeschränkt] (10)  Florian Latzel <developer@optona.de>
[uneingeschränkt] (11)  Florian Latzel <florian.latzel@gmail.com>

Historie dieses Howtos

Siehe Commit History für weitere Details

Weiterführende Artikel

Credits

Danke Mike Kuketz für deinen Artikel GnuPG: Web Key Directory (WKD) einrichten, an dem ich mich bei meinem Setup orientieren konnte🙏.

Danke an meine ersten Proband*innen Nadine, Michael und Thomas🙏 aus der DAA Bonn für das erste Feedback zum Skript und die Checks auf Ubuntu, openSuSE 11 und Windows Vista.

Fußnoten