PGP
(Pretty Good Privacy
) ist ein kryptographisches Verfahren zur Sicherung digitaler Kommunikation und Daten. Es ermöglicht Benutzern, Nachrichten, Dateien und E-Mails so zu verschlüsseln, dass sie nur von den beabsichtigten Empfängern gelesen werden können. PGP
verwendet eine Kombination aus symmetrischer und asymmetrischer Kryptographie, um sowohl die Vertraulichkeit als auch die Integrität der Daten zu gewährleisten. Durch das Signieren von Nachrichten bietet PGP
auch eine Möglichkeit, sowohl die Authentizität des Absenders, als auch die Integrität eines Inhalts zu bestätigen.
Manuelle Schlüsselgenerierung mit GPG
GPG
(GNU Privacy Guard
) ist eine freie Implementierung des OpenPGP
-Standards und bietet eine leistungsfähige Lösung für die Verschlüsselung und Signierung von Daten und Kommunikation, einschließlich E-Mails. Unter Ubuntu ist GPG
häufig vorinstalliert und kann für verschiedene sicherheitsrelevante Aufgaben eingesetzt werden:
$ gpg --version
gpg (GnuPG) 2.4.4
libgcrypt 1.10.3
Das folgende Kommando führt Sie durch den Prozess der Schlüsselgenerierung. Es werden der zu verwendende Algorithmus (in der Regel RSA, max. 4096 Bit), die Gültigkeitsdauer des Schlüsselpaares (empfohlen max. 5 Jahre) sowie der Name und die E-Mail-Adresse für die User-ID abgefragt:
$ gpg --full-generate-key
Der Parameter --list-keys
zeigt die im System vorhandenen Schlüsselpaare an:
$ gpg --list-keys
gpg: checking the trustdb
gpg: marginals needed: 3 completes needed: 1 trust model: pgp
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
gpg: next trustdb check due at 2026-08-31
/home/dude/.gnupg/pubring.kbx
-------------------------------
pub rsa4096 2024-08-31 [SC] [expires: 2024-09-30]
2572D9DF58B23D4F993A521C2B5BBA6DB9BB9D1C
uid [ultimate] Jeffery Lebowski (For testing purposes only) <jl@dude.com>
sub rsa4096 2024-08-31 [E] [expires: 2024-09-30]
Signieren von Dateien
Wenn Sie nun z.B. eine Datei signedfile.txt
digital signieren möchten, können Sie folgendes Kommando verwenden. Dies erzeugt eine Datei signedfile.asc
, die sowohl den Inhalt der Datei im Klartext (--clearsign
) als auch die digitale Signatur enthält. Wenn Sie mehrere Schlüsselpaare auf Ihrem System haben, verwenden Sie den Parameter --local-user
, um die User-ID
des Schlüssels auszuwählen, den Sie verwenden möchten:
$ gpg --clearsign --local-user jl@dude.com --output signedfile.asc signedfile.txt
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Das ist ein signierter Text -----BEGIN PGP SIGNATURE----- iQJABAEBCgAqFiEEJXLZ31iyPU+ZOlIcK1u6bbm7nRwFAmbUPbUMHGpsQGR1ZGUu Y29tAAoJECtbum25u50cASAQAN/4zz+LxCssBN1gm65mgJiNSIFE3N+stQzOkfSX UN16ZVJ8OS9BCNl8oUWQ631YEvBa2UDAD5x9B8wJkthgmqqxI64P6fzYQ35UhMpa Du0QrjgsjETk0+IlpcGJL0VIOPK8bPiVJrYdbE0qXu2G+8R4isDAAV24WnugEE3G HDlPQ7pm/rNocWOQx8av14kpA/q2LU1iBY6/1HliMtYEArmB2NwdR0AS8CcsxIhr wGMbAfVmmVvgNooI2h41Sfbo/LGK1c1amxSRWa3zqKD7O2cqwPfzri/c+Axgh+O6 rw6aUEDLi4XeUG2AClC/4BSEw5hTidui0I882p26HNFJ8hm63P9N62AoiTtRHCMD vQHT9pEhRhV01bm2l+XGPwNIXo94qUbQHmrOi59ibYiNKFfphrfw809XP7V79UfD 4Vw2mEJZYOHkUcUMHf7KbClIcbMPjLIgdzYlwQ75I3B3TQpmDeJtomf7wRET28Cc e+XOy7cnDFbi+O/IFGXmaD4YKqDajxvbZp3V3aIXBkp51exBcvFT4Pt/i41MASjd lBb6BF82Qr4hKUC7UeX2kA++56i/Nky9qmj4IQ+eqZcvHr6ZXTdMNc/hp5dZ3JqN DLRvn8GaXcBzSsSsrlM7C5oWQQwyRzksntT76oyFTyRtFD3+G4gBPjyG6Kz1/6Px jA/V =Vioo -----END PGP SIGNATURE-----
Binärdateien signieren
Dies ist natürlich ein relativ einfaches Beispiel, da sowohl das Quellformat als auch das Zielformat eine Textdatei ist. In der Praxis kommt es jedoch häufiger vor, dass Binärdateien
wie z.B. Excel, Word oder PDF digital signiert werden sollen. Hier ist der Ansatz mit --clearsign
nicht mehr geeignet, da er die Dateien unbrauchbar machen würde. Eine Alternative, um die Datei selbst unverändert zu lassen und nur die Signatur zu erzeugen, ist die Erzeugung einer abgetrennten Signatur (detached signature) mit --detach-sig
.
Das folgende Kommando erzeugt eine Signatur signedfile.sig
für die PDF-Datei signedfile.pdf
:
$ gpg --output signedfile.sig --detach-sig --local-user jl@dude.com signedfile.pdf
Sie können nun die Signatur signedfile.sig
zusammen mit der PDF-Datei signedfile.pdf
an den Empfänger versenden. Der Vorteil dieser Methode ist, dass es dem Empfänger überlassen bleibt, ob er die Integrität der Datei überprüft oder nicht. Sie geben ihm mit der Signaturdatei lediglich die Möglichkeit, dies im Zweifelsfall zu tun. Der öffentliche Schlüssel des Absenders ist auch noch nicht zwingend erforderlich und kann ggf. nachgereicht werden, wenn der Schlüsselaustausch noch nicht stattgefunden hat.
Fazit
Für die Erstellung von Signaturen mit GPG
stehen verschiedene Methoden zur Verfügung, die je nach Dateityp und gewünschtem Ergebnis variieren. Für Klartextdateien ist die clearsign
-Option ideal, da sie die Datei im lesbaren Klartext belässt und nur eine Signatur hinzufügt, die die Integrität der Datei garantiert. Für Binärdateien wie PDFs oder Word-Dokumente ist die detach-sig
-Methode zu bevorzugen, bei der eine separate Signaturdatei erstellt wird, die die Originaldatei unverändert lässt. Alternativ kann die sign
-Option verwendet werden, um eine signierte Binärdatei zu erzeugen, bei der die Originaldatei in eine binäre Signaturdatei eingebettet wird, die jedoch nicht mehr im Klartext lesbar ist. Jede Methode hat ihren spezifischen Anwendungsbereich und bietet Flexibilität, je nachdem, ob die Lesbarkeit der Datei oder die Integritätssicherung im Vordergrund steht.
Export und Austausch von Schlüsseln
Damit der Empfänger eine Signatur überprüfen kann, benötigt er den öffentlichen Schlüssel
des Absenders. Der Absender kann den öffentlichen Schlüssel
exportieren und dem Empfänger auf anderem Wege zukommen lassen:
$ gpg --armor --export jl@dude.com > publickey.asc
Die Datei publickey.asc
enthält nun den öffentlichen Schlüssel. Nach dem Export können Sie ihn an andere Personen weitergeben, indem Sie die Datei per E-Mail versenden oder z.B. auf Ihrer Homepage veröffentlichen. Die Empfänger können dann den Schlüssel importieren und damit E-Mails an Sie verschlüsseln oder Ihre Signaturen verifizieren.
Austausch über Keyserver
Der Schlüsselaustausch über einen Keyserver
ist eine gängige Methode, um öffentliche PGP/GPG-Schlüssel zugänglich zu machen, so dass andere Benutzer diese Schlüssel finden und verwenden können. Es gibt viele öffentliche Keyserver
, wie zum Beispiel keyserver.ubuntu.com
, pgp.mit.edu
und keys.openpgp.org
. Um einen öffentlichen Schlüssel auf einen Keyserver
hochzuladen, verwendet GPG das folgende Kommando:
$ gpg --send-keys --keyserver keyserver.ubuntu.com 0x2572D9DF58B23D4F993A521C2B5BBA6DB9BB9D1C
gpg: sending key 2B5BBA6DB9BB9D1C to hkp://keyserver.ubuntu.com
Suchen eines Schlüssels auf einem Keyserver
Wenn der Absender einen Keyserver
angegeben hat, von dem Sie seinen öffentlichen Schlüssel herunterladen können, durchsucht GPG die Datenbank des Keyservers mit dem Parameter --search-keys
. Als Suchmuster können Sie nicht nur die E-Mail-Adresse
des Absenders verwenden, sondern z.B. auch den Fingerprint
oder die Schlüssel-ID
:
$ gpg --keyserver keyserver.ubuntu.com --search-keys jl@dude.com
gpg: data source: http://[2620:2d:4000:1007::d43]:11371
(1) Jeffery Lebowski (For testing purposes only) <jl@dude.com>
4096 bit RSA key 2B5BBA6DB9BB9D1C, created: 2024-08-31
$ gpg --keyserver keyserver.ubuntu.com --search-keys 2B5BBA6DB9BB9D1C
gpg: data source: http://[2620:2d:4000:1007::d43]:11371
(1) Jeffery Lebowski (For testing purposes only) <jl@dude.com>
4096 bit RSA key 2B5BBA6DB9BB9D1C, created: 2024-08-31
$ gpg --keyserver keyserver.ubuntu.com --search-keys 2572D9DF58B23D4F993A521C2B5BBA6DB9BB9D1C
gpg: data source: http://[2620:2d:4000:1007::d43]:11371
(1) Jeffery Lebowski (For testing purposes only) <jl@dude.com>
4096 bit RSA key 2B5BBA6DB9BB9D1C, created: 2024-08-31
Sie können auch die Webseite des Keyservers
durchsuchen:
Schlüssel installieren
Wenn Sie den richtigen Schlüssel gefunden haben, können Sie ihn mit dem Parameter --recv-keys
installieren. Dabei stehen Ihnen wieder die oben genannten Identifikationsmerkmale zur Verfügung:
$ gpg --keyserver keyserver.ubuntu.com --recv-keys 2B5BBA6DB9BB9D1C
Die erfolgreiche Installation kann mit dem --list-keys
Parameter überprüft werden:
$ gpg --list-keys
/home/walter/.gnupg/pubring.kbx
-------------------------------
pub rsa4096 2024-08-31 [SC] [expires: 2024-09-30]
2572D9DF58B23D4F993A521C2B5BBA6DB9BB9D1C
uid [ unknown] Jeffery Lebowski (For testing purposes only) <jl@dude.com>
sub rsa4096 2024-08-31 [E] [expires: 2024-09-30]
Verwenden Sie den Parameter --import
, um einen exportierten öffentlichen Schlüssel aus einer .asc
-Datei in Ihren GPG-Schlüsselbund
zu importieren:
$ gpg --import publickey.asc
Schlüssel verifizieren
Das bringt einige Herausforderungen mit sich:
Fingerprint-Prüfung
Der wichtigste Schritt zur Sicherstellung der Integrität eines Schlüssels ist die Prüfung des Fingerabdruck
des Schlüssels, bevor er verwendet wird. Der Fingerabdruck ist eine eindeutige, kurze Zeichenfolge, die als Hash des Schlüssels dient. Der Schlüsselinhaber kann diesen Fingerprint über einen sicheren Kanal kommunizieren, so dass andere sicherstellen können, dass sie den richtigen Schlüssel verwenden.
Web of Trust
Das Signieren von Schlüsseln durch vertrauenswürdige Personen (die selbst vertrauenswürdig sind) kann die Vertrauenswürdigkeit eines Schlüssels erhöhen. Wenn viele vertrauenswürdige Personen einen Schlüssel signieren, ist es wahrscheinlicher, dass der Schlüssel authentisch ist.
Das folgende Kommando mit dem Parameter --sign-key
öffnet eine interaktive Sitzung, in der Sie bestätigen müssen, dass Sie den angegebenen Schlüssel signieren möchten. Sie können auch angeben, inwieweit Sie dem Schlüssel vertrauen (z.B. voll vertrauen, teilweise vertrauen, kein Vertrauen). Nach dem Signieren wird Ihre Signatur an den Schlüssel angehängt.
$ gpg --sign-key jl@dude.com
Um herauszufinden, von wem ein öffentlicher Schlüssel bereits signiert wurde, kann der Parameter --check-sigs
in GPG verwendet werden:
$ gpg --check-sigs jl@dude.com
pub rsa4096 2024-08-31 [SC] [expires: 2024-09-30]
2572D9DF58B23D4F993A521C2B5BBA6DB9BB9D1C
uid [ full ] Jeffery Lebowski (For testing purposes only) <jl@dude.com>
sig!3 2B5BBA6DB9BB9D1C 2024-08-31 [self-signature]
sig! EEDF86868F374F29 2024-09-01 Walter Sobchak (For testing purposes only) <ws@dude.com>
sub rsa4096 2024-08-31 [E] [expires: 2024-09-30]
sig! 2B5BBA6DB9BB9D1C 2024-08-31 [self-signature]
Die Zeilen mit sig
zeigen an, dass ein Schlüssel bereits signiert wurde. sig!
zeigt außerdem an, dass die Signatur vollständig validiert wurde und gültig ist. sig!3
zeigt an, dass eine besondere Vertrauensstufe im Schlüssel festgelegt wurde. Dabei bedeutet 3
, dass die Signatur eine höhere (vollständige) Vertrauenswürdigkeit aufweist, die von Ihnen oder einer anderen vertrauenswürdigen Person festgelegt wurde.
Verwendung modernerer Keyserver
Einige moderne Keyserver, wie z.B. keys.openpgp.org
, versuchen dieses Problem zu entschärfen, indem sie nur öffentliche Schlüssel hosten, bei denen die E-Mail-Adresse verifiziert wurde. Dies geschieht durch das Versenden einer Bestätigungs-E-Mail an die mit dem Schlüssel verknüpfte Adresse.
Signatur verifizieren
Nachdem Sie den öffentlichen Schlüssel eines Absenders in Ihren Schlüsselbund importiert und die von ihm signierten Dateien erhalten haben, können Sie diese überprüfen. Dazu werden die Beispiele vom Anfang dieses Artikels verwendet.
--clearsign
signierte Dateien
Die signierte Klartextdatei signedfile.asc
aus dem obigen Beispiel können Sie mit folgendem Kommando verifizieren:
$ gpg --verify signedfile.asc
gpg: Signature made Sun 01 Sep 2024 10:11:01 AM UTC
gpg: using RSA key 2572D9DF58B23D4F993A521C2B5BBA6DB9BB9D1C
gpg: issuer "jl@dude.com"
gpg: Good signature from "Jeffery Lebowski (For testing purposes only) <jl@dude.com>" [full]
--detach-sig
signierte Dateien
Die PDF-Datei signedfile.pdf
mit der abgetrennten Signatur signedfile.sig
wird im Prinzip genauso verifiziert, nur dass hier sowohl die Signatur als auch das PDF im Kommando angegeben werden:
$ gpg --verify signedfile.sig signedfile.pdf
gpg: Signature made Sun 01 Sep 2024 11:33:46 AM UTC
gpg: using RSA key 2572D9DF58B23D4F993A521C2B5BBA6DB9BB9D1C
gpg: issuer "jl@dude.com"
gpg: Good signature from "Jeffery Lebowski (For testing purposes only) <jl@dude.com>" [full]
Bei der Prüfung einer Signatur mit GPG gibt es mehrere mögliche Prüfergebnisse, die anzeigen, ob die Signatur gültig und vertrauenswürdig ist. Die wichtigsten Ergebnisse sind:
Good Signature
: Dies bedeutet, dass die Signatur gültig ist und die Datei oder Nachricht seit ihrer Signatur nicht verändert wurde. Die Signatur wurde mit einem öffentlichen Schlüssel erfolgreich verifiziert, der zu dem angegebenen Absender gehört.Bad Signature
: Diese Meldung bedeutet, dass die Signatur ungültig ist, entweder weil die Datei oder Nachricht nach der Signierung verändert wurde oder weil sie nicht mit dem zugehörigen öffentlichen Schlüssel verifiziert werden konnte.Untrusted Signature
: Das bedeutet, dass der Schlüssel, mit dem die Signatur erstellt wurde, zwar in Ihrem Schlüsselbund vorhanden ist und die Signatur gültig ist, Sie dem Schlüssel aber nicht genügend Vertrauen entgegengebracht haben. Das bedeutet, dass Sie den Schlüssel selbst noch nicht verifiziert haben oder ihm nur eine geringe Vertrauenswürdigkeit zuerkannt haben.No Public Key
: Diese Meldung erscheint, wenn Sie den zur Verifizierung der Signatur benötigten öffentlichen Schlüssel nicht in Ihrem Schlüsselbund haben.Expired Key
: Der öffentliche Schlüssel, der zur Erstellung der Signatur verwendet wurde, ist abgelaufen. Dies bedeutet, dass der Schlüssel ein festgelegtes Ablaufdatum überschritten hat, was die Signatur ungültig machen könnte.Revoked Key
: Diese Meldung zeigt an, dass der öffentliche Schlüssel, der zur Erstellung der Signatur verwendet wurde, widerrufen wurde. Ein Widerruf bedeutet, dass der Schlüssel als kompromittiert oder ungültig erklärt wurde.
Widerrufen von Schlüsseln
Aufgrund der dezentralen Natur der GPG-Infrastruktur ist es nicht mehr möglich, einen veröffentlichten öffentlichen Schlüssel zu löschen, aber es besteht die Möglichkeit, ein Widerrufszertifikat
zu erstellen und auf die Keyserver hochzuladen. Dabei handelt es sich im Wesentlichen um eine Signatur, die vom Inhaber des privaten Schlüssels erstellt wird, um zu signalisieren, dass der zugehörige öffentliche Schlüssel nicht mehr verwendet werden soll.
Im Falle eines Verlustes oder einer Kompromittierung des privaten Schlüssels ermöglicht es das Widerrufszertifikat
, den Schlüssel ungültig zu machen und andere darüber zu informieren.
Erstellen eines Widerrufszertifikats
Der folgende Befehl führt Sie durch den Prozess der Erstellung eines Widerrufszertifikats
. Der Grund für den Widerruf wird abgefragt und optionale Informationen können hinzugefügt werden. Um den richtigen Schlüssel zu identifizieren, geben Sie die eindeutige Benutzer-ID
als Parameter an:
$ gpg --output revoke.asc --gen-revoke 0xBE71750C3CE661F7336E1B5071CA1904979A0E0A
Verwendung des Widerrufszertifikats (Schlüssel widerrufen)
Wenn Sie den Schlüssel tatsächlich widerrufen möchten, müssen Sie das Widerrufszertifikat importieren und auf den Keyserver hochladen, auf dem Ihre Schlüssel gespeichert sind:
$ gpg --import revoke.asc
$ gpg --keyserver keyserver.ubuntu.com --send-keys 0xBE71750C3CE661F7336E1B5071CA1904979A0E0A
Fazit
In diesem Artikel haben Sie die wichtigsten Schritte zur sicheren Verwendung von PGP/GPG-Schlüsseln kennen gelernt. Von der Erstellung eines Schlüsselpaares über das Signieren und Verifizieren von Dateien bis hin zum Austausch Ihres öffentlichen Schlüssels - all diese Schritte tragen dazu bei, Ihre digitale Kommunikation zu schützen und das Vertrauen in die Integrität Ihrer Nachrichten zu gewährleisten. Darüber hinaus haben Sie die Bedeutung der Erstellung eines Widerrufszertifikats kennen gelernt, damit Sie im Falle des Verlusts oder der Kompromittierung Ihres privaten Schlüssels schnell reagieren können. Wenn Sie diese Maßnahmen ergreifen und regelmäßig anwenden, stellen Sie sicher, dass Ihre Daten und Ihre Identität im digitalen Raum bestmöglich geschützt sind.