Signieren und Verschlüsseln mit GnuPG

Updated on 2024-11-07

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. Die folgende Zeile liest Daten von stdin und gibt die Daten dann signiert auf stdout aus.

gpg --local-user <keyid/searchstring> --sign [--armor]

Die entstandene Datei, oder der Datenstrom lassen sich mit

gpg --verify

überprüfen. Wesentlich ist dafür, dass sich der öffentliche Schlüssel der signierenden Stelle im eigenen Schlüsselring befindet.

Daten signieren

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.

gpg --encrypt --armor < <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 (hidden) Signatur.