PGP (Pretty Good Privacy)

Lesedauer: 14 Minuten

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

libgcrypt ist eine weit verbreitete Bibliothek, die eine Vielzahl von kryptographischen Algorithmen und Funktionen bereitstellt. Sie ist Teil des GNU-Projekts und wird häufig als kryptographisches Backend für verschiedene Anwendungen verwendet. GnuPG verwendet libgcrypt zur Implementierung von Verschlüsselungsalgorithmen, Zufallszahlengeneratoren und anderen kryptographischen Funktionen.

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

Ein Ablaufdatum erhöht die Sicherheit, indem es die Auswirkungen eines kompromittierten Schlüssels begrenzt, die regelmäßige Erneuerung und Anpassung an neue Sicherheitsstandards sicherstellt und das Risiko vergessener oder veralteter Schlüssel verringert. Es trägt zur Verbesserung der Kontrolle und Transparenz der Schlüsselverwaltung bei.

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]

Unter Linux legt GnuPG die Schlüssel und alle dazugehörigen Metadaten unter ~/.gnupg/ ab.

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

Das Suffix .asc steht für ASCII armored. Es wird verwendet, um Dateien zu kennzeichnen, die in einem textbasierten, ASCII-kodierten Format vorliegen. Bei GPG und PGP bezeichnet eine .asc-Datei in der Regel einen öffentlich zugänglichen Schlüssel, eine signierte Nachricht oder eine verschlüsselte Datei, die in ein lesbares Textformat konvertiert wurde.

-----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.

Versenden Sie den öffentlichen Schlüssel nicht zusammen mit der Signatur und der zu schützenden Datei. Stellen Sie Ihren öffentlichen Schlüssel auf eine geeignete Weise zur Verfügung, die keine direkte Verbindung zur Signatur herstellt.

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

Die Keyserver synchronisieren in der Regel ihre Datenbanken untereinander, allerdings gibt es hierfür keinen einheitlichen Standard. Weder das Synchronisierungsintervall noch die Synchronisierungspartner sind verbindlich festgelegt. Daher kann es unter Umständen sehr lange dauern, bis ein Schlüssel auf einer signifikanten Anzahl von Keyservern angekommen ist. Sie können den Prozess jedoch beschleunigen, indem Sie Ihren Schlüssel auf mehrere Server hochladen. Da die Syntax des Parameters --send-keys jedoch nur einen Server akzeptiert, müssen Sie das Kommando für jeden Keyserver erneut ausführen.

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

Die Integrität und Authentizität von Schlüsseln auf Keyservern ist ein bekanntes Problem in der PGP-Infrastruktur, da Keyserver an sich keine eingebauten Mechanismen haben, um die Identität des Schlüsselinhabers zu verifizieren. Das bedeutet, dass prinzipiell jeder ein Schlüsselpaar für eine beliebige E-Mail-Adresse erzeugen und auf einen Keyserver hochladen könnte.

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.

Der Schlüsselinhaber könnte den Fingerabdruck z.B. auf seiner Homepage veröffentlichen oder dem Empfänger über einen anderen Kanal, z.B. einen Messenger, mitteilen. Der Empfänger ist dann in der Lage, den Fingerabdruck mit dem Fingerabdruck auf dem Keyserver zu vergleichen.

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 Sie das Widerrufszertifikat zusammen mit dem Schlüsselpaar und bewahren Sie es an einem sicheren Ort auf. Wenn Sie z. B. einen Laptop mit einem privaten Schlüssel verlieren, können Sie ohne diesen privaten Schlüssel kein Widerrufszertifikat erstellen.

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.

Loading

Updated on 1. September 2024
Was this article helpful?

Related Articles