25 Min. Lesezeit

Ok, PGP-Basiswissen ist da, das Setup glänzt und wir signieren und verschlüsseln täglich E-Mails, wie die Weltmeister. Jedoch: Die Schlüssel sind nicht mobil und sicher abgelegt. Für den Gebrauch auf anderen Geräten, muss man sie umständlich und auf unsicherem Weg kopieren. Mit OpenPGP-Cards geht das besser. Am Beispiel eines YubiKey NEO werde ich zeigen, worauf es dabei ankommt.

Dieser Artikel ist Teil der Serie "OpenPGP im Berufsalltag". Du möchtest auch die anderen Artikel lesen? Hier geht es zur Übersicht.

Was ist ein YubiKey?

Ein YubiKey ist ein sogenannter Security-Token. Das ist ein kleines Gerät mit (zumeist) USB-Anschluss, das verschiedene Sicherheitsfunktionen bietet. Hauptsächlich werden diese Token für die Absicherung von Benutzerkonten mittels Zwei-Faktor-Authentifizierung (2FA) benutzt.

Dazu gibt es verschiedene Industriestandards, von denen ein Token mehrere unterstützen kann, um flexibel zu sein. Die Hersteller konkurrieren dabei um das beste Produkt, nicht um den besten Standard.

Der YubiKey wird von der schwedischen Firma Yubico hergestellt. Ein ähnliches Konkurrenzprodukt ist z. B. der Nitrokey

