GnuPG
Baustelle: Dieser Artikel ist eine Baustelle. Das heißt, jemand hat sich dieses Artikels angenommen und überarbeitet ihn gerade. |
Einleitung
GnuPG (GNU Privacy Guard) ist eine Software mit dem Ziel durch Verschlüsselung und Signierung die Privatsphäre und Sicherheit digitaler Daten zu gewährleisten. In den meisten Fällen findet es Verwendung in Kombination mit dem Versenden und Empfangen von E-mails, ist aber grundsätzlich unabhängig vom jeweiligen Datenformat (E-Mail, Textdateien, Bilddaten, komplette Festplatten usw.).
GnuPG ist eine freie Alternative zum proprietären Programm PGP (Pretty Good Privacy) und implementiert den OpenPGP-Standard. Beide Programme sind ab PGP Version 5 (und höher) miteinander kompatibel [1].
Konzept
Die klassische Methode der Verschlüsselung ist das symmetrische Verfahren. Hierbei besitzen Sender und Empfänger den gleichen Schlüssel, d.h. Ver- und Entschlüsselung beim Sender und Empfänger finden mit dem gleichen Schlüssel statt. Das Problem bei diesem Verfahren ist allerdings, dass dem Empfänger im Vorfeld über einen sicheren Kommunikationskanal der Schlüssel zugestellt werden muss. Hierbei besteht die Gefahr das Unbefugte Kenntnis über den Schlüssel erlangen. Weiterhin würde das Vorhandensein eines sicheren Kommunikationskanals (für die Schlüsselübertragung) eine Verschlüsselung von vornherein überflüssig machen.
Asymmetrische Verfahren (oder auch Public-Key-Verfahren) beseitigen dieses Problem durch die Verwendung von zwei Schlüsseln (dem sogenannten Schlüsselpaar). Hierbei existiert ein öffentlicher Schlüssel, der offen verteilt werden kann und ein privater Schlüssel, den nur der Besitzer kennt. Für einen Austausch verschlüsselter Daten benötigt der Sender den öffentlichen Schlüssel des Empfängers. Mithilfe dieses Schlüssels werden die Daten auf der Senderseite verschlüsselt und auf der Empfängerseite mithilfe des privaten Schlüssels wieder entschlüsselt.
Der Vollständigkeithalber sei erwähnt das GnuPG im Grunde ein hybrides Verfahren verwendet. Da die asymmetrische Ver- und Entschlüsselung äusserst rechenintensiv ist, werden die ausgetauschten Daten in einem ersten Schritt symmetrisch verschlüsselt. Dieser Schlüssel wird bei jeden Datenaustausch neu erstellt. In einem zweiten Schritt wird dann dieser symmetrische Schlüssel mithilfe des öffentlichen Schlüssels des Kommunikationsteilnehmers asymmetrisch verschlüsselt. Zu guter Letzt werden die verschlüsselten Daten und der (asymmetrisch gesicherte) Schlüssel zusammengefasst und als ganzes ausgetauscht.
Für ein besseres Verständnis sei auf weiterführende Literatur verwiesen.
Installation
Aktuell befinden sich zwei Versionen von GnuPG in den Paketquellen. Zum einen gnupg (Version 1.x) und zum anderen gnupg2 (Version 2.x).
GnuPG 1.x ist im Vergleich zu GnuPG 2.x nicht modularisiert, bietet keine Unterstützung für S/MIME und es fehlen noch andere nützliche Werkzeuge für Desktop-Umgebungen. Dafür besitzt GnuPG 1.x aber auch weniger Abhängigkeiten. [2]
Beide Versionen können parallel zueinander installiert sein und greifen auf den selben Arbeitsordner zu.
GnuPG kann, wenn es nicht schon als Abhängigkeit eines anderen Paketes installiert wurde, mit
root@debian:~# apt-get install gnupg
bzw.
root@debian:~# apt-get install gnupg2
installiert werden.
Nach erfolgreicher Installation lässt sich die installierte Version per
user@debian:~$ gpg --version
bzw.
user@debian:~$ gpg2 --version
abrufen.
Weiterhin wird ein versteckter Ordner, das GnuPG-Arbeitsverzeichnis, unter ~/.gnupg/ erstellt. Dies enthält u.a. die Konfigurationsdatei gpg.conf, den Schlüsselbund für öffentliche Schlüssel pubring.gpg und den Schlüsselbund für private Schlüssel secring.gpg.
Grundlagen
Für nachfolgende Erläuterungen wird GnuPG Version 2.x verwendet, d.h. alle Befehle beginnen mit
user@debian:~$ gpg2 --Befehl
Bei einer Installation von GnuPG Version 1.x muss anstelle dessen
user@debian:~$ gpg --Befehl
verwendet werden.
Weiterhin sind Befehle bzw. Optionen mit Doppelstrich den GNU-Konventionen entsprechend auch als Optionen in der Konfigurationsdatei anwendbar. Einige besitzen bereits sinnvolle Standardwerte, andere machen ohne spezielle Angaben keinen Sinn.
Erzeugen eines Schlüsselpaares
Das Schlüsselpaar ist das Kernelement des Public-Key-Verfahrens. Die Generierung eines Schlüsselpaares erfolgt mittels
user@debian:~$ gpg2 --gen-key
user@debian:~$ gpg2 --gen-key
gpg (GnuPG) 2.0.26; Copyright (C) 2013 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.
Please select what kind of key you want:
(1) RSA and RSA (default)
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
Your selection? 1
Es wird die Vorgabe 1, d.h. RSA and RSA (default) ausgewählt.
Anschliessend muss die Schlüssellänge ausgewählt werden
RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096
Je grösser der Schlüssel, desto schwerer ist es diesen zu brechen. Daher wird die größtmögliche Schlüssellänge, d.h. 4096 gewählt.
Nun kommt die Abfrage der Gültigkeitsdauer des Schlüssels. Die Gültigkeit kann hierbei Tage, Wochen, Monate oder Jahre betragen, es ist aber auch möglich den Schlüssel ohne festgelegte Gültigkeitsdauer zu erstellen. Allerdings ist dieser Wert nicht bindend und kann problemlos im Nachhinein geändert werden.
Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) 0 Key does not expire at all Is this correct? (y/N) y
In diesem Fall wird ein Schlüssel ohne Gültigkeitsdauer definiert. Alternative Angaben sehen beispielsweise folgendermaßen aus
7 Die Gültigkeit des Schlüssels beträgt 7 Tage 1w Die Gültigkeit des Schlüssels beträgt 1 Woche 1m Die Gültigkeit des Schlüssels beträgt 1 Monat 1y Die Gültigkeit des Schlüssels beträgt 1 Jahr
Jetzt erfolgt die Angabe der persönlichen Daten, d.h. Name, E-mail-Adresse und ggf. eine Kommentar. Anschließend können die Daten noch einmal überprüft und dann mit O bestätigt werden .
GnuPG needs to construct a user ID to identify your key. Real name: Markus Mustermann Email address: markusmustermann@beispiel.de Comment: Email Markus Mustermann You selected this USER-ID: "Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
Zu guter Letzt erfolgt die Eingabe des persönlichen Passwortes. Hier sei besondere Achtung geboten. Das beste kryptographische System hilft nichts, wenn man nur ein sehr schwaches Passwort nutzt.
You need a Passphrase to protect your secret key.
Nach zweimaliger Eingabe erfolgt die Generierung des Schlüssels. Hierzu wird Entropy benötigt und es empfiehlt sich unterschiedliche Tätigkeiten am Rechner auszuführen, wie das Öffnen und Schließen großer Programme, Textverarbeitung, Surfen im Internet, etc. Der Vorgang der Schlüsselgenerierung kann einige Minuten in Anspruch nehmen. Es ist also etwas Geduld erforderlich,
We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy.
bevor der erstellte Schlüssel präsentiert wird.
gpg: key 81B9A232 marked as ultimately trusted public and secret key created and signed. gpg: checking the trustdb gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u pub 4096R/81B9A232 2016-03-30 Key fingerprint = BA13 ABFB BA35 E728 5825 AD55 8E07 A766 81B9 A232 uid [ultimate] Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de> sub 4096R/A56CD40E 2016-03-30
Erzeugen einer Widerrufurkunde
Nach dem Erzeugen eines Schlüsselpaares sollte im nächsten Schritt eine Widerrufurkunde (revocation certificate) erzeugt werden. Eine Widerrufurkunde stellt ein Zertifikat zum widerrufen des Schlüsselpaares dar, im Falle es wurde kompromittiert, d.h. gestohlen, verloren, gelöscht, usw., und kann nicht mehr verwendet werden. Die Widerrufurkunde dient nun dazu andere Personen darüber in Kenntnis zu setzen.
Allerdings gilt zu beachten, dass eine Widerrufurkunde den größten Nutzen hat, wenn man den öffentlichen Schlüssel über Schlüsselserver (key server) verteilt und somit auch die Widerrufurkunde über diese, da dies der Ort ist wo (theoretisch) andere Personen nach Schlüsseln suchen. Andernfalls muß jede Person, die den kompromittierten Schlüssel besitzt, separat gewarnt werden.
Die Erstellung einer Widerrufurkunde erfolgt über nachfolgenden Befehl. Da die Ausgabe von gpg nach STDOUT erfolgt, muss zusätzlich die Option --output verwendet werden, um die Ausgabe in eine Datei schreiben lassen.
user@debian:~$ gpg2 --output Name_der_Widerrufurkunde.asc --gen-revoke Schlüssel-ID
user@debian:~$ gpg2 --output Widerrufurkunde.asc --gen-revoke 81B9A232
sec 4096R/81B9A232 2016-03-30 Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>
Create a revocation certificate for this key? (y/N) y
Es wird mit y bestätigt.
Please select the reason for the revocation: 0 = No reason specified 1 = Key has been compromised 2 = Key is superseded 3 = Key is no longer used Q = Cancel (Probably you want to select 1 here) Your decision?
Die Voreinstellung ist 1, d.h. Key has been compromised. Sollte keine alternative Begründung angegeben werden wollen, kann einfach mit Enter bestätigt werden.
Anschliessend erhält man die Möglichkeit eine zusätzliche Beschreibung anzugeben. Sollte man dies nicht in Anspruch nehmen, dann kann auch hier einfach mit Enter bestätigt werden.
Enter an optional description; end it with an empty line: >
Abschliessend hat man noch einmal die Möglichkeit der Überprüfung
Reason for revocation: Key has been compromised (No description given) Is this okay? (y/N) y
Nach Zustimmung mit y wird man aufgefordert sein Passwort einzugeben, wonach anschließend die Widerrufurkunde erstellt und im eigenen Homeverzeichnis abgespeichert wird.
You need a passphrase to unlock the secret key for user: "Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>" 4096-bit RSA key, ID 81B9A232, created 2016-03-30
ASCII armored output forced. Revocation certificate created. Please move it to a medium which you can hide away; if Mallory gets access to this certificate he can use it to make your key unusable. It is smart to print this certificate and store it away, just in case your media become unreadable. But have some caution: The print system of your machine might store the data and make it available to others!
Es gilt zu beachten, dass die soeben erstellte Widerrufurkunde die einzige Möglichkeit ist einen kompromittierten Schlüssel für ungültig zu erklären. Sie sollte daher wenn möglich für Dritte unzugänglich aufbewahrt werden. Eine Möglichkeit wäre die Widerrufurkunde auf einem separaten USB-Stick oder einer CD/DVD zu speichern oder auch sie zusätzlich auszudrucken und in Papierform zu hinterlegen.
Schlüsselmanagement
Auflistung der Schlüssel
Die Auflistung der öffentlichen Schlüssel im eigenen Schlüsselbund erfolgt mittels des Befehls
user@debian:~$ gpg2 --list-public-keys
oder in Kurzform
user@debian:~$ gpg2 -k
oder
user@debian:~$ gpg2 --list-keys
Die Ausgabe eines bestimmten Schlüssels wird über das zusätzliche Argument der Schlüsselidentifikation mittels Schlüssel-ID, Name oder auch Email-Adresse erreicht.
user@debian:~$ gpg2 --list-public-keys Schlüssel-ID, Name oder Email-Adresse
user@debian:~$ gpg2 --list-public-keys
/home/user/.gnupg/pubring.gpg
------------------------------------
pub 4096R/81B9A232 2016-03-30
uid [ultimate] Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>
sub 4096R/A56CD40E 2016-03-30
pub bedeutet hierbei das es sich um den öffentlichen Schlüssel, den public Key handelt.
4096R gibt die Schlüssellänge 4096 bit und R die Art des Schlüssels, in diesem Fall RSA an.
81B9A232 ist die Schlüssel-ID.
2016-03-30 ist das Erstelldatum des Schlüssels. Im Falle einer definierten Gültigkeitsdauer würde an dieser Stelle zusätzlich das Verfallsdatum mit dargestellt werden.
uid ist die user ID bestehend aus dem Vetrauenslevel, dem Namen, dem Kommentar und der Mailadresse.
sub bedeutet hierbei das es sich um den öffentlichen Unterschlüssel, den public sub-Key handelt, inkl. Schlüssellänge, Art des Schlüssels, Schlüssel-ID und Erstelldatum.
Die Auflistung der privaten Schlüssel im eigenen Schlüsselbund erfolgt auf die gleiche Weise
user@debian:~$ gpg2 --list-secret-keys
oder in Kurzform
user@debian:~$ gpg2 -K
user@debian:~$ gpg2 --list-secret-keys
/home/user/.gnupg/secring.gpg
-----------------------------
sec 4096R/81B9A232 2016-03-30
uid Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>
ssb 4096R/A56CD40E 2016-03-30
sec bedeutet hierbei das es sich um den privaten Schlüssel, den secret Key handelt.
4096R gibt die Schlüssellänge 4096 bit und R die Art des Schlüssels, in diesem Fall RSA an.
81B9A232 ist die Schlüssel-ID.
2016-03-30 ist das Erstelldatum des Schlüssels. Im Falle einer definierten Gültigkeitsdauer würde an dieser Stelle zusätzlich das Verfallsdatum mit dargestellt werden.
uid ist die user ID bestehend aus dem Namen, dem Kommentar und der Mailadresse.
ssb bedeutet hierbei das es sich um den privaten Unterschlüssel, den secret sub-Key handelt, inkl. Schlüssellänge, Art des Schlüssels, Schlüssel-ID und Erstelldatum.
Zu beachten ist, dass die Schlüssel-ID vom öffentlichen und privatem Schlüssel (pub und sec), sowie vom öffentlichen und privatem Unterschlüssel (sub und ssb) desselben Nutzers identisch sind.
Für eine ausführlichere Darstellung der Identifikatoren empfiehlt sich die zusätzliche Option --fingerprint.
user@debian:~$ gpg2 --list-public-keys --fingerprint
oder einfach
user@debian:~$ gpg2 --fingerprint
Die Ausgabe des Fingerabdrucks eines bestimmten Schlüssels wird über das zusätzliche Argument der Schlüsselidentifikation mittels Schlüssel-ID, Name oder auch Email-Adresse erreicht.
user@debian:~$ gpg2 --fingerprint Schlüssel-ID, Name oder Email-Adresse
Die Ausgabe wird nun zusätzlich um den Fingerabdruck , den Key fingerprint, der öffentlichen Schlüssel erweitert. Der Fingerabdruck ist das Alleinstellungsmerkmal eines jeden Schlüssels. Beim Versenden und Empfangen öffentlicher Schlüssel ist der Abgleich des Fingerabdrucks zwischen Sender und Empfänger (über einen idealerweise sekundären Weg wie beispielsweise das Telefon) die einzige Möglichkeit um sicherzustellen das der Schlüssel auf dem Übertragungsweg nicht verändert wurde. Am Beispiel der öffentlichen Schlüssel würde dies Folgendes ergeben
user@debian:~$ gpg2 --list-public-keys --fingerprint
/home/user/.gnupg/pubring.gpg
-----------------------------
pub 4096R/81B9A232 2016-03-30
Key fingerprint = BA13 ABFB BA35 E728 5825 AD55 8E07 A766 81B9 A232
uid [ultimate] Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>
sub 4096R/A56CD40E 2016-03-30
Für die Ausgabe des Fingerabdrucks der Unterschlüssel muss die die Option --fingerprint zweimal angegeben werden.
user@debian:~$ gpg2 --list-public-keys --fingerprint --fingerprint
bzw.
user@debian:~$ gpg2 --fingerprint --fingerprint
user@debian:~$ gpg2 --list-public-keys --fingerprint --fingerprint
/home/user/.gnupg/pubring.gpg
------------------------------------
pub 4096R/81B9A232 2016-03-30
Key fingerprint = BA13 ABFB BA35 E728 5825 AD55 8E07 A766 81B9 A232
uid [ultimate] Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>
sub 4096R/A56CD40E 2016-03-30
Key fingerprint = 743E D0A5 9C21 A39D 463B 36EE 939A BA78 A56C D40E
Es ist zu bemerken das die Schlüssel-ID die letzten acht Ziffern des Fingerabdrucks darstellt und somit auch wiederum der Fingerabdruck vom öffentlichen und privatem Schlüssel (pub und sec), sowie vom öffentlichen und privatem Unterschlüssel (sub und ssb) desselben Nutzers identisch sind.
Editieren der Schlüssel
Das gezielte Editieren eines Schlüsselpaares erfolgt mittels des Befehls
user@debian:~$ gpg2 --edit-key Schlüssel-ID, Name oder Email-Adresse
Anhand der Schlüsselidentifikation durch Schlüssel-ID, Name oder Email-Adresse kann der zu bearbeitende Schlüssel ausgewählt werden. Existiert mehr als ein Schlüssel unter der angegebenen Schlüsselidentifikation gibt gpg eine Fehlermeldung aus.
user@debian:~$ gpg2 --edit-key 81B9A232
gpg (GnuPG) 2.0.26; Copyright (C) 2013 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.
Secret key is available.
pub 4096R/81B9A232 created: 2016-03-30 expires: never usage: SC
trust: ultimate validity: ultimate
sub 4096R/A56CD40E created: 2016-03-30 expires: never usage: E
[ultimate] (1). Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>
gpg>
Wie man sieht wird beim Aufruf der Schlüssel und alle vorhandenen Unterschlüssel, inkl. einiger wichtiger Eigenschaften, wie z.B. Erstell- und Verfallsdatum, etc., dargestellt, gefolgt von einem Prompt gpg> für die Befehlseingabe.
Als zusätzliche Eigenschaft wird auch die Verwendung usage mit angezeigt. Diese ist wie folgt definiert
S Schlüssel wird für das Signieren verwendet C Schlüssel wird für das Zertifizieren verwendet E Schlüssel wird für das Entschlüsseln verwendet A Schlüssel wird für das Authentifizieren verwendet
Eine Übersicht aller möglichen Befehle erhält man mithilfe des Befehls help.
gpg> help quit quit this menu save save and quit help show this help fpr show key fingerprint list list key and user IDs uid select user ID N key select subkey N check check signatures sign sign selected user IDs [* see below for related commands] lsign sign selected user IDs locally tsign sign selected user IDs with a trust signature nrsign sign selected user IDs with a non-revocable signature adduid add a user ID addphoto add a photo ID deluid delete selected user IDs addkey add a subkey addcardkey add a key to a smartcard keytocard move a key to a smartcard bkuptocard move a backup key to a smartcard delkey delete selected subkeys addrevoker add a revocation key delsig delete signatures from the selected user IDs expire change the expiration date for the key or selected subkeys primary flag the selected user ID as primary toggle toggle between the secret and public key listings pref list preferences (expert) showpref list preferences (verbose) setpref set preference list for the selected user IDs keyserver set the preferred keyserver URL for the selected user IDs notation set a notation for the selected user IDs passwd change the passphrase trust change the ownertrust revsig revoke signatures on the selected user IDs revuid revoke selected user IDs revkey revoke key or selected subkeys enable enable key disable disable key showphoto show selected photo IDs clean compact unusable user IDs and remove unusable signatures from key minimize compact unusable user IDs and remove all signatures from key * The `sign' command may be prefixed with an `l' for local signatures (lsign), a `t' for trust signatures (tsign), an `nr' for non-revocable signatures (nrsign), or any combination thereof (ltsign, tnrsign, etc.).
Sollten mehrere (Unter-) Schlüssel vorhanden sein, erfolgt die Auswahl eines bestimmten Schlüssels über den Befehl key N, wobei N die Nummer (in der absteigenden Reihenfolge) des Schlüssels ist. Der ausgewählte Schlüssel wird durch ein Asterisk * markiert. So ist z.B. key 1 der erste Unterschlüssel, mittels key * werden alle Schlüssel ausgewählt und mittels key 0 alle Schlüssel abgewählt.
Exportieren eines öffentlichen Schlüssels
Für die Nutzung von GnuPG ist es erforderlich den eigenen öffentlichen Schlüssel an andere Personen zu übermitteln. Hierfür muss dieser mithilfe der Option --export exportiert werden. Exportierte Schlüssel werden entweder nach STDOUT oder durch Verwendung des zusätzlichen Befehls --output in eine Datei geschrieben.
user@debian:~$ gpg2 --output mein_oeffentlicher_schluessel.asc --export Schlüssel-ID, Name oder Email-Adresse
Mit dem dargestellten Befehl findet eine Ausgabe im Binärformat statt. Da dies u.U. unpraktisch sein kann, empfiehlt sich der zusätzliche Befehl --armor. Hierdurch wird eine Ausgabe im ASCII-Format erzwungen.
user@debian:~$ gpg2 --armor --output mein_oeffentlicher_schluessel.asc --export Schlüssel-ID, Name oder Email-Adresse
Der in das Homeverzeichnis des Nutzers exportierte Schlüssel kann nun problemlos auf elektronischem Wege (E-Mail, etc.) oder auch ausgedruckt und in Papierform verteilt werden.
Importieren eines öffentlichen Schlüssels
Der Import des öffentlichen Schlüssels eines Kommunikationsteilnehmers erfolgt mittels des Befehls --import.
user@debian:~$ gpg2 --import irgendein_oeffentlicher_schluessel.asc
user@debian:~$ gpg2 --import Martina.asc
gpg: key 64RFC55F: public key "Martina <Martina@Musterfrau.de>" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
Anschliessend können zur Kontrolle die öffentlichen Schlüssel im Schlüsselbund aufgelistet werden.
user@debian:~$ gpg2 -k
/home/user/.gnupg/pubring.gpg
------------------------------------
pub 4096R/81B9A232 2016-03-30
uid [ultimate] Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>
sub 4096R/A56CD40E 2016-03-30
pub 4096R/64RFC55F 2015-12-29 [expires: 2017-01-30]
uid [ unknown] Martina <Martina@Musterfrau.de>
Signieren eines öffentlichen Schlüssels
Nachdem der öffentliche Schlüssel eines Kommunikationsteilnehmers importiert wurde, sollte (aus Sicherheitsgründen) dessen Gültigkeit überprüft werden. Hierzu wird der Fingerabdruck des importierten Schlüssels, i.d.R. über einen sekundären Weg wie z.B. über das Telefon, mit dem Besitzer des Schlüssels abgeglichen.
Hierfür ist es erforderlich den importierten Schlüssel zu editieren.
user@debian:~$ gpg2 --edit-key 64RFC55F
gpg (GnuPG) 2.0.26; Copyright (C) 2013 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.
pub 4096R/64RFC55F created: 2015-12-29 expires: 2017-01-30 usage: SCEA
trust: unknown validity: unknown
[ unknown] (1). Martina <Martina@Musterfrau.de>
gpg>
Die Anzeige des Fingerabdrucks kann im Vorfeld über den schon aufgezeigten Befehl gpg2 --fingerprint oder im Editiermodus über fpr erfolgen. Nach Abgleich des Fingerabdrucks wird der importierte Schlüssel über den Befehl sign signiert.
gpg> sign pub 4096R/64RFC55F created: 2015-12-29 expires: 2017-01-30 usage: SCEA trust: unknown validity: unknown Primary key fingerprint: D93D 2E5T 8407 790D 5439 1V4R D73A 555G 64RF C55F Martina <Martina@Musterfrau.de> This key is due to expire on 2017-01-30. Are you sure that you want to sign this key with your key "Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>" (81B9A232) Really sign? (y/N) y
Nach Bestätigung ist die Eingabe des eigenen Passwortes erforderlich, bevor die Signierung abgeschlossen ist.
You need a passphrase to unlock the secret key for user: "Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>" 4096-bit RSA key, ID 81B9A232, created 2016-03-30 gpg>
Die Kontrolle der korrekten Signierung erfolgt anhand des Befehls check.
gpg> check uid Martina <Martina@Musterfrau.de> sig!3 64RFC55F 2015-12-29 [self-signature] sig! 81B9A232 2016-05-02 Markus Mustermann (Email Markus Mustermann)
Jede Benutzer-ID besitzt eine (oder mehrere) self-signature und die Signaturen der jeweiligen Nutzer die den Schlüssel signiert haben.
Der Editiermodus kann nun mit quit verlassen werden, wobei noch eine Bestätigung der getätigten Änderungen erforderlich ist.
Vetrauenslevel in einen Schlüsselbesitzer
Im Abschnitt Signieren eines öffentlichen Schlüssels wurde aufgezeigt wie man einen Schlüssel zuerst anhand des Fingerabdrucks überprüft und diesen im positiven Fall anschließend mit seinem privaten Schlüssel signiert. Bei einzelnen Schlüsseln und/oder Personen die man persönlich kennt ist dies ein passendes Prozedere. Im Falle einer großen Anzahl von zu überprüfenden Schlüsseln oder erforderlicher Kommunikation mit unbekannten Personen gestaltet sich dies allerdings als eher ungünstig.
GnuPG versucht dieses Problem mithilfe des web of trust zu lösen. Hierbei wird die Entscheidung über die Korrektheit eines Schüssels auf Personen übertragen, welchen wir vertrauen. Zum Beispiel
- Markus hat Martinas Schlüssel signiert, und
- Martina hat Pauls und Peters Schlüssel signiert.
Wenn Markus jetzt Martina vertraut nur vertrauenswürdige Schlüssel zu signieren, dann kann Markus jetzt folgern das Pauls und Peters Schlüssel korrekt sind, ohne diese persönlich überprüft zu haben. Hierfür gleicht Markus einfach nur Martinas öffentlichen Schlüssel mit den Signaturen auf Pauls und Peters Schlüssel ab.
Das heißt, vertraut man einer Person die Korrektheit zu signierender Schlüssel richtig einzuschätzen, dann wird jeder Schlüssel, der von dieser vertrauensvollen Person signiert wird, ebenfalls als Korrekt eingestuft.
Natürlich ist Vertrauen nun etwas subjektives. So kann beispielsweise Markus Martinas Schlüssel signiert haben, aber er muss ihr nicht zwingend vetrauen die Korrektheit öffentlicher Schlüssel dritter Kommunikationsteilnehmer richtig einzuschätzen. In diesem Fall würde er nicht die Korrektheit von Pauls und Peters Schlüssel, nur auf der Basis von Martinas Einschätzung, bestätigen.
Hierfür wiederum ist es möglich den öffentlichen Schlüssel mit einem Vetrauenslevel (in den Besitzer) zu kennzeichnen. Es stehen vier Vertrauenslevel zur Verfügung:
Unbekannt: Die Fähigkeit des Schlüsselbesitzers, die Korrektheit anderer Schlüssel einzuschätzen ist unbekannt. Jeder Schlüssel eines anderen Kommunikationsteilnehmers, im eigenen öffentlichen Schlüsselring, erhält anfänglich diese Stufe.
Kein Vertrauen: Der Schlüsselbesitzer wird eingeschätzt Schlüssel Dritter nicht korrekt zu signieren.
Teilweises Vertrauen: Der Schlüsselbesitzer versteht die Tragweite des Signierens eines Schlüssels und überprüft diese daher auf deren Korrektheit bevor er sie signiert.
Volles Vertrauen: Der Schlüsselbesitzer hat ein ausgezeichnetes Verständnis bezüglich des Signierens eines Schlüssels und seine Signatur auf einem Schlüssel wäre so gut wie die eigene Signatur.
Hinweis: Das Vetrauenslevel in einen Schlüssel wird als eine private Information betrachtet. Es wird nicht mit verpackt, wenn der Schlüssel exportiert wird, und wird sogar in einer separaten Datei (trustdb.gpg) abgespeichert. |
Um das Vetrauenslevel in einen Schlüsselbesitzer zu definieren, muss dessen Schlüssel editiert werden.
user@debian:~$ gpg2 --edit-key Schlüssel-ID, Name oder Email-Adresse
user@debian:~$ gpg2 --edit-key 64RFC55F
gpg (GnuPG) 2.0.26; Copyright (C) 2013 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.
pub 4096R/64RFC55F created: 2015-12-29 expires: 2017-01-30 usage: SCEA
trust: unknown validity: unknown
[ unknown] (1). Martina <Martina@Musterfrau.de>
Nun wird mittels des Befehls trust das Vetrauenslevel definiert.
gpg> trust pub 4096R/64RFC55F created: 2015-12-29 expires: 2017-01-30 usage: SCEA trust: unknown validity: unknown [ unknown] (1). Martina <Martina@Musterfrau.de> Please decide how far you trust this user to correctly verify other users' keys (by looking at passports, checking fingerprints from different sources, etc.) 1 = I don't know or won't say 2 = I do NOT trust 3 = I trust marginally 4 = I trust fully 5 = I trust ultimately m = back to the main menu Your decision? 4
In diesem Fall wird Option 4 = I trust fully gewählt und bestätigt.
pub 4096R/64RFC55F created: 2015-12-29 expires: 2017-01-30 usage: SCEA trust: full validity: unknown [ unknown] (1). Martina <Martina@Musterfrau.de>
Wie man sieht, hat sich das Vetrauenslevel von unknown nach full geändert. Weiterhin wird die Vertrauensdatenbank (trustdb.gpg) neu berechnet, für den Fall es ergeben sich Änderungen in der Vertrauenswürdigkeit von Schlüsseln Dritter.
Während normalerweise ein Schlüssel nur als vertrauenswürdig eingestuft wird, wenn er persönlich kontrolliert und signiert wurde, erlaubt das web of trust nun eine flexiblere Herangehensweise für die Authentifizierung von Schlüsseln. So wird u.a. ein Schlüssel als vertrauenswürdig eingestuft wenn er, neben der persönlichen Signierung, von einem Schlüssel der Vertrauensstufe Volles Vertrauen oder von drei Schlüsseln der Vertrauensstufe Teilweises Vertrauen unterschrieben wurde.[3]
Für weitergehende Erläuterungen bezüglich web of trust sei auf weiterführende Literatur verwiesen.
Änderung des Verfallsdatums
Die Änderung des Verfallsdatums erfolgt im Editiermodus anhand des Befehls expire.
user@debian:~$ gpg2 --edit-key 81B9A232
gpg (GnuPG) 2.0.26; Copyright (C) 2013 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.
Secret key is available.
pub 4096R/81B9A232 created: 2016-03-30 expires: never usage: SC
trust: ultimate validity: ultimate
sub 4096R/A56CD40E created: 2016-03-30 expires: never usage: E
[ultimate] (1). Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>
gpg>
Nun wird als Befehl expire gewählt.
gpg> expire Changing expiration time for the primary key. Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0)
Beispielhaft ändern wir das Verfalssdatum des Schlüssels auf in 10 Tagen. Nach Eingabe muss dies mit einem y und der anschließenden Passworteingabe bestätigt werden.
Key is valid for? (0) 10 Key expires at Mon 13 Jun 2016 12:32:08 UTC Is this correct? (y/N) y You need a passphrase to unlock the secret key for user: "Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>" 4096-bit RSA key, ID 81B9A232, created 2016-03-30 pub 4096R/81B9A232 created: 2016-03-30 expires: 2016-06-13 usage: SC trust: ultimate validity: ultimate sub 4096R/A56CD40E created: 2016-03-30 expires: never usage: E [ultimate] (1). Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>
Wie man sieht, verfällt der Schlüssel nun in 10 Tagen, d.h. das Verfalsdatum hat sich von expires: never zu expires: 2016-06-13 geändert.
Für die Änderung des Verfallsdatums eines Unterschlüssels muss im Editiermodus zuerst der Unterschlüssel mittels key N ausgewählt werden.
gpg> key 1 pub 4096R/81B9A232 created: 2016-03-30 expires: 2016-06-13 usage: SC trust: ultimate validity: ultimate sub* 4096R/A56CD40E created: 2016-03-30 expires: never usage: E [ultimate] (1). Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>
Wie man sieht, ist der (erste) Unterschlüssel nun mit einem Asterisk * markiert. Die weiteren Schritte erfolgen nun analog der zuvor erläuterten Vorgehensweise.
gpg> expire Changing expiration time for a subkey. Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0) 10 Key expires at Mon 13 Jun 2016 12:42:58 UTC Is this correct? (y/N) y You need a passphrase to unlock the secret key for user: "Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>" 4096-bit RSA key, ID 81B9A232, created 2016-03-30 pub 4096R/81B9A232 created: 2016-03-30 expires: 2016-06-13 usage: SC trust: ultimate validity: ultimate sub* 4096R/A56CD40E created: 2016-03-30 expires: 2016-06-13 usage: E [ultimate] (1). Markus Mustermann (Email Markus Mustermann) <markusmustermann@beispiel.de>
Beide Schlüssel besitzen nun das gleiche Verfalssdatum. Die Abwahl des Unterschlüssels für evtl. weitere Aktionen geschieht mittels key 0 bzw. das Verlassen des Editiermodus mittels quit.
Beim Verlassen wird noch einmal nachgefragt ob die Änderungen gespeichert werden sollen. Dies wird natürlich auch mit y bestätigt.
gpg> quit Save changes? (y/N) y user@debian:~$
Entfernen eines Schlüssels
Entfernen öffentlicher Schlüssel von Kommunikationsteilnehmern
Das Entfernen öffentlicher Schlüssel aus dem eigenen Schüsselbund erfolgt mithilfe des Befehls --delete-key in Kombination mit einem entsprechendem Schlüsselidentifikator, wie z.B. Schlüssel-ID, Name oder auch Email-Adresse.
user@debian:~$ gpg2 --delete-key Schlüssel-ID, Name oder Email-Adresse
Nach Aufrufen des Befehls ist zur Sicherheit noch eine Bestätigung erforderlich, bevor dieser entfernt wird.
user@debian:~$ gpg2 --delete-key 64RFC55F
gpg (GnuPG) 2.0.26; Copyright (C) 2013 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.
pub 4096R/64RFC55F 2015-12-29 Martina <Martina@Musterfrau.de>
Delete this key from the keyring? (y/N) y
Entfernen des eigenen öffentlichen und privaten Schlüssel
Hinweis: An dieser Stelle ist Vorsicht geboten! Das Entfernen eigener privater Schlüssel führt dazu, dass digitale Daten (E-Mails, etc.) die mit dem öffentlichen Schlüssel dieses Schlüsselpaares verschlüsselt wurden, nicht mehr entschlüsselbar sind! Das heißt, sollte ein Schlüssel kompromitiert sein und durch einen Neuen ersetzt werden, so ist der kompromitierte Schlüssel weiterhin erforderlich, um die digitalen Daten zu entschlüsseln, die bis zu diesem Zeitpunkt mithilfe des öffentlichen Schlüssels dieses Schlüsselpaares verschlüsselt wurden.
Beim Entfernen des eigenen öffentlichen und privaten Schlüssels ist daher Vorsicht geboten! |
Bei der Verwendung des Befehls --delete-key erfolgt der Hinweis das ein privater Schlüssel zu diesem öffentlichen Schlüssel existiert und dieser zuerst entfernt werden muss.
Das Entfernen des privaten Schlüssels erfolgt mittels des Befehls
user@debian:~$ gpg2 --delete-secret-key Schlüssel-ID, Name oder auch Email-Adresse
und das Entfernen von privatem und öffentlichem Schlüssel zugleich über
user@debian:~$ gpg2 --delete-secret-and-public-key Schlüssel-ID, Name oder auch Email-Adresse
Anwendung von GnuPG
Ver- und Entschlüsseln von Dateien
Das Ver- und Entschlüsseln von Dateien ist die Hauptaufgabe von GnuPG. Zum einen kann man Dateien mittels des Public-Key-Verfahrens verschlüsseln. Hierzu benötigt man den öffentlichen Schlüssel des Kommunikationsteilnehmers. Zum anderen ist es aber auch möglich Dateien ohne Public-Key-Verfahren zu verschlüsseln. Hierbei kommt eine symmetrische Verschlüsselung zum Einsatz und der Schlüssel wird aus dem zu definierenden Passwort abgeleitet.
Verschlüsseln von Dateien
Für das Verschlüsseln von Dateien für andere Personen benötigt man deren öffentlichen Schlüssel. Die Verschlüsselung erfolgt dann über denn Befehl
user@debian:~$ gpg2 --encrypt --recipient Schlüssel-ID DATEI
bzw.
user@debian:~$ gpg2 -e -r Schlüssel-ID DATEI
Die Schlüssel-ID kann hierbei entweder die Schlüssel-ID selbst, Name oder Email-Adresse sein.
Die Verschlüsselung mithilfe der E-Mailadresse erfolgt beispielsweise folgendermaßen
user@debian:~$ gpg2 --encrypt --recipient Martina@Musterfrau.de Beispieldatei.txt
Die Ausgabedatei behält den Dateinamen und wird um die Dateiendung .gpg erweitert. Sie wäre dann Beispieldatei.txt.gpg. Der Dateiname sollte also ggf. mit Bedacht gewählt werden. Es ist allerdings auch möglich den Ausgabedateinamen zu ändern. Hierfür muss der zusätzliche Befehl --output unter Angabe des neuen Namens und der Dateiendung .gpg verwendet werden. Dies würde folgendermaßen aussehen
user@debian:~$ gpg2 --output neuer_Dateiname.gpg --encrypt --recipient Martina@Musterfrau.de originaler_Dateiname.txt
oder in Kurzform
user@debian:~$ gpg2 -o neuer_Dateiname.gpg -e -r Martina@Musterfrau.de originaler_Dateiname.txt
Der Name der verschlüsselten Ausgabedatei würde nun neuer_Dateiname.gpg sein.
Als Empfänger können auch mehrere Kommunikationsteilnehmer angegeben werden, wobei die verschlüsselte Datei nach wie vor nur einmal erstellt wird. Hierfür muss einfach der Befehl --recipient mit der Angabe des zusätzlichen Empfängers wiederholt werden. Bei drei Empfängern sehe dies beispielsweise folgendermaßen aus
user@debian:~$ gpg2 --encrypt --recipient Empfänger_1 --recipient Empfänger_2 --recipient Empfänger_3 Beispieldatei.txt
Wird der Empfänger, d.h. der Befehl --recipient, nicht angegeben, erfolgt die automatische Abfrage des Empfängers. Hierbei reicht es einen eindeutigen Teil der Schlüssel-ID anzugeben und GnuPG vervolständigt automatisch. Es können auch mehrere Empfänger angegeben werden.
Die symmetrische Verschlüsselung von Dateien erfolgt über den Befehl --symmetric. Hierfür ist keine Angabe des Empfängers, dafür aber die Eingabe eines Passwortes erforderlich. Dies sollte selbstverständlich nicht das Passwort des eigenen privaten Schlüssels sein! Die Verschlüsselung erfolgt anhand des Befehls
user@debian:~$ gpg2 --symmetric DATEI
bzw.
user@debian:~$ gpg2 -c DATEI
Es folgt eine zweimalige Abfrage des für die Verschlüsselung zu verwendetem Passwortes, worauf folgend die Datei erstellt wird. Hierbei wird ebenfalls der Dateiname belassen und nur um die Endung .gpg erweitert. Für die Änderung des Dateinamens der verschlüsselten Datei, muss wie zuvor erläutert der zusätzliche Befehl --output verwendet werden.
Die Verschlüsselung von Dateien kann dementsprechend asymmetrisch oder symmetrisch erfolgen. So können beispielsweise Dateien für den privaten Gebrauch symmetrisch verschlüsselt werden. Ebenso kann dies aber auch asymmetrisch erfolgen, wobei als Empfänger die eigene Schlüssel-ID verwendet wird.
Entschlüsseln von Dateien
Das Entschlüsseln von Dateien erfolgt über den Befehl --decrypt. Zusätzlich muss allerdings der Befehl --output mit angegeben werden, da sonst die Ausgabe nach STDOUT erfolgt.
user@debian:~$ gpg2 --output Beispieldatei.txt --decrypt Beispieldatei.txt.gpg
bzw.
user@debian:~$ gpg2 -o Beispieldatei.txt -d Beispieldatei.txt.gpg
Nach Passwortabfrage des privaten Schlüssels erfolgt die Entschlüsselung in den aktuellen Ordner unter dem definierten Dateinamen. Selbstverständlich ist der Dateiname auch frei wählbar.
Dies Entschlüsselung symmetrisch verschlüsselter Dateien erfolgt analog.
Der Einfachheithalber sei erwähnt, dass der Befehl --decrypt beim Entschlüsseln auch weggelassen werden kann. GnuPG erkennt eine verschlüsselte Datei automatisch und führt die entsprechenden Operationen aus. Dies würde das vorhergehende Beispiel auf folgenden Befehl verkürzen
user@debian:~$ gpg2 --output Beispieldatei.txt Beispieldatei.txt.gpg
Asymmetrisch oder Symmetrisch ist hierbei ohne Bedeutung.
Signieren von Dateien
Verwendung von Unterschlüssel
Die Erzeugung von Unterschlüsseln kann als zusätzliche Vorgehensweise für fortgeschrittene Nutzer angesehen werden. Es ist nicht zwingend erforderlich und die zuvor dargestellten Grundlagen sind für die normale Anwendung von GnuPG, d.h. die Verschlüsselung und Signierung digitaler Daten, vollkommen ausreichend.
Schlüsselserver
Weiterführende Literatur
Das GNU-Handbuch zum Schutze der Privatsphäre