GnuPG, sichere Schlüsselerzeugung

GnuPG (GNU Private Guard) ist eine vollständige, kostenfreie Implementierung von OpenPGP für Windows, Mac und Linux. GnuPG gibt einer realen Person mittels Public-Key-Kryptographie eine digitale Identität. Vereinfacht ausgedrückt verfügt eine Person in GnuPG immer über ein Schlüsselpaar, das aus einem geheimen Schlüssel (Private-Key) und einem öffentlichen Schlüssel (Public-Key) besteht. Der Private-Key wird zum Signieren und Entschlüsseln von Dateien oder Nachrichten verwendet. Das Gegenstück stellt der Public-Key dar. Er ist öffentlich bekannt und dient zum Verschlüsseln von für diese Person bestimmte Dateien und Nachrichten sowie zum Prüfen einer von dieser Person erstellten Signatur, die bei erfolgreicher Prüfung die Authentizität (Echtheit) der signierten Daten bestätigt. In Wirklichkeit gibt es in GnuPG einen Master-Key und davon abhängige Unterschlüssel (Subkeys), die für verschiedene kryptographische Operationen genutzt werden können.

Dieser Artikel zeigt, wie man auf sichere Art und Weise mit GnuPG einen neuen Schlüssel erstellt und behandelt die folgenden Punkte:

  • Sichere Erzeugung eines Schlüsselpaars
  • Übertragung des Schlüssels auf einen OpenPGP-fähigen Yubikey
  • Veröffentlichung des öffentlichen Schlüssels

Für die gesamte Anleitung wird folgende Hardware benötigt:

  • Für das Linux-Live-System, wahlweise:
    • DVD-Brenner + DVD-Rohling
    • USB-Stick (min. 4 GB)
  • USB-Stick für die Speicherung des erzeugten GPG-Schlüssels (der kleinste verfügbare USB-Stick reicht aus)
  • Ein Yubikey 4 oder 5 zur sicheren Nutzung des GPG-Schlüssels im Alltag

Schritt 1) Booten einer sauberen Linux-Installation

Bei Public-Key-Kryptographie ist der Private-Key der Aspekt, der die Sicherheit in das System bringt. Mit seiner Hilfe kann sein Besitzer Dateien/Nachrichten unterschreiben (signieren) und an ihn gerichtete verschlüsselte Nachrichten entschlüsseln. Der Private-Key ist daher ein Teil der digitalen Identität einer Person und muss entsprechend geschützt werden, um Identitätsdiebstahl zu vermeiden.

Computersysteme, die Kontakt zum Internet haben, von mehreren Personen genutzt werden oder einfach schon lange laufen und etliche Programminstallationen mitgemacht haben, sollten für die Erzeugung einer digitalen Identität nicht verwendet werden. Daher empfiehlt es sich, ein sauberes Betriebssystem von einer CD/DVD oder einem USB-Stick zu booten und die Erzeugung von kryptographischen Schlüsseln dort zu erledigen. Fast alle Linux-Distributionen bieten eine Live-Version an, die von eben diesen Medien direkt gestartet werden kann. GnuPG ist integraler Bestandteil aller Linux-Distributionen und wird dort u. a. auch zur Signierung von Softwarepaketen benutzt. Je nach Geschmack kann man daher ein Linux der Wahl verwenden. In dieser Anleitung kommt Ubuntu zum Einsatz.

Als erstes lädt man daher das Image einer aktuellen Desktop-Ubuntu-DVD herunter und brennt die ISO-Datei mit Hilfe eines Brennprogramms der Wahl auf eine DVD oder kopiert sie auf einen USB-Stick. Unter Windows leistet dabei Rufus gute Dienste. Rufus gibt es auch als portable Version.

Wenn die bootbare DVD oder der USB-Stick erstellt ist, kann man den PC mit dem Medium booten. Möglicherweise muss vorher im BIOS die Bootreihenfolge geändert werden. Ist das Live-System hochgefahren präsentiert sich im Fall von Ubuntu der klassische Desktop.

Jetzt muss nur noch der USB-Stick, auf dem der GnuPG-Schlüssel gespeichert werden soll, gemountet werden. Je nach Ausstattung des PCs wird dem USB-Stick beim Einstecken ein Block-Device zugewiesen, doch welches das ist, ist zu ermitteln. Den einfachsten Weg bietet hierbei die GUI-Applikation Disks. Für Anhänger der Konsole hilft fdisk weiter:

