Gnu Privavy Guard oder GnuPG (gpg) ist eine freie Kryptographiesoftware, die das OpenPGP Message Format gemäß RFC 4880 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 Debian oder signierte Git Commits und Tags/Releases 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 Keyservern.
Es ist auf die oben genannten Systeme übertragbar.
Inhaltverzeichnis
Konzept und Terminologie
GnuPG verwendet das sogenannte Asymmetrische Verschlüsselungsverfahren, das heißt, dass es 2 Arten von Schlüssel gibt, Öffentliche- (Public Keys) und Private Schlüssel (private Keys). 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.
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:
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.
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.
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.
Wie bei der Erstellung des Schlüssels, wird bei dem Erzeugen eines Unterschlüssels nach einem Namen…
und einer Email-Adresse gefragt.
Email-Adresse: florian.latzel@is-loesungen.de
Kommentar: Wenn gewollt, kann auch der Unterschlüssel kommentiert werden.
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.
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>
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:
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:
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:
Wir überprüfen die Änderung:
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>
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:
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:
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.
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üsselskeyserver
, Angabe des Default Keyservers, der genutzt werden sollrequire-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 istmax-cache-ttl
, Maximale Zeit in Sekunden, die ein Cache-Eintrag gültig istignore-cache-for-signing
Bypass des Passwort Caches bei Signingno-grab
Zur Vorbeugung von sog. X-Sniffing-Angriffen bei Nutzung von Pinentry.pinentry-program
, Absolute Pfadangabe dazu
Web Key Directory (WKD)
WKD 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 Mailcients wie z.B. Thunderbird, Outlook (GpgOL) oder Failmail (via OpenKeychain) nutzen WKD automatisch und einige Email-Provider (die cooleren) 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 Domain, wie im hier genutzten Beispiel von uberspace 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 wird.
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.
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.
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
.
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.
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:
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 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 abgeschaltet.
Mittlerweile gibt es Keyserver mit Überprüfung der Schlüssel via Double-Opt-In und Löschmöglichkeit, allerdings zulasten des sogenannten Web of Trust. 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.
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.
Nachdem die Überprüfung aller Schlüssel abgeschlossen ist, sieht das so aus:
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.
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ü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.
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.
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
.
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.
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
- Seit 2021-07
Aktualisierungen und Ergänzungen basierend auf einem im Juli 2021
mit gpg 2.2.4 erstellten Schlüssel. - 2008-11-26
Veröffentlichung auf netzaffe.de.
Als Grundlage diente ein Skript, welches während meiner Linux Dozententätigkeit um 2007/2008 entstand. Dieses Skript basierte auf gpg in der Version 1.4.6 und pinentry 0.7.2 unter Debian Etch
und wurde unter anderem getestet auf/mit:- Ubuntu 8.04 mit gpg 1.4.6 und pinentry 0.7.4
- openSuSE 11 mit gpg2 2.0.9-22.1 und pinentry 0.7.5-5.1
- Windows Vista mit gnupg-w32cli-1.4.9.exe
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