GnuPG

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Baustelle.png 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 Debianpackage.png gnupg (Version 1.x) und zum anderen Debianpackage.png 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.png 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.png 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

OpenPGP vs. S/MIME (X.509)

GnuPG Privacy Guide

Referenzen