me@ubuntu:/$ sudo fdisk -l

Einmal vor dem Einstecken aufrufen, einmal danach. Der neu hinzugekommene Eintrag ist der USB-Stick. Hat man das Blockdevice (hier: /dev/sdx1) ermittelt, kann man den USB-Stick mounten:

me@ubuntu:/$ sudo mkdir /mnt/gpg
me@ubuntu:/$ sudo mount /dev/sdx1 /mnt/gpg

Das System ist nun bereit.

Schritt 2) Erzeugen des GnuPG-Schlüssels

Laut Bundesministerium für Sicherheit in der Informationstechnik (BSI) gelten Algorithmen, deren Sicherheit auf der Primzahlzerlegung von großen Zahlen beruht, aktuell als sicher (Quelle). Ein Modulus von 2000 bit bietet nach Einschätzung des BSI Schutz bis zum Jahr 2022, ein Modulus von 3000 bit reicht bis zum Jahr 2024. Ein solcher Algorithmus ist RSA. Wählt man RSA mit einer Schlüssellänge von 4096 bit, so ist man also auf der sicheren Seite. Der Einsatz von Quantencomputern zum Brechen von RSA wird allgemein nicht als Gefahr gesehen. Eine größere Gefahr ist die stetig wachsende Rechenkapazität herkömmlicher Computersysteme und die damit verbundene Fähigkeit in kürzerer Zeit größere Zahlen zu faktorieren. Ein Punkt, der für RSA spricht, ist, dass RSA etabliert ist und flächendeckend unterstützt wird. Die erhöhte Rechenzeit, die mit einem langen RSA-Schlüssel verbunden ist, ist für den Einsatzzweck von OpenPGP kein wirkliches Problem. Bei Webservern, die Tausende von verschlüsselten Verbindungen handhaben müssen, sieht das ein wenig anders aus. Und da OpenPGP im Gegensatz zu TLS keine Pretty Forward Secrecy unterstützt, ist es umso wichtiger, einen ausreichend starken Schlüssel zu haben. Denn würde dieser Schlüssel – sei es durch Diebstahl oder aber Brute-Force-Angriff – bekannt, wären rückwirkend alle jemals mit dem betroffenen Schlüssel verschlüsselten Daten entschlüsselbar.

Bei GnuPG gibt es genau genommen mehrere Private-Keys. Standardmäßig wird ein Key zum Signieren von Daten und zum Zertifizieren von anderen Schlüsseln verwendet. Ein zweiter Private-Key wird für Verschlüsselungszwecke eingerichtet. Die doppelte Nutzung des ersten Schlüssels ist das eigentliche Problem. Zum Erzeugen von Signaturen muss man über genau diesen Private-Key verfügen, was natürlich bedingt, dass dieser Schlüssel bei der täglichen Arbeit auch im Zugriff ist. Fällt dieser Private-Key in die falschen Hände, kann der neue Besitzer damit nicht nur Signaturen im Namen des ursprünglichen Besitzers erzeugen, sondern durch die Freigabe der Zertifizierung auch neue Schlüssel erzeugen und anderen GnuPG-Nutzern Vertrauen aussprechen (zertifizieren). Die digitale Identität ist damit vollständig kompromittiert. Es ist nur noch möglich, den gesamten Schlüssel zu widerrufen, damit zu sperren und einen neuen Schlüssel zu erzeugen – eine vollständig neue Identität!

Aus diesem Grund ist es empfehlenswert, den Signatur-Schlüssel vom Zertifizierungsschlüssel zu trennen. Bei der täglichen Arbeit kann man dann die privaten Schlüssel für Signatur und Verschlüsselung nutzen, während der Zertifizierungsschlüssel an einem sicheren Ort aufbewahrt werden kann. Wird ein Signatur- oder Verschlüsselungsschlüssel kompromittiert, so kann dieser gezielt mit Hilfe es Master-Keys widerrufen und damit deaktiviert werden. Dieses Vorgehen verursacht deutlich weniger Aufwand, als den gesamten Schlüssel zu widerrufen.