YubiKey-4-keychain-and-YubiKey-4-NanoBy Yubico [CC BY-SA 4.0  (https://creativecommons.org/licenses/by-sa/4.0)], from Wikimedia Commons

Was ist eine OpenPGP-Card?

Eine OpenPGP-Card ist im Wesentlichen ein elektronisches Gerät, das OpenPGP-Schlüssel speichern und alle notwendigen kryptographischen Operationen durchführen kann. Es gibt sogar einen Industriestandard dafür. Neben ihren 2FA-Funktionen, implementieren einige YubiKeys auch den OpenPGP-Card-Standard. Das werden wir im Folgenden nutzen, um unsere Schlüssel mobil und gleichzeitig sicherer zu machen.

Doch wie nutzt man eine OpenPGP-Card? Kurz und gut: Sie ist ein OpenPGP-Schlüssel für die Hosentasche, mit dem wir die folgenden Vorteile erreichen wollen:

  • Das Schlüsselpaar ist an genau einem Ort gespeichert.
  • Es kann nicht kopiert oder manipuliert werden.
  • Es ist mit mehreren (mobilen) Geräten verwendbar.

YubiKey einrichten

Weil der YubiKey den Standard OpenPGP-Card unterstützt, sollte er ohne die Einrichtung von Software oder Treibern auf jeder Plattform funktionieren, die eine funktionierende OpenPGP-Installation hat, die diesen Standard unterstützt. Das dürften derzeit alle gängigen gpg-Varianten für Windows, Mac und Linux sein. Auch OpenKeychain (siehe Teil 6 dieser Reihe) für Android unterstützt OpenPGP-Card.


Key-Status prüfen

Mit Hilfe des Kommandozeilen-Clients gpg kann man prüfen, ob der Key korrekt erkannt wird und funktioniert:

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


Dafür muss der Key natürlich eingesteckt sein. Eine weitere Voraussetzung ist, dass der Key den Verbindungsmodus CCID benutzt. Das sollte ab Werk der Fall sein. Prüfen und einstellen kann man das mit Hilfe des Tools NEO Manager. Es gibt noch andere Möglichkeiten, beispielsweise ein Python-Script oder über Echo+Libu2f.

neomanager

Unter Umständen kann es jedoch passieren, dass der Key nicht erkannt wird:

gpg --card-status
gpg: selecting openpgp failed: No such device
gpg: OpenPGP card not available: No such device


Das kann daran liegen, dass im System bereits ein sogenannter SmartCard-Reader konfiguriert wurde. Das ist zum Beispiel oft bei Notebooks der Fall, die einen SD-Card-Reader haben. In diesem Fall muss man den richtigen Card-Reader für OpenPGP konfigurieren – aber welcher ist das? Das kann man folgendermaßen herausfinden:

  • Füge zu <GPG_HOME>/scdaemon.conf folgende Zeilen hinzu:

    log-file c:\absolute\path\to\scdaemon.log
    debug-all
    
  • Beende den scdaemon mit gpgconf --kill scdaemon
  • Rufe nochmals gpg --card-status auf.
  • Öffne die Logfile. Sie enthält unter anderem:

    2018-08-16 14:48:11 scdaemon[13476] detected reader 'Alcor Micro USB Smart Card Reader 0'
    2018-08-16 14:48:11 scdaemon[13476] detected reader 'Yubico Yubikey NEO OTP+U2F+CCID 0' # This is the name of the correct reader.
    
  • Öffne <GPG_HOME>/scdaemon.conf erneut und setze folgenden Inhalt:

    card-timeout 30
    # This must match the reader's name from the scdaemon.log
    reader-port "Yubico Yubikey NEO OTP+U2F+CCID"
    
  • Beende den scdaemon mit gpgconf --kill scdaemon
  • Rufe nochmals gpg --card-status auf.

Der scdaemon ist einer der gpg-Hintergrunddienste (engl. daemon), der sich um die Kommunikation mit SmartCards (daher scdaemon) kümmert. Er muss neu gestartet werden, um Änderungen an seiner Konfigurationsdatei zu erkennen. Wird er beendet, startet ihn gpg beim ersten Gebrauch einer SmartCard-Funktionalität automatisch neu.

Nach einem Neustart des Services kann es unter Umständen sein, dass man den Key aus- und wieder einstecken muss, damit alles erkannt wird.

Yubikey personalisieren

Jetzt ist es möglich, einige individuelle Felder zu setzen.

Zunächst "öffnen" wir den Schlüssel zur Bearbeitung in der gpg-Kommandozeile:

gpg --card-edit
gpg/card> admin
Admin commands are allowed


PIN und Admin-PIN setzen

Der Key ist durch eine PIN (für normale Operationen) und durch eine Admin-PIN (für seltene, kritische Operationen) gesichert. Die Standard-PIN ist 123456 und die Standard-Admin-PIN 12345678. Die PGP-Schlüssel auf dem Gerät werden durch diese PINs gesichert. Sie spielen daher für Verschlüsselung und Signieren eine wichtige Rolle und sollten entsprechend sicher sein.

Wir setzen also beide PINs neu:

gpg/card> passwd
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>


Normale PINs müssen sechs Zeichen lang sein, Admin-PINs mindestens acht Zeichen. Obwohl laut Standard alle alphanumerischen ASCII-Zeichen erlaubt sind, hatte ich Probleme mit der Nutzung. Ich empfehle daher, ausschließlich Zahlen zu nutzen. Diese lassen sich auf Mobilgeräten auch leichter eingeben.

Aber Vorsicht: Der YubiKey zählt fehlgeschlagene PIN-Eingabeversuche mit Hilfe des sogenannten PIN retry counter (PIN-Eingabeversuchszähler), der Bestandteil der Übersicht (gpg --card-status oder Kommando list in der gpg-Shell) ist:

PIN retry counter : 3 3 3 # Will be 3 0 3 on a YubiKey 4


Zu Erklärung übersetze ich hier aus der gpg-Dokumentation:

"Dieses Feld speichert die Anzahl an übrigen Eingabeversuchen für die PIN. Die Werte werden heruntergezählt, wenn eine falsche PIN eingegeben wird. Sie werden zurückgesetzt, wenn eine korrekte Admin-PIN eingegeben wird. Die erste und die zweite Zahl stehen für die PIN. gpg stellt sicher, dass diese Zahlen immer gleich sind. Die zweite Zahl existiert ausschließlich wegen der Besonderheiten des ISO-7816-Standards. [...] Die dritte Zahl steht für den Retry-Counter der Admin-PIN."


YubiKey entsperren durch Zurücksetzen

Eine gesperrte PIN kann man mit der Admin-PIN entsperren. Eine gesperrte Admin-PIN muss durch ein Zurücksetzen des OpenPGP-Plugins auf dem YubiKey "behoben" werden. Dazu kann man folgendes Script nutzen, das im Original auf GitHub zu finden ist. Aber Vorsicht: Das Zurücksetzen, löscht auch die PGP-Schlüssel.

#!/bin/sh

gpg-connect-agent <<EOF
/hex
scd serialno
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 81 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 20 00 83 08 40 40 40 40 40 40 40 40
scd apdu 00 e6 00 00
scd apdu 00 44 00 00
/echo Yubikey has been successfully reset.
/echo All OpenPGP keys have been deleted. PINs have been reset to factory defaults. /echo The factory default PINs are 123456 (user) and 12345678 (admin). EOF


Man spricht in diesem Fall sozusagen in Maschinensprache mit dem Key. Das Script kann unter Windows mit Hilfe der git-bash ausgeführt werden.

Update Juni 2019: Mittlerweile habe ich das Script im Rahmen von yubiset nach “Batch” portiert. Damit kann man es auch ohne die git-bash mit Windows-Bordmitteln ausführen.

Aber Vorsicht: Das Script funktioniert für YubiKey 4 und YubiKey NEO. Für andere YubiKeys könnten die Werte verschieden sein. Da sollte man vorher lieber googlen, um sicher zu gehen. Ein Rücksetzen ist auch mit den Tools von Yubico möglich.

Optionale Felder setzen

Alle Felder, außer denen für die PINs und denen für die PGP-Schlüssel, sind freiwilliger Natur. Sie können später benutzt werden, um beispielsweise die Inhaberin zu identifizieren und damit mehrere YubiKeys auf einfache Weise auseinanderhalten zu können.

Es gibt natürlich auch Anwendungsfälle, wo genau dies nicht gewünscht ist. Aus diesem Grund ist das Ausfüllen der Felder absolut freiwillig. Die Daten existieren nur auf dem Key, werden technisch nicht weiterverarbeitet und werden auch für die tägliche Arbeit nicht gebraucht.

Das Feld url sollte man aber unbedingt setzen. Warum, werde ich später noch erklären.

Dieses Feld soll eine URL enthalten, die zum eigenen öffentlichen Schlüssel führt, d. h. einem erreichbaren Endpunkt, der den öffentlichen Schlüssel als Klartext im OpenPGP-Format zurückliefert. Das kann man entweder so, wie im unteren Beispiel, über die öffentlich zugängliche Schnittstelle eines Schlüsselservers machen, oder aber, man lädt einen Klartextexport des Schlüssels auf einen eigenen Server und benutzt diesen zum Download.

Meinen Schlüssel kann man beispielsweise über einen Schlüsselserver abrufen: https://sks-keyservers.net/pks/lookup?op=get&search=0x37F0780907ABEF78. Hinter dem letzten = muss man einfach die entsprechende Schlüssel-ID setzen. Ruft man diese URL in einem Browser auf, erhält man:

pubkey


Wir setzen also die URL und die restlichen optionalen Felder:

gpg/card> url
URL to retrieve public key: https://sks-keyservers.net/pks/lookup?op=get&search=0x37F0780907ABEF78 gpg/card> name Cardholder's surname: Mosig Cardholder's given name: Jan gpg/card> lang Language preferences: de gpg/card> login # This is the PGP key's primary user ID Login data (account name): jan.mosig@itemis.de gpg/card> sex Sex ((M)ale, (F)emale or space): m gpg/card>


Der YubiKey ist jetzt fertig vorbereitet:

gpg/card> list
Reader ...........: Yubico Yubikey NEO OTP U2F CCID 0      # Name of the SmartCard reader device.
Application ID ...: D2760001240102000006063538460000       # The manufacture's ID.
Version ..........: 2.0                                    # The used OpenPGP specification.
Manufacturer .....: Yubico                                 # "card" manufacturer.
Serial number ....: 06353846                               # "card's" unique serial number.
Name of cardholder: Jan Mosig                              # Name and family name of owner.
Language prefs ...: de                                     # Owner's native language.
Sex ..............: male                                   # Owner's sex.
URL of public key : https://sks-keyservers.net/pks/lookup  # Where to get pub key from.
?op=get&search=0x37F0780907ABEF78  
Login data .......: jan.mosig@itemis.de                    # Owner's user account. Should match the OpenPGP key's primary user id.
Signature PIN ....: forced                                 # Always force a PIN on signature operations.
Key attributes ...: rsa2048 rsa2048 rsa2048                # YubiKey supports three rsa keys of 2048bit each.
Max. PIN lengths .: 127 127 127                            # PIN & AdminPIN may be no longer than 127 characters (ASCII).
PIN retry counter : 3 3 3                                  # PIN, PIN (sync), AdminPIN attempts left.
Signature counter : 0                                      # Nbr. of signatures perforemd with this key.
Signature key ....: [none]                                 # OpenPGP key for sign (S).
Encryption key....: [none]                                 # OpenPGP key for encrypt (E).
Authentication key: [none]                                 # OpenPGP key for auth (A).
General key info..: [none]                                 # Primary user id of OpenPGP key (if available).
gpg/card> quit # Save and return to OS command line.


Für die Bedeutung der einzelnen Felder, siehe auch die GNU PG Dokumentation. Wenn man genau hinsieht, bemerkt man jetzt auch, warum wir in Teil 4 "nur" 2048bit lange Unterschlüssel generiert haben. Der YubiKey NEO unterstützt einfach keine längeren Schlüssel. Der YubiKey 4 hingegen kann auch mit 4096 bit langen Schlüsseln umgehen. Warum es aber unbedingt einen NEO braucht (oder warum nicht), erkläre ich weiter unten.

Update September 2018: Mittlerweile hat Yubico die 5. Serie der YubiKeys veröffentlicht. Der NEO heißt jetzt YubiKey 5 NFC und unterstützt RSA 4096. Sollte man den Einsatz der Schlüssel auf diesem Gerät planen, kann man auch für die Unterschlüssel 4096 bit Länge einstellen. Die prinzipiellen Nachteile eines längeren Schlüssels gelten natürlich immer noch. Die tatsächlichen Einbußen dürften sich aber in der Praxis kaum auswirken.

Schlüssel exportieren

Jetzt geht es ans Eingemachte. Die geheimen Unterschlüssel (siehe Teil 4) müssen einer nach dem anderen auf den YubiKey exportiert werden. Zur Erinnerung: Der geheime Schlüsselring sollte so aussehen:

gpg -K
--------------------------------------
sec#  rsa4096/0x37F0780907ABEF78 2018-04-06 [C] [expires: 2019-04-06]       # 4096bit master key
      Key fingerprint = 6AA5 1DE4 2448 71E8 6C62  3672 37F0 7809 07AB EF78  # note the "#" behind "sec" -> key not in keyring
uid                   [ultimate] Jan Mosig <jan.mosig@itemis.de>            # primary user id
uid                   [ultimate] Jan Mosig <mosig@itemis.de>                # secondary user id
ssb   rsa2048/0xD40682450D56A765 2018-06-16 [E] [expires: 2019-04-06]       # 2048bit subkey (E)ncrypt
ssb   rsa2048/0x5B7CC3CB8C21B4BB 2018-06-16 [S] [expires: 2019-04-06]       # 2048bit subkey (S)ign
ssb   rsa2048/0x9476C6C66AC23C1D 2018-06-16 [A] [expires: 2019-04-06]       # 2048bit subkey (A)uth


Um den Schlüssel zu exportieren, müssen wir ihn im "Expertenmodus" editieren. Dazu fügt man die Option --expert zum Kommando gpg --edit-key <KEY_ID> hinzu:

gpg --expert --edit-key 0x37F0780907ABEF78
gpg (GnuPG) 2.2.7; Copyright (C) 2018 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 subkeys are available.

pub  rsa4096/0x37F0780907ABEF78
     created: 2018-04-06  expires: 2019-04-06  usage: C
     trust: ultimate      validity: ultimate
ssb  rsa2048/0xD40682450D56A765
     created: 2018-06-16  expires: 2019-04-06  usage: E
ssb  rsa2048/0x5B7CC3CB8C21B4BB
     created: 2018-06-16  expires: 2019-04-06  usage: S
ssb  rsa2048/0x9476C6C66AC23C1D
     created: 2018-06-16  expires: 2019-04-06  usage: A
[ultimate] (1). Jan Mosig <jan.mosig@itemis.de>
[ultimate] (2)  Jan Mosig <mosig@itemis.de>

gpg>


Das Exportieren funktioniert dann so:

  • Man selektiert einen Unterschlüssel mit key n. n kann einen Wert von 1-3 haben.
  • Man ruft keytocard auf. Der Schlüssel wird automatisch in den passenden Slot des YubiKeys exportiert.

Beim ersten Unterschlüssel sieht das beispielsweise so aus:

gpg> key 1
pub  rsa4096/0x37F0780907ABEF78
     created: 2018-04-06  expires: 2019-04-06  usage: C
     trust: ultimate      validity: ultimate
ssb* rsa2048/0xD40682450D56A765                         # Note the "*" which indicates "selected".
     created: 2018-06-16  expires: 2019-04-06  usage: E
ssb  rsa2048/0x5B7CC3CB8C21B4BB
     created: 2018-06-16  expires: 2019-04-06  usage: S
ssb  rsa2048/0x9476C6C66AC23C1D
     created: 2018-06-16  expires: 2019-04-06  usage: A
[ultimate] (1). Jan Mosig <jan.mosig@itemis.de>
[ultimate] (2)  Jan Mosig <mosig@itemis.de>

gpg> keytocard
Please select where to store the key:
   (2) Encryption key                                   # Only one slot matches of course.
Your selection? 2
pub  rsa4096/0x37F0780907ABEF78
     created: 2018-04-06  expires: 2019-04-06  usage: C
     trust: ultimate      validity: ultimate
ssb* rsa2048/0xD40682450D56A765                         # Note the "*" which indicates "selected".
     created: 2018-06-16  expires: 2019-04-06  usage: E
ssb  rsa2048/0x5B7CC3CB8C21B4BB
     created: 2018-06-16  expires: 2019-04-06  usage: S
ssb  rsa2048/0x9476C6C66AC23C1D
     created: 2018-06-16  expires: 2019-04-06  usage: A
[ultimate] (1). Jan Mosig <jan.mosig@itemis.de>
[ultimate] (2)  Jan Mosig <mosig@itemis.de>
gpg>


Sollte man sich "verwählt" haben, so kann durch erneute Eingabe von key n die Auswahl aufgehoben werden.

Die Operation keytocard verlangt die Eingabe der Passphrase und der AdminPIN. Sind beide korrekt, wird der Schlüssel exportiert. So verfahren wir jetzt auch mit den anderen beiden Schlüsseln.

gpg> key 1                              # Deselect key 1.
...
gpg> key 2                              # Select key 2.
...
gpg> keytocard
Please select where to store the key:
   (1) Signature key
   (3) Authentication key
Your selection? 1
# Since key 2 is a signature key (notice "usage: S" behind its details)
# We choose "1" of course.
...
gpg> key 2                              # Deselect key 2.
...
gpg> key 3                              # Select key 3.
...
gpg> keytocard
Please select where to store the key:
   (3) Authentication key
Your selection? 3
...
gpg> key 3                              # Deselect key 3.
...
gpg> save                               # Save and quit.


Die Schlüssel befinden sich jetzt auf dem YubiKey. Ein Blick in den lokalen Schlüsselbund bestätigt dies:

gpg -K
--------------------------------------
sec#  rsa4096/0x37F0780907ABEF78 2018-04-06 [C] [expires: 2019-04-06]       # Master key does not exist in keyring.
      Key fingerprint = 6AA5 1DE4 2448 71E8 6C62  3672 37F0 7809 07AB EF78
uid                   [ultimate] Jan Mosig <jan.mosig@itemis.de>
uid                   [ultimate] Jan Mosig <mosig@itemis.de>
ssb>  rsa2048/0xD40682450D56A765 2018-06-16 [E] [expires: 2019-04-06]       # The ">" indicates that the key has
ssb>  rsa2048/0x5B7CC3CB8C21B4BB 2018-06-16 [S] [expires: 2019-04-06]       # Been replaced by a stub. The stub
ssb>  rsa2048/0x9476C6C66AC23C1D 2018-06-16 [A] [expires: 2019-04-06]       # tells gpg where to find the real key.


Die Schlüssel wurden also durch sogenannte Platzhalter (engl. stub) ersetzt. Die Stubs sagen gpg, wo der richtige Schlüssel liegt und zwar auf dem YubiKey.

Update Juni 2019: Für den gesamten Vorgang von der Schlüsselgenerierung über die Einrichtung des Yubikeys bis hin zum Bewegen der Unterschlüssel auf den Yubikey, habe ich einige Scripte auf GitHub abgelegt, die alles so weit möglich automatisieren und damit einfacher machen sollen. Das Projekt heißt yubiset.

Was bringt der Einsatz von YubiKey?

Der große Vorteil liegt darin, dass die Schlüssel mobil und trotzdem sicherer aufbewahrt werden. Eine OpenPGP-Card bietet keine Möglichkeit in Hardware oder Software, den Schlüssel auszulesen, es gibt einfach keine Schnittstelle dafür. Ein Angreifer kann sie also nicht virtuell stehlen.

Ein physischer Diebstahl des YubiKeys ist möglich, allerdings sind die Schlüssel dann immer noch durch eine PIN geschützt, die man nur 3x falsch eingeben kann.

Wie funktioniert jetzt aber das Signieren und Verschlüsseln? Ganz einfach: Anstatt die Berechnungen selbst durchzuführen, sendet gpg einfach entsprechende Befehle an den YubiKey, beispielsweise "Entschlüssele mir folgenden Text". Die eigentlichen kryptographischen Operationen führt der YubiKey selbst durch. Dadurch müssen die Schlüssel das Gerät nie verlassen.

Es ist sogar möglich, die Schlüssel direkt auf dem YubiKey zu erzeugen. In diesem Fall haben sie nie die Außenwelt gesehen und sind nie der Gefahr eines virtuellen Diebstahls ausgesetzt. Vielleicht erkläre ich diese Variante einmal in einem späteren Artikel.

Ein Nachteil ist die eingeschränkte Rechenkraft eines so kleinen Gerätes. Je länger die Schlüssel sind, desto mehr Zeit benötigen Kryptooperationen. Aus diesem Grund ist die Wahl der Schlüssellänge also nicht nur eine Frage der Sicherheit, sondern auch der Praxistauglichkeit. Schließlich möchte niemand allzu lang auf entschlüsselte Texte oder signierte E-Mails warten.

YubiKey mit Thunderbird und Enigmail

Zur Nutzung mit Thunderbird und Enigmail muss man nichts weiter machen. Weil Enigmail im Wesentlichen ein grafisches Frontend für gpg ist, kann es auch automatisch den YubiKey nutzen. Neu ist nur, dass statt der Aufforderung zur Eingabe einer Passphrase, jetzt eine Aufforderung zur Eingabe der PIN erscheint.

pin_thunderbird


Nach Eingabe der PIN funktionieren Verschlüsselung und Signatur wie in Teil 5 beschrieben.

Schlüssel auf anderen Geräten nutzen (USB)

Achtung, Manege frei für ein wahres Kunststück. Anstatt seinen Schlüssel umständlich von Hand auf verschiedene Geräte kopieren zu müssen, können wir jetzt mit einem einzigen simplen Befehl jedes mit OpenPGP-Card-Unterstützung ausgestattete Gerät – also z. B. einen PC mit gpg – mit unseren Schlüsseln versorgen – und das ohne, dass der Schlüssel den YubiKey jemals verlassen oder es mehrere Kopien davon geben muss.

gpg -K
<GPG_HOME>/pubring.kbx
--------------------------------------
                                                        # Keyring is empty.
gpg --edit-card                                         # Automatically creates necessary stubs. 
Reader ...........: Yubico Yubikey NEO OTP U2F CCID 0
Application ID ...: D2760001240102000006063538460000
Version ..........: 2.0
Manufacturer .....: Yubico
Serial number ....: 06353846
Name of cardholder: Jan Mosig
Language prefs ...: de
Sex ..............: männlich
URL of public key : https://sks-keyservers.net/pks/lookup?op=get&search=0x37F0780907ABEF78
Login data .......: jan.mosig@itemis.de
Signature PIN ....: zwingend
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN ret
ry counter : 3 3 3
Signature counter : 0
Signature key ....: D7AB 286D 68AB F9BB 0EA4  E7C7 5B7C C3CB 8C21 B4BB
      created ....: 2018-06-16 20:26:24
Encryption key....: 2A4C 56FF D2E7 45A8 F20C  9D77 D406 8245 0D56 A765
      created ....: 2018-06-16 20:24:02
Authentication key: 1579 B922 68CB EB87 4864  F4C1 9476 C6C6 6AC2 3C1D
      created ....: 2018-06-16 20:27:21
General key info..: sub  rsa2048/0x5B7CC3CB8C21B4BB 2018-06-16 Jan Mosig <jan.mosig@itemis.de>
sec#  rsa4096/0x37F0780907ABEF78  erzeugt: 2018-04-06  verfällt: 2019-04-06
ssb#  rsa4096/0x82AF300A5B9A49F5  erzeugt: 2018-04-06  verfällt: 2019-04-06
ssb#  rsa4096/0xCE17256FB5C98A0F  erzeugt: 2018-04-06  verfällt: 2019-04-06
ssb#  rsa4096/0xF0AA7B5E7B4C6549  erzeugt: 2018-04-06  verfällt: 2019-04-06
ssb>  rsa2048/0xD40682450D56A765  erzeugt: 2018-06-16  verfällt: 2019-04-06
                                  Kartennummer:0006 06353846
ssb>  rsa2048/0x5B7CC3CB8C21B4BB  erzeugt: 2018-06-16  verfällt: 2019-04-06
                                  Kartennummer:0006 06353846
ssb>  rsa2048/0x9476C6C66AC23C1D  erzeugt: 2018-06-16  verfällt: 2019-04-06
                                  Kartennummer:0006 06353846
# Now fetch our public key via the configured url
gpg/card> fetch                                     
gpg: requesting key from 'https://sks-keyservers.net/pks/lookup?op=get&search=0x37F0780907ABEF78'
gpg: key 0x37F0780907ABEF78: 2 signatures not checked due to missing keys
gpg: key 0x37F0780907ABEF78: "Jan Mosig <jan.mosig@itemis.de>" not changed
gpg: Total number processed: 1
gpg:              unchanged: 1

gpg/card> quit
# done


Im Wesentlichen braucht es ausschließlich den Befehl gpg --card-status und die Schlüssel sind fertig konfiguriert – eine große Zeitersparnis und sehr praktisch. Im Beispiel wird auch der Sinn der Konfiguration des Felds URL auf dem YubiKey klar. Es dient als Voraussetzung für den Befehl gpg Shell-Befehl fetch, der den eigenen öffentlichen Schlüssel von der angegeben URL herunterlädt. Kein umständliches Jonglieren mit der Schlüssel-ID oder der Schlüsselserver-URL mehr.

Schlüssel auf mobilen Geräten nutzen (NFC)

Ok, super, wir können unsere Schlüssel leicht auf anderen Geräten konfigurieren. Allerdings nur, wenn diese Geräte über USB-Anschlüsse verfügen. Wie soll man den YubiKey mitsamt der PGP-Schlüssel aber auf einem Smartphone nutzen?

Zeit für das nächste Wunder. Das Zauberwort lautet: Near Field Communication, kurz NFC. Dabei handelt es sich um eine drahtlose Kommunikationstechnik, die per Induktion arbeitet und daher nur bei sich eng beieinander befindlichen Geräten funktioniert. Eine bekannte Anwendung dieser Technik ist das kontaktlose Bezahlen über das Auflegen des Smartphones oder der EC-Karte.

Hier wird klar, warum ich den YubiKey NEO benutze und nicht den günstigeren und kryptographisch etwas stärkeren YubiKey 4: Der NEO unterstützt NFC. Ich kann also den gleichen Key sowohl auf meinem Arbeitsrechner, als auch auf meinem Smartphone nutzen und zwar nicht nur für die OpenPGP-Kryptographie, sondern auch für die 2FA-Funktionen.

Update September 2018: Mittlerweile hat Yubico die 5. Serie der YubiKeys veröffentlicht. Der NEO heißt jetzt YubiKey 5 NFC.

Auf Android kann man den YubiKey mit Hilfe von OpenKeychain (siehe Teil 6) anbinden. Voraussetzung ist, dass das Smartphone NFC unterstützt. Ist das der Fall, braucht man nur den Anweisungen auf dem Bildschirm zu folgen:

  1. nfc_1

  2. okc_1

  3. okc_2

  4. okc_3

  5. okc_4

  6. okc_5

Damit sind die Schlüssel fertig konfiguriert. Auch hier werden nur Stubs eingerichtet. Die Schlüssel bleiben auf dem YubiKey. Für Verschlüsselung und Signatur via K-9 Mail wird jetzt die Eingabe der YubiKey-PIN anstelle der PGP-Passphrase gefordert. Die Datenübertragung funktioniert durch das Auflegen des YubiKeys auf das Smartphone. Die Kryptooperationen führt dann der YubiKey aus. Alles andere bleibt unverändert.

Es ist möglich, dass man die Stelle zum sauberen Anlegen des YubiKeys beim ersten Mal suchen muss, abhängig von dem Ort, an dem die NFC-Antenne verbaut wurde. Bei meinem Smartphone befindet sie sich am oberen Ende des Geräts.

In der Apple-Welt bieten theoretisch alle Geräte ab iOS 11 (iPhone 7 und darüber) Unterstützung für NFC und damit für den YubiKey.

Der Vollständigkeit halber sollte man noch erwähnen, dass es auch Nano-Varianten des YubiKeys gibt, die einen USB-C-Anschluss besitzen. Inwiefern diese mit den USB-C-Anschlüssen von Smartphones funktionieren, kann ich im Moment nicht sagen.

Ausblick

Damit haben wir bereits eine Menge erreicht. Nicht nur ein funktionierendes OpenPGP-Setup auf PC und auf Android, sondern auch eine einfache und dennoch sichere, sowie praxistaugliche Aufbewahrung für die Schlüssel mit Hilfe des YubiKey.

Im nächsten Artikel werde ich sozusagen das Kronjuwel dieser Serie zeigen: SSH-Zugriff auf einen entfernten Server mit OpenPGP-Schlüsseln, die auf einem YubiKey sicher abgelegt sind. Nie wieder extra SSH-Schlüssel generieren, verwalten und im entscheidenden Moment nicht bereit haben müssen. Das ist dann schon fast wie fliegen.

Kommentare