GnuPG ist ein Werkzeug zur Verschlüsselung mit symmetrischen Verfahren,
sowie zur Signierung, Verschlüsselung, Authentifizierung und der
Verwaltung von asymmetrischen Schlüsseln. Die Verwaltung der privaten
und öffentlichen Schlüssel nutzt eine eigene Datenbank, einen sogenannten
keyring (Schlüsselbund). Dieser Schlüsselbund ist normalerweise unter
dem Homeverzeichnis im Unterverzeichnis .gnupg
zu finden.
Du kannst die vorhandenen Zertifikate, oder öffentliche Schlüssel im
Schlüsselbund mit dem Schalter list-keys
ausgeben lassen. Optional
kannst du einen Suchstring angeben um die Auswahl etwas einzuschränken.
gpg --list-keys [Suchstring]
Schlüsselerzeugung
Ein neues Schlüsselpaar wird (in einem Schritt) mit dem Schalter
quick-gen-key
erzeugt. Unterschlüssel werden mit dem Schalter
quick-add-key
an ein bestehendes, eigenes Schlüsselpaar angehängt.
gpg --quick-gen-key <userid> [algo [usage [expire]]]
gpg --quick-add-key <keyid> [algo [usage [expire]]]
Es ist üblich, dass die userid
eine Emailadresse enthält. Üblich
ist es einen Namen anzugeben, die Emailadresse in spitze Klammern zu
setzen und gegebenenfalls noch einen Kommentar in runden Klammern
dazwischen. Ein Beispiel ist "Lars Fischer (smartcard) <lars.fischer@hs-spamschutz-bremerhaven.de>"
, wobei der Kommentar
andeuten kann, dass es sich um ein Schlüsselpaar handelt und der private
Schlüssel auf einer Kryptokarte gespeichert ist.
Übliche Parameter für den Kryptoalgorithmus sind rsa4096
, oder
ed25519
. “ED” ist ein “elliptic curve digital signature algorithm”
und lässt sich nur für Signaturen und nicht für Verschlüsselung nutzen. Die usage
ist eine Liste von kommaseparierten
Schlüsselworten: sign
, encr
, cert
, oder auth
. Mit
expire
wird das letzte Gültigkeitsdatum des Schlüssels in
relativen oder absoluten werten angegeben. 1y
für ein Jahr ist
ebenso legal wie 2019-10-23
.
Es ist angeraten Schlüssel nicht gleichzeitig für Signatur und Verschlüsselung freizugeben. Üblich ist es den Hauptschlüssel für die Signatur und die Zertifizierung zu nutzen und einen Unterschlüssel für die Verschlüsselung anzulegen.
gpg --quick-gen-key "Name (Comment) <email@hs-bremerhaven.de>" ed25519 sign 1y
gpg --quick-add-key <keyid/fingerprint> rsa4096 encr 1y
Schau dir nun das Zertifikat an, welches du gerade erzeugt hast.
Schlüsselexportieren
Meist ist es erstrebenswert, dass der eigenen öffentliche Schlüssel sehr weit verbreitet wird. Dabei kann man selbst ein wenig helfen, indem der eigene Schlüssel an alle Kommunikationspartner verschickt wird. Dazu kann es nötig sein dieses zunächst in eine Datei zu exportieren.
gpg --export --armor <keyid>
Der Schalter export
gibt lediglich die öffentlichen Schlüssel aus
dem Schlüsselring aus. Mit dem Schalter --export-secret-keys
lassen sich auch private
Schlüssel exportieren.
Zertifizierung/Signatur von Schlüsseln
Mit der Signatur eines Schlüssels A bestätigt eine Person B, dass Sie überprüft hat, dass die Halterin/den Halter des Schlüssels A unter der angegebenen Identität bekannt ist und im Besitz des angegebenen privaten Schlüssels. Handelt es sich bei der Identität um eine Email-Adresse, dann sollte dementsprechend geprüft worden sein, dass Person A diese Emailadresse kontrolliert, i.e. “Besitzerin ist”.
Ein Schlüssel mit Identität wird über das Kommando --sign-key <keyid>
ausgeführt. Der Schalter --default-key
spezifiziert mit welchem
Schlüssel unterschrieben werden soll. Beide Schlüssel müssen im eigenen
Schlüsselring vorhanden sein.
gpg --default-key <my_key_id> --sign-key <keyid>
Wird der Schlüssel von Person A nun wieder exportiert, dann hängt die Signatur von Person B am Schlüssel.
Es gibt zusätzlich die Möglichkeit einen Schlüssel nur lokal zu
signieren. Mit --lsign-key
wird eine Signatur als “nicht
exportierbar” markiert.
Die Signaturen eines, oder aller Schlüssel im Schlüsselring, kann man
sich mit dem Kommando --list-signatures
ansehen.
gpg --list-signatures <searchstring>
Schlüsselnutzung
Mit den erzeugten Schlüsseln lassen sich
- andere Schlüssel zertifizieren
- Daten mit dem eigenen privaten Schlüssel signieren
- Daten für bestimmte Empfänger verschlüsseln
Signierte Datei erzeugen
Mit dem eigenen Schlüsselpaar, genauer dem privaten Schlüssel, lassen
sich jetzt signierte Dateien erzeugen. Das entspricht dann einer
digitalen Unterschrift. Wenn ein Dateiname <file>
angegeben wird, dann
wird eine Datei <file>.asc
, oder ohne Parameter armor
eine
Datei <file>.gpg
, erzeugt. Wenn kein Dateiname angegeben wird,
dann ließt das folgende Kommando Daten
von stdin
und gibt die Daten als signierte PGP-Message auf stdout
aus. Der
Parameter armor
ist optional, und sorgt dafür, dass die Ausgabe nur
aus darstellbaren Zeichen besteht.
gpg --local-user <keyid/searchstring> --sign [--armor] [<file>]
Die entstandene Datei, oder der Datenstrom lassen sich dann in gpg
einlesen und erzeugen die ursprüngliche Datei. (Wiederum funktioniert
das ohne Angabe eines Dateinamens über stdin
und stdout
.
gpg [<file>.asc]
Wesentlich für die Überprüfung der Signatur ist, dass sich der öffentliche Schlüssel der signierenden Stelle im eigenen Schlüsselring befindet. Die Ausgabe einer guten Signatur könnte zum Beispiel so aussehen:
gpg: original file name='test.file'
gpg: Signature made 2024-12-17T12:33:51 CET
gpg: using RSA key E8C1A8CF73CEFFAD05B53914717B7901E41BA734
gpg: using pgp trust model
gpg: Good signature from "Prof.Dr. Lars Fischer <lars.fischer@hs-bremerhaven.de>" [ultimate]
gpg: binary signature, digest algorithm SHA512, key algorithm rsa3072
Wichtig ist die Identifizierung des Schlüssels über welche die Identität des Signierenden aus der eigenen Schlüsseldatenbank ausgegeben wird.
Getrennte Signatur
Manchmal möchte man keine signierte Nachricht erzeugen, sondern Inhalt
und Signatur getrennt anlegen. Zum Beispiel, wenn eine Datei von
mehreren Personen signiert werden soll. Der Schalter dafür ist
detach-sign
und er lässt sich genauso nutzen wie der Schalter
sign
oben. Der wesentliche Unterschied ist, dass das Ergebnis eine
PGP-Signature ist und keine -Message.
Für die Überprüfung der Signatur muss jetzt nicht nur die PGP-Message
angegeben werden, sondern die Signatur und die Nachricht separat. Dabei
bezeichnet <file>
die Nachricht die signiert wurde und
<file>.asc
die Datei mit der Signatur.
gpg --verify [-v] <file>.asc [<file>]
Hier lässt sich ebenfalls die Nachrichtendatei über stdin
in das
Programm leiten anstatt den Dateinamen anzugeben.
Daten verschlüsseln
Der Schalter zum Verschlüsseln von Daten ist recht offensichtlich mit
encrypt
benannt. Mittels des Schalters recipient
lässt sich der
Schlüssel zur Verschlüsselung wählen. Der Aufruf verschlüsselt alle
Daten die auf stdin
eingelesen werden können und gibt das Chiffrat
auf stdout
aus.
Für symmetrische Verschlüsselung mit einer Passphrase:
gpg --encrypt --armor < <klartext.txt> > <ciphertext.asc>
Für die Nutzung eines Schlüssels aus dem Schlüsselring für die Verschlüsselung:
gpg --encrypt --armor --recipient <name> < <klartext.txt> > <ciphertext.asc>
Der Empfängerschlüssel wird im Chiffrat benannt. Soll der Empfänger
nicht bekannt werden, dann gibt es die Möglichkeit der versteckten
Verschlüsselung (`hidden-recipient
). Dann weiß aber hoffentlich der
oder die Empfängerin, welcher Schlüssel benutzt wurde.