Beginnen wir mit der Erzeugung des Master-Keys. Während dieses Prozesses fragt GnuPG nach einer Passphrase, mit der der Master-Key verschlüsselt wird. Diese Passphrase wird für alle Operationen mit diesem Schlüssel benötigt. Sie ist der einzige Schutz, den der Master-Key noch hat, sollte er einmal abhanden kommen – was man besser durch räumliche Isolation (Stahlkassette, Tresor, Bankschließfach u.ä.) gewährleistet.

me@ubuntu:/mnt/gpg$ gpg --expert --full-gen-key
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(9) ECC and ECC
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(13) Existing key
Your selection? 8

Possible actions for a RSA key: Sign Certify Encrypt Authenticate
Current allowed actions: Sign Certify Encrypt

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? s

Possible actions for a RSA key: Sign Certify Encrypt Authenticate
Current allowed actions: Certify Encrypt

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? e

Possible actions for a RSA key: Sign Certify Encrypt Authenticate
Current allowed actions: Certify

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? q

RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
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

GnuPG needs to construct a user ID to identify your key.

Real name: Markus Mustermann
Email address: markus@mustermann.de
Comment:
You selected this USER-ID:
"Markus Mustermann <markus@mustermann.de>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
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.
gpg: key 347F26084AA7CBC8 marked as ultimately trusted
gpg: revocation certificate stored as '/home/me/.gnupg/openpgp-revocs.d/6686B5D42B8BFC2A371C961D347F26084AA7CBC8.rev'
public and secret key created and signed.

pub   rsa4096 2018-12-12 [C]
6686B5D42B8BFC2A371C961D347F26084AA7CBC8
uid                      Markus Mustermann <markus@mustermann.de>

Dieser Schlüssel ist nur in der Lage weitere Schlüssel zu zertifizieren. Für die gewünschten Operationen (Signatur, Verschlüsselung, ggf. Authentifizierung) muss man nun Unterschlüssel hinzufügen. Die Möglichkeit OpenPGP auch für die Authentifizierung ggü. einem SSH-Server zu nutzen, ist recht attraktiv und bietet einen sichereren Zugang zu Servern, als dies mit Passwörtern allein möglich ist. Das gilt insbesondere dann, wenn die in diesem Schritt erzeugten Schlüssel auf eine OpenPGP-fähige Smartcard (hier: ein Yubikey) geladen werden. Dazu später mehr.

Fügen wir nun separate Schlüssel für Signatur, Verschlüsselung und Authentifizierung hinzu:

me@ubuntu:/mnt/gpg$ gpg --expert --edit-key markus@mustermann.de
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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.

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
Your selection? 4
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
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
Really create? (y/N) y
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.

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
Your selection? 6
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
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)
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y
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.

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
ssb  rsa4096/D54438E4C9CE641E
     created: 2018-12-12  expires: never       usage: E
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
Your selection? 8

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Sign Encrypt

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? s

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Encrypt

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? e

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions:

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? a

Possible actions for a RSA key: Sign Encrypt Authenticate
Current allowed actions: Authenticate

(S) Toggle the sign capability
(E) Toggle the encrypt capability
(A) Toggle the authenticate capability
(Q) Finished

Your selection? q
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (3072) 4096
Requested keysize is 4096 bits
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
Really create? (y/N) y
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.

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
ssb  rsa4096/D54438E4C9CE641E
     created: 2018-12-12  expires: never       usage: E
ssb  rsa4096/972402F085FAE45B
     created: 2018-12-12  expires: never       usage: A
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> save

Sollte der Master-Key verloren gehen, weil das Medium, auf dem er gespeichert ist, unbrauchbar geworden ist oder es einfach gestohlen wird, empfiehlt es sich, den Master-Key ebenfalls unbrauchbar zu machen, um die weitere Benutzung zu unterbinden. Dies geschieht durch ein Widerrufzertifikat, das wie folgt erzeugt wird:

me@ubuntu:/mnt/gpg$ gpg --output markus@mustermann.de.gpg-revocation-certificate --gen-revoke markus@mustermann.de

sec  rsa4096/347F26084AA7CBC8 2018-12-12 Markus Mustermann <markus@mustermann.de>

Create a revocation certificate for this key? (y/N) y
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? 3
Enter an optional description; end it with an empty line:
> The master key was lost.
>
Reason for revocation: Key is no longer used
The master key was lost.
Is this okay? (y/N) y
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!

Ist man noch im Besitz des Master-Keys lässt sich natürlich jederzeit auch ein angepasstes Widerrufzertifikat mit passenderem Grund erstellen. Ein guter weiterer Grund für einen Widerruf ist es auch, wenn das verwendete Verschlüsselungsverfahren oder einfach die verwendete Schlüssellänge nicht mehr zeitgemäß ist. Damit der Widerruf aktiv wird, muss das Widerrufzertifikat allen beteiligten Kommunikationspartnern zur Verfügung gestellt werden. Dies geschieht durch das Senden des Widerrufzertifikats an den jeweils zuständigen Schlüsselserver. Dazu später mehr.

Das Widerufzertifikat verdient einen ähnlich großen Schutz wie der Master-Key, da mit dem Widerrufzertifikat der GPG-Schlüssel dauerhaft außer Funktion gesetzt werden kann. Gelangt das Widerrufzertifikat in die falschen Hände, so kann das fast genauso große Kopfschmerzen bereiten wie ein gestohlener Master-Key.

Der GnuPG-Key ist nun vollständig erzeugt und muss exportiert werden, um ihn sicher auf dem dafür bestimmten USB-Stick zu speichern:

me@ubuntu:/mnt/gpg$ gpg --export-secret-keys --armor markus@mustermann.de > markus@mustermann.de.private.full.gpg-key
me@ubuntu:/mnt/gpg$ gpg --export --armor markus@mustermann.de > markus@mustermann.de.public.gpg-key

Sowohl alle Private-Keys (inkl. des Master-Keys) als auch die Public-Keys sind jetzt auf dem USB-Stick. Wie anfangs erläutert, möchte man allerdings den Verlust des Master-Keys vermeiden und braucht ihn auch nur noch, um Schlüssel zu zertifizieren. Die Unterschlüssel für Signatur, Verschlüsselung und Authentifizierung lassen sich wie folgt exportieren:

me@ubuntu:/mnt/gpg$ gpg --export-secret-subkeys --armor markus@mustermann.de > markus@mustermann.de.private.sub.gpg-key

Möchte man nun noch den lokalen Schlüsselring ebenfalls vom Master-Key befreien – was bei dem Live-System nicht notwendig ist – löscht man alle betreffenden Private-Keys und importiert die zuletzt exportierten Subkeys:

me@ubuntu:/mnt/gpg$ gpg --delete-secret-key markus@mustermann.de
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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.

sec  rsa4096/347F26084AA7CBC8 2018-12-12 Markus Mustermann <markus@mustermann.de>

Delete this key from the keyring? (y/N) y
This is a secret key! - really delete? (y/N) y

me@ubuntu:/mnt/gpg$ gpg --import markus@mustermann.de.private.sub.gpg-key

me@ubuntu:/mnt/gpg$ gpg --list-secret-keys
/home/me/.gnupg/pubring.kbx
------------------------
sec#  rsa4096 2018-12-12 [C]
6686B5D42B8BFC2A371C961D347F26084AA7CBC8
uid           [ unknown] Markus Mustermann <markus@mustermann.de>
ssb   rsa4096 2018-12-12 [S]
ssb   rsa4096 2018-12-12 [E]
ssb   rsa4096 2018-12-12 [A]

Hierbei bedeutet das Hashzeichen in sec#, dass der Private-Key für die Zertifizierung nicht vorhanden ist. Der GPG-Schlüssel beinhaltet demnach nur noch die Private-Keys für Signatur (S), Verschlüsselung (E) und Authentifizierung (A) sowie alle Public-Keys. Die Dateien mit der Endung .public.gpg-key und .private.sub.gpg-key beinhalten die „Arbeitsschlüssel“ für den täglichen Einsatz und sollten vom Live-System herunterkopiert werden, wenn kein Yubikey für ihre Speicherung verwendet werden soll. Das Herunterkopieren ist wichtig, damit der USB-Stick, der den Master-Key enthält, nicht in den PC gesteckt werden muss, wenn das übliche Betriebssystem läuft. Der Aufwand mit dem Live-System wäre sonst für die Katz.

Schritt 3) GPG-Schlüssel auf Yubikey laden

Der Yubico Yubikey (Generation 4 und 5) kommt mit einem OpenPGP-Applet, das es erlaubt, den Yubikey als OpenPGP-Smartcard zu benutzen. Es ist praktisch unmöglich, einen Private-Key, der sich auf einer Smartcard befindet wieder auszulesen. Alle Operationen laufen direkt auf der Smartcard ab. Ein Diebstahl des Schlüssels ist damit ausgeschlossen. 

Die in Schritt 2 erstellten drei Subkeys für Signierung, Verschlüsselung und Authentifizierung müssen dazu in die entsprechenden drei Slots im Yubikey geladen werden. Sollte der Yubikey neu sein, so ist die PIN 123456 und die Admin-PIN 12345678. Sollte das OpenPGP-Applet des Yubikeys schon einmal gebraucht worden sein, so sind die entsprechenden PINs zu benutzen. Sollte die PIN unbekannt sein, hilft nur noch ein Reset des Applets. Eine Anleitung dazu gibt es bei Yubico

Für den Zugriff auf den Yubikey werden noch einige Pakete benötigt, die auf dem Live-System nicht installiert sind. Sie können wie folgt installiert werden:

me@ubuntu:/mnt/gpg$ sudo add-apt-repository universe
me@ubuntu:/mnt/gpg$ sudo apt-get update
me@ubuntu:/mnt/gpg$ sudo apt-get install scdaemon pcscd yubikey-personalization

Danach kann der Yubikey eingesteckt werden und Linux sollte ihn erkennen:

me@ubuntu:/mnt/gpg$ gpg --card-status

Reader ...........: Yubico Yubikey 4 OTP U2F CCID 0
Application ID ...: D2760001240102010006070199840000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 07019984
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

Wurde der Yubikey erfolgreich erkannt, können die Schlüssel auf ihn übertragen werden:

me@ubuntu:/mnt/gpg$ gpg --edit-key markus@mustermann.de
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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.

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
ssb  rsa4096/D54438E4C9CE641E
     created: 2018-12-12  expires: never       usage: E
ssb  rsa4096/972402F085FAE45B
     created: 2018-12-12  expires: never       usage: A
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> key 1

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb* rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
ssb  rsa4096/D54438E4C9CE641E
     created: 2018-12-12  expires: never       usage: E
ssb  rsa4096/972402F085FAE45B
     created: 2018-12-12  expires: never       usage: A
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> keytocard
Please select where to store the key:
   (1) Signature key
   (3) Authentication key
Your selection? 1

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb* rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
ssb  rsa4096/D54438E4C9CE641E
     created: 2018-12-12  expires: never       usage: E
ssb  rsa4096/972402F085FAE45B
     created: 2018-12-12  expires: never       usage: A
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> key 1

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
ssb  rsa4096/D54438E4C9CE641E
     created: 2018-12-12  expires: never       usage: E
ssb  rsa4096/972402F085FAE45B
     created: 2018-12-12  expires: never       usage: A
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> key 2

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
ssb* rsa4096/D54438E4C9CE641E
     created: 2018-12-12  expires: never       usage: E
ssb  rsa4096/972402F085FAE45B
     created: 2018-12-12  expires: never       usage: A
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> keytocard
Please select where to store the key:
   (2) Encryption key
Your selection? 2

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
ssb* rsa4096/D54438E4C9CE641E
     created: 2018-12-12  expires: never       usage: E
ssb  rsa4096/972402F085FAE45B
     created: 2018-12-12  expires: never       usage: A
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> key 2

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
ssb  rsa4096/D54438E4C9CE641E
     created: 2018-12-12  expires: never       usage: E
ssb  rsa4096/972402F085FAE45B
     created: 2018-12-12  expires: never       usage: A
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> key 3

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
ssb  rsa4096/D54438E4C9CE641E
     created: 2018-12-12  expires: never       usage: E
ssb* rsa4096/972402F085FAE45B
     created: 2018-12-12  expires: never       usage: A
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> keytocard
Please select where to store the key:
   (3) Authentication key
Your selection? 3

sec  rsa4096/347F26084AA7CBC8
     created: 2018-12-12  expires: never       usage: C
     trust: ultimate      validity: ultimate
ssb  rsa4096/4AEDE9D9F0CEA817
     created: 2018-12-12  expires: never       usage: S
ssb* rsa4096/D54438E4C9CE641E
     created: 2018-12-12  expires: never       usage: E
ssb  rsa4096/972402F085FAE45B
     created: 2018-12-12  expires: never       usage: A
[ultimate] (1). Markus Mustermann <markus@mustermann.de>

gpg> quit

Nachfolgend kann man noch den Status  des Yubikeys prüfen:

me@ubuntu:/mnt/gpg$ gpg --card-status

Reader ...........: Yubico Yubikey 4 OTP U2F CCID 00 00
Application ID ...: D2760001240102010006070199840000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 07019984
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: A071 6851 79A9 1E7A 14D8  92EB 4AED E9D9 F0CE A817
      created ....: 2018-12-13 08:45:24
Encryption key....: B5CB 89C7 7486 28BF E014  2D03 D544 38E4 C9CE 641E
      created ....: 2018-12-13 08:45:43
Authentication key: 4203 600C 1E2D E711 B9BC  0086 9724 02F0 85FA E45B
      created ....: 2018-12-13 08:50:03
General key info..: sub  rsa4096/4AEDE9D9F0CEA817 2018-12-13 Markus Mustermann <markus@mustermann.de>
sec   rsa4096/347F26084AA7CBC8  created: 2018-12-13  expires: never     
ssb   rsa4096/4AEDE9D9F0CEA817  created: 2018-12-13  expires: never     
ssb   rsa4096/D54438E4C9CE641E  created: 2018-12-13  expires: never     
ssb   rsa4096/972402F085FAE45B  created: 2018-12-13  expires: never 

Abschließend können noch zusätzliche Informationen über den Besitzer des Yubikeys hinterlegt werden, die bei Verlust helfen könnten, den Besitzer zu finden. Ferner sollten auch die PIN und die Admin-PIN geändert werden, um es bei einem Diebstahl dem Dieb nicht zu leicht zu machen, den Yubikey zum Laufen zu bekommen. Optional, aber empfehlenswert, ist es auch, den öffentlichen Schlüssel auf einem Webserver zum Download bereitzustellen. Das sollte aber nur über HTTPS möglich sein, da bei HTTP die Möglichkeit besteht, über einen Man-in-the-Middle-Angriff einen falschen Schlüssel einzuschleusen.

me@ubuntu:/mnt/gpg$ gpg --edit-card

Reader ...........: Yubico Yubikey 4 OTP U2F CCID 00 00
Application ID ...: D2760001240102010006070199840000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 07019984
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: A071 6851 79A9 1E7A 14D8  92EB 4AED E9D9 F0CE A817
      created ....: 2018-12-13 08:45:24
Encryption key....: B5CB 89C7 7486 28BF E014  2D03 D544 38E4 C9CE 641E
      created ....: 2018-12-13 08:45:43
Authentication key: 4203 600C 1E2D E711 B9BC  0086 9724 02F0 85FA E45B
      created ....: 2018-12-13 08:50:03
General key info..: sub  rsa4096/4AEDE9D9F0CEA817 2018-12-13 Markus Mustermann <markus@mustermann.de>
sec   rsa4096/347F26084AA7CBC8  created: 2018-12-13  expires: never     
ssb   rsa4096/4AEDE9D9F0CEA817  created: 2018-12-13  expires: never     
ssb   rsa4096/D54438E4C9CE641E  created: 2018-12-13  expires: never     
ssb   rsa4096/972402F085FAE45B  created: 2018-12-13  expires: never 

gpg/card> admin
Admin commands are allowed

gpg/card> passwd
gpg: OpenPGP card no. D2760001240102010006070199840000 detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 3
PIN changed.

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? 1
PIN changed.

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection? q

gpg/card> name
Cardholder's surname: Mustermann
Cardholder's given name: Markus

gpg/card> lang
Language preferences: de

gpg/card> url
URL to retrieve public key: https://mustermann.de/markus.mustermann.gpg

gpg/card> sex
Sex ((M)ale, (F)emale or space): m

gpg/card> list

Reader ...........: Yubico Yubikey 4 OTP U2F CCID 00 00
Application ID ...: D2760001240102010006070199840000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 07019984
Name of cardholder: Markus Mustermann
Language prefs ...: de
Sex ..............: male
URL of public key : https://mustermann.de/markus.mustermann.gpg
Login data .......: [not set]
Signature PIN ....: not forced
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: A071 6851 79A9 1E7A 14D8  92EB 4AED E9D9 F0CE A817
      created ....: 2018-12-13 08:45:24
Encryption key....: B5CB 89C7 7486 28BF E014  2D03 D544 38E4 C9CE 641E
      created ....: 2018-12-13 08:45:43
Authentication key: 4203 600C 1E2D E711 B9BC  0086 9724 02F0 85FA E45B
      created ....: 2018-12-13 08:50:03
General key info..: sub  rsa4096/4AEDE9D9F0CEA817 2018-12-13 Markus Mustermann <markus@mustermann.de>
sec   rsa4096/347F26084AA7CBC8  created: 2018-12-13  expires: never     
ssb   rsa4096/4AEDE9D9F0CEA817  created: 2018-12-13  expires: never     
ssb   rsa4096/D54438E4C9CE641E  created: 2018-12-13  expires: never     
ssb   rsa4096/972402F085FAE45B  created: 2018-12-13  expires: never 

gpg/card> quit

Optional kann der Yubikey nun noch so eingestellt werden, dass er – zusätzlich zur PIN – einen Druck auf seinen Knopf erwartet, um eine Krypto-Operation freizugeben. Dieses Verhalten hilft, sich gegen Malware zu schützen, die sonst den mit der PIN freigeschalteten Yubikey benutzen könnte, ohne dass der Besitzer es weiß. Für Yubikey 4 gibt es Yubitouch, ein kleines Tool, mit dem man dieses Feature aktivieren kann. Folgendes lädt das Yubitouch-Skript von Github und aktiviert die Touch-Funktionalität für Signatur (sig), Entschlüsselung (dec) und Authentifizierung (aut). Abschließend wird das Feature fixiert, so dass es – außer durch Import eines neuen Private Keys – nicht mehr verändert werden kann:

me@ubuntu:/mnt/gpg$ cd ~

me@ubuntu:~$ sudo apt-get update -y &amp;&amp; sudo apt-get install -y git

me@ubuntu:~$ git clone https://github.com/a-dma/yubitouch
Cloning into 'yubitouch'...
remote: Enumerating objects: 21, done.
remote: Total 21 (delta 0), reused 0 (delta 0), pack-reused 21
Unpacking objects: 100% (21/21), done.

me@ubuntu:~$ cd yubitouch

me@ubuntu:~$ ./yubitouch.sh sig on <Admin PIN>
All done!
me@ubuntu:~$ ./yubitouch.sh dec on <Admin PIN>
All done!
me@ubuntu:~$ ./yubitouch.sh aut on <Admin PIN>
All done!
me@ubuntu:~$ ./yubitouch.sh sig fix <Admin PIN>
All done!
me@ubuntu:~$ ./yubitouch.sh dec fix <Admin PIN>
All done!
me@ubuntu:~$ ./yubitouch.sh aut fix <Admin PIN>
All done!

Schritt 4) Veröffentlichung des GPG-Schlüssels

Bisher sind alle Aktionen auf dem lokalen Live-System passiert. Um nun der Welt den neuen öffentlichen GPG-Schlüssel zu präsentieren, bietet sich die Veröffentlichung über einen Keyserver an. Da der erzeugte Schlüssel noch Teil des Schlüsselbunds (Keyrings) ist, geht das einfach mittels:

me@ubuntu:/mnt/gpg$ gpg --keyserver certserver.pgp.com --send-key markus@mustermann.de

Man kann die explizite Angabe des Keyservers auch weglassen und GPG die Wahl eines Defaultservers aus dem Pool überlassen.

Resümee

An diesem Punkt sind wir fertig und haben folgendes erreicht:

  • GPG-Schlüssel mit RSA-4096 in einer sicheren Umgebung erstellt, separate Unterschlüssel für…
    • Signierung
    • Verschlüsselung
    • Authentifizierung
  • Schlüssel auf einem isolierten USB-Stick gespeichert
  • Yubikey zur sicheren Verwendung der Schlüssel im Alltag betankt
  • Schlüssel auf öffentlichen Schlüsselserver geladen

Das Live-System kann heruntergefahren werden. Die USB-Sticks erst im ausgeschalteten Zustand abziehen, da unter Umständen noch nicht alle Daten geschrieben sind. Der USB-Stick mit dem Master-Key sollte gut verwahrt werden (Stahlkassette, Tresor, Bankschließfach u.ä). Das Widerrufzertifikat sollte man ebenfalls gut wegschließen, am besten aber an einem anderen Ort als den Master-Key, da andernfalls mit dem Verlust des Master-Keys auch dessen Widerrufzertifikat weg wäre.


Happy Crypting!