GnuPG-Schlüsselerstellung und Smartcard-Transfer – Nitrokey Teil2

1. SchlüsselmaterialGnuPG-Key

Ein Nitrokey unterstützt je nach Version unterschiedliche Anwendungsszenarien. Im vorliegenden Beitrag der Artikelserie »Nitrokey« beschreibe ich die Inbetriebnahme eines Nitrokeys unter GNU/Linux und die anschließende GnuPG-Schlüsselerstellung. Ein (RSA-)Schlüsselpärchen ist eine grundlegende Voraussetzung für die beiden Anwendungsszenarien OpenPGP/GnuPG-E-Mail-Verschlüsselung und OpenSSH-Public-Key-Authentifizierung.

Die dargestellte Vorgehensweise für die Erstellung eines (RSA-)Schlüsselpärchens und die anschließende Übertragung auf die Smartcard des Nitrokeys sollte ebenfalls auf andere Security-Tokens wie den YubiKey übertragbar sein.

Dieser Beitrag ist Teil einer Artikelserie:

2. Inbetriebnahme: Nitrokey

Die Inbetriebnahme eines Security-Tokens unterscheidet sich je nach Nitrokey-Variante und Betriebssystem voneinander. Auf der Nitrokey-Webseite findet ihr zu jedem Key und Betriebssystem eine entsprechende Installationsanleitung. Nachfolgend werde ich die Inbetriebnahme eines Nitrokey Storage unter Debian GNU/Linux beschreiben – die Anleitung lässt sich ebenfalls 1:1 auf den Nitrokey Pro übertragen.

Unterstütze den Blog mit einem Dauerauftrag!

Unabhängig. Kritisch. Informativ. Praxisnah. Verständlich.

Die Arbeit von kuketz-blog.de wird vollständig durch Spenden unserer Leserschaft finanziert. Sei Teil unserer Community und unterstütze unsere Arbeit mit einer Spende.

Mitmachen ➡

2.1 Notwendige Pakete installieren

Damit Debian GNU/Linux auf die Smartcard des Nitrokeys zugreifen kann, ist die Installation der libccid-Bibliothek erforderlich:

apt-get install libccid

In den Debian-Paketquellen wird das Programm zur Verwaltung der Nitrokeys ebenfalls bereitgestellt:

apt-get install nitrokey-app

2.2 Nutzer- und Admin-PIN ändern

Nach der Installation dieser beiden Pakete solltet ihr zunächst die Nutzer- sowie Admin-PIN ändern. Die Nutzer-PIN wird unter anderem dann abgefragt, wenn ihr bspw. innerhalb von Thunderbird eine verschlüsselte E-Mail öffnet, die dann unter Berücksichtigung des geheimen Schlüssels auf der Smartcard entschlüsselt werden soll. Die Admin-PIN wiederum benötigt ihr für diverse Operationen, wie der Übertragung von Schlüsselmaterial oder dem Zurücksetzen des Nitrokeys. Kurzum: Die Standardvorgaben »123456« (Nutzer-PIN) und »12345678« (Admin-PIN) solltet ihr zu eurem eigenen Schutz ändern.

Öffnet dazu die Nitrokey App und navigiert zu Menu -> Konfigurieren -> Benutzer-PIN ändern und Administrator-PIN ändern:

PIN ändern

3. (RSA-)Schlüsselmaterial

Eine notwendige Voraussetzung für die OpenPGP/GnuPG-E-Mail-Verschlüsselung und weitere Anwendungsszenarien ist das Public-Key-Verschlüsselungsverfahren. Bei diesem Konzept generiert ein Nutzer ein Schlüsselpaar, das aus einem geheimen Teil (privater Schlüssel) und einem nicht geheimen Teil (öffentlicher Schlüssel) besteht. Wer also verschlüsselte E-Mails auf Basis von GnuPG mit anderen Teilnehmern austauschen möchte, der muss sich zunächst ein Schlüsselpaar generieren.

Dieses Schlüsselpaar können wir entweder direkt auf dem Nitrokey generieren oder auf einem vertrauenswürdigen Rechner. Die Schlüsselgenerierung auf dem Nitrokey hat den Vorteil, dass der geheime, private Schlüssel niemals die Smartcard verlassen kann. Das bedeutet allerdings auch: Es können keine Backups von den Schlüsseln angefertigt werden. Bei Verlust oder Defekt des Nitrokeys sind die darauf befindlichen Schlüssel unweigerlich verloren – eine Entschlüsselung von E-Mails ist dann bspw. nicht mehr möglich. Insgesamt ist die Generierung des Schlüsselpärchens direkt auf dem Nitrokey die sicherste Variante, allerdings auch jene, die kein Backup des Schlüsselmaterials zulässt. Die Schlüsselerzeugung direkt auf dem Nitrokey wird in einer Anleitung auf der Nitrokey-Webseite ausführlich erklärt.

Persönlich empfehle ich die GnuPG-Schlüsselerstellung in einer »sicheren« Umgebung bzw. Computer durchzuführen, anstatt diese direkt auf dem Nitrokey zu generieren. Das bedeutet nicht nur mehr Flexibilität, sondern ermöglicht auch ein Backup der Schlüssel. Daher werde ich im Folgenden die Erstellung eines RSA-Schlüsselpärchens auf einem GNU/Linux-System erläutern.

Hinweis

Wer bereits ein GnuPG-Schlüsselpärchen erstellt hat, der sollte sich ein Backup der Schlüssel anlegen und kann anschließend zu Ziffer »5. Transfer auf den Nitrokey« springen.

3.1 Hauptschlüssel und Unterschlüssel: Einsatzzwecke

Ein RSA-Schlüsselpärchen besteht immer aus einem öffentlichen und einem geheimen (primären) Schlüssel. Den primären, geheimen Schlüssel (Hauptschlüssel) gilt es besonders zu schützen. Wenn er abhandenkommt, kann ein Angreifer neue Identitäten (UIDs) erstellen, gültige Schlüssel widerrufen und sich vollständig für den ursprünglichen Besitzer ausgeben.

Von einem primären Hauptschlüssel können Unterschlüssel (engl. Subkeys) abgeleitet werden. Sie verhalten sich wie normale Schlüssel, sind allerdings an das Hauptschlüsselpaar gebunden. Ein Unterschlüssel kann zum Signieren, Verschlüsseln oder zur Authentifizierung verwendet werden. Der Vorteil von Unterschlüsseln: Sie können unabhängig vom Hauptschlüssel widerrufen und auch getrennt davon gespeichert werden. Unterschlüssel sind quasi wie ein separates Schlüsselpaar, die logisch allerdings mit dem Hauptschlüsselpaar verknüpft sind.

Werfen wir mal einen Blick auf die unterschiedlichen Verwendungszwecke bzw. Fähigkeiten von privaten Schlüsseln:

  • Zertifizieren: Die Zertifizierungsfunktion ist im Normalfall an den Hauptschlüssel gebunden. Sie dient unter anderem der Erstellung neuer Identitäten (UIDs) oder der Veränderung bereits bestehender Schlüsseldaten. Weiterhin können damit andere öffentliche Schlüssel beglaubigt bzw. deren Echtheit bestätigt werden. Hintergrund ist das Web of Trust, um die Authentizität eines Schlüssels zu prüfen.
  • Verschlüsseln: Ein Schlüssel mit dieser Fähigkeit kann Nachrichten entschlüsseln, die mit dem dazu passenden öffentlichen Schlüssel verschlüsselt wurden. Der private Schlüssel kommt bspw. bei der E-Mail-Verschlüsselung zum Einsatz, bei der jemand mit eurem öffentlichen Schlüssel eine Nachricht an euch verschlüsselt. Da nur ihr den dazu passenden, privaten Schlüssel besitzt (Falltürfunktion), könnt ihr die Verschlüsselung wieder rückgängig machen.
  • Unterschreiben: Ein Schlüssel, der diese Fähigkeit besitzt, kann digitale Signaturen von Nachrichten erzeugen. Diese digitale Signatur kann bspw. an eine E-Mail angehängt werden. Der Absender kann damit zweifelsfrei beweisen, dass eine Nachricht von ihm stammt. Voraussetzung: Der Empfänger hat die Authentizität eines Schlüssels bzw. des Absenders bereits im Vorfeld geprüft.
  • Authentisierung: Diese Funktion wird im Rahmen des Challenge-Response-Protokolls verwendet und wird bspw. bei der OpenSSH-Public-Key-Authentifizierung verwendet. Ein Schlüssel mit dieser Fähigkeit wird also zur Authentifizierung der eigenen Identität eingesetzt.

Generell ist es von Vorteil, wenn ihr euch mit dem Konzept der asymmetrischen Verschlüsselung bzw. OpenPGP/GnuPG vor der Verwendung eures Schlüsselpärchens in der Praxis näher vertraut macht. Im vorliegenden Beitrag habe ich lediglich ein wenig vom elementaren Grundwissen angeschnitten.

3.2 Sichere Umgebung

Die initiale Erzeugung eines RSA-Schlüsselpärchens sollte innerhalb einer »sicheren« Umgebung erfolgen. Im Idealfall ist dies ein Rechner, der nicht mit dem Internet verbunden ist. Mein Vorschlag beinhaltet folgende Komponenten:

  • USB-Stick (ab 8 GB) mit Tails: Als Systemumgebung zur Erzeugung des Schlüsselpärchens eignet sich bspw. Tails. Im Wiki von Tails findet ihr entsprechende Anleitungen, um Tails auf einem bootfähigen USB-Stick zu installieren. Die Installationsanleitung beschreibt in einem optionalen ebenfalls die Erstellung eines verschlüsselten, persistenten Speichers. Dieser Speicherbereich auf dem USB-Stick ist verschlüsselt und zusätzlich durch ein Passwort geschützt. Er dient folgenden Anwendungszwecken:
    • Speicherung sensibler Daten
    • Zusätzliche Software
    • Lagerung von Verschlüsselungskeys
  • USB-Stick als Backup: Ablage der erzeugten Hauptschlüssel, Unterschlüssel und des Widerrufzertifikats

Nach der Erstellung des bootfähigen Tails-USB-Sticks wird das System von einem Rechner gebootet, der nicht mit dem Internet oder einem sonstigen Netzwerk verbunden ist – also vollständig »airgapped«. Anschließend wird der persistente Speicherbereich angelegt (optionaler Schritt), auf dem im Anschluss die Schlüssel erzeugt werden.

Je nach persönlichem Bedrohungsmodell (engl. threat model) kann die Erzeugung eines RSA-Schlüsselpärchens auch unter anderen Rahmenbedingungen erfolgen – letztendlich müsst ihr das für euch selbst entscheiden. Zum Vergleich: Auf einem Windows-XP-Gaming-Rechner, der allerlei Software installiert hat und auch noch mit dem Internet verbunden ist, könnt ihr die RSA-Schlüssel natürlich auch erstellen. Allerdings geht ihr hierbei auch ein erheblich höheres Risiko ein, dass der Schlüssel bereits bei der Erstellung kompromittiert bzw. von Dritten ausgelesen wird.

4. GnuPG-Schlüsselerstellung

Für die RSA-Schlüsselerzeugung benötigt ihr GnuPG (ab Version 2.0.22). Über eine Kommandozeile könnt ihr prüfen, welche Version bei euch eventuell schon vorinstalliert ist:

gpg --version

Ausgabe:

gpg (GnuPG) 2.2.12
libgcrypt 1.8.4
Copyright (C) 2018 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

4.1 Schlüsselgenerierung

Standardmäßig generiert GnuPG einen Hauptschlüssel mit den Funktionen

  • Zertifizieren und Unterschreiben
  • inklusive eines Unterschlüssels mit der Funktion Verschlüsseln.

Das werden wir so beibehalten, allerdings über den Expertenmodus einen weiteren Unterschlüssel mit der Funktion Authentisierung hinzufügen. Starten wir nun mit der geführten Schlüsselerzeugung:

gpg --full-generate-key --expert

Ausgabe:

gpg --full-generate-key --expert

Bitte wählen Sie, welche Art von Schlüssel Sie möchten:
   (1) RSA und RSA (voreingestellt)
   (2) DSA und Elgamal
   (3) DSA (nur signieren/beglaubigen)
   (4) RSA (nur signieren/beglaubigen)
   (7) DSA (Nutzung selber einstellbar)
   (8) RSA (Nutzung selber einstellbar)
  (9) ECC und ECC
  (10) ECC (nur signieren)
  (11) ECC (Nutzung selber einstellbar)
   (13) Vorhandener Schlüssel
Ihre Auswahl? 1
RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie? (3072) 4096
Die verlangte Schlüssellänge beträgt 4096 Bit
RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie für den Unterschlüssel? (3072) 4096
Die verlangte Schlüssellänge beträgt 4096 Bit
Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
         0 = Schlüssel verfällt nie
        = Schlüssel verfällt nach n Tagen
      w = Schlüssel verfällt nach n Wochen
      m = Schlüssel verfällt nach n Monaten
      y = Schlüssel verfällt nach n Jahren
Wie lange bleibt der Schlüssel gültig? (0) 3y
Key verfällt am Mo 06 Jun 2022 09:01:58 CEST
Ist dies richtig? (j/N) j

GnuPG erstellt eine User-ID, um Ihren Schlüssel identifizierbar zu machen.

Ihr Name ("Vorname Nachname"): Mike Kuketz
Email-Adresse: nitrokey@kuketz.de
Kommentar: 
Sie haben diese User-ID gewählt:
    "Mike Kuketz <nitrokey@kuketz.de>"

Ändern: (N)ame, (K)ommentar, (E)-Mail oder (F)ertig/(A)bbrechen? F
Wir müssen eine ganze Menge Zufallswerte erzeugen.  Sie können dies
unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas
tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen.

Die Auswahl zusammengefasst:

  • [1] RSA und RSA: Sowohl für den Hauptschlüssel als auch die Unterschlüssel werden Schlüssel auf Basis des RSA-Kryptosystems erzeugt.
  • [4096] Schlüssellänge in Bit für Hauptschlüssel: Der Hauptschlüssel soll eine Größe von 4096 Bit haben. Das entspricht ca. einem 140-Bit-Schlüsselraum. Zum Vergleich: RSA-2048-Bit hat einen Schlüsselraum von ca. 112 Bit und RSA-3072 einen Schlüsselraum von ca. 128 Bit.
  • [4096] Schlüssellänge in Bit für Unterschlüssel: Auch für die Unterschlüssel wählen wir eine 4096-Bit-Schlüssellänge.
  • [3y] Gültigkeit der Schlüssel: Aus Sicherheitsgründen sollten Schlüssel immer eine Ablaufzeit haben. Damit ist sichergestellt, dass Schlüssel irgendwann ungültig werden – bspw. für den Fall, wenn der geheime Schlüssel aus irgendwelchen Gründen nicht mehr zugänglich ist. Ihr könnt die Ablaufzeit später beliebig erweitern, sogar dann, wenn die Schlüssel bereits abgelaufen sind.
  • [Mike Kuketz] Name: Angabe eines Namens oder Pseudonyms.
  • [nitrokey@kuketz.de] E-Mail-Adresse: Angabe der E-Mail-Adresse die in eurem Besitz ist und mit der ihr später E-Mail-Verschlüsselung mit anderen Teilnehmern durchführen wollt. Ihr könnt später weitere E-Mail-Adressen hinzufügen, für die die Schlüssel ebenfalls gültig sein sollen.
  • [] Kommentar: Die Angabe ist nicht zwingend erforderlich bzw. rein optional.
  • [F] Fertigstellen: Mit der Eingabe F wird der Vorgang abgeschlossen und die Schlüssel generiert.

Während des Vorgangs wird ein Popup auf dem Bildschirm erscheinen, das euch zur Eingabe eines Passworts auffordert. Wählt hier bitte ein »sicheres« Passwort – falls die Schlüssel eventuell abhandenkommen sollten, sind sie zumindest durch das Passwort geschützt.

Wir haben nun einen Hauptschlüssel mit der Funktion Zertifizieren / Unterschreiben und einen Unterschlüssel mit der Funktion Verschlüsseln generiert:

gpg: Schlüssel 206C95DB985E7CC0 ist als ultimativ vertrauenswürdig gekennzeichnet
gpg: Widerrufzertifikat wurde als '/home/mike/.gnupg/openpgp-revocs.d/E83AB97F53CAE4AAE858BD06206C95DB985E7CC0.rev' gespeichert.
Öffentlichen und geheimen Schlüssel erzeugt und signiert.

pub   rsa4096 2019-06-07 [SC] [verfällt: 2022-06-06]
      E83AB97F53CAE4AAE858BD06206C95DB985E7CC0
uid                      Mike Kuketz <nitrokey@kuketz.de>
sub   rsa4096 2019-06-07 [E] [verfällt: 2022-06-06]

Auf ein paar Attribute möchte ich kurz eingehen:

  • pub: Durch das Attribut pub wird der Hauptschlüssel gekennzeichnet, der die beiden Funktionen [S] (Signieren) und [C] (Zertifizieren) beherrscht
  • sub: Das Attribut sub markiert den Unterschlüssel, der die Funktion [E] (Verschlüsseln) unterstützt
  • uid: Eure Benutzer-ID bzw. die UID
  • Widerrufzertifikat: Während des Vorgangs wird ebenfalls ein Widerrufzertifikat generiert. Sollte der private Schlüssel kompromittiert werden oder verloren gehen, sollte der Schlüssel mit dem Widerrufzertifikat als ungültig markiert werden. Andere Teilnehmer werden dann bei einer Aktualisierung der Schlüssel informiert, dass der Schlüssel widerrufen wurde bzw. nicht mehr gültig ist. Ein widerrufener Schlüssel kann immer noch verwendet werden, um alte Unterschriften zu verifizieren oder E-Mails zu entschlüsseln – sofern der private Schlüssel noch zugänglich ist. Neue E-Mails können hingegen nicht mehr mit diesem Schlüssel entschlüsselt werden.

4.2 Unterschlüssel hinzufügen

Für das Anwendungsszenario OpenSSH-Public-Key-Authentifizierung ist es notwendig, einen weiteren Unterschlüssel mit der Funktion Authentisierung zu ergänzen. Mit dem --edit-key-Befehl wird der bereits erstellte Schlüssel aufgerufen und kann anschließend erweitert bzw. verändert werden:

gpg --edit-key --expert nitrokey@kuketz.de

Ausgabe:

Geheimer Schlüssel ist vorhanden.

sec  rsa4096/206C95DB985E7CC0
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/966F11EA5DF244EA
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: E   
[ ultimativ ] (1). Mike Kuketz <nitrokey@kuketz.de>

Im interaktiven Modus von GnuPG können wir jede Menge Funktionen aufrufen. Wer sich eine Übersicht verschaffen möchte, der sollte zunächst help eingeben.

Mit dem Befehl addkey kann ein weiterer Unterschlüssel hinzugefügt werden:

gpg> addkey
Bitte wählen Sie, welche Art von Schlüssel Sie möchten:
   (3) DSA (nur signieren/beglaubigen)
   (4) RSA (nur signieren/beglaubigen)
   (5) Elgamal (nur verschlüsseln)
   (6) RSA (nur verschlüsseln)
   (7) DSA (Nutzung selber einstellbar)
   (8) RSA (Nutzung selber einstellbar)
  (10) ECC (nur signieren)
  (11) ECC (Nutzung selber einstellbar)
  (12) ECC (nur verschlüsseln)
   (13) Vorhandener Schlüssel
Ihre Auswahl? 8

Mögliche Vorgänge eines RSA-Schlüssels: Signieren Verschl. Authentisierung 
Derzeit erlaubte Vorgänge: Signieren Verschl. 

   (S) Umschalten der Signaturnutzbarkeit
   (V) Umschalten der Verschlüsselungsnutzbarkeit
   (A) Umschalten der Authentisierungsnutzbarkeit
   (Q) Beenden

Ihre Auswahl? S

Mögliche Vorgänge eines RSA-Schlüssels: Signieren Verschl. Authentisierung 
Derzeit erlaubte Vorgänge: Verschl. 

   (S) Umschalten der Signaturnutzbarkeit
   (V) Umschalten der Verschlüsselungsnutzbarkeit
   (A) Umschalten der Authentisierungsnutzbarkeit
   (Q) Beenden

Ihre Auswahl? V

Mögliche Vorgänge eines RSA-Schlüssels: Signieren Verschl. Authentisierung 
Derzeit erlaubte Vorgänge: 

   (S) Umschalten der Signaturnutzbarkeit
   (V) Umschalten der Verschlüsselungsnutzbarkeit
   (A) Umschalten der Authentisierungsnutzbarkeit
   (Q) Beenden

Ihre Auswahl? A

Mögliche Vorgänge eines RSA-Schlüssels: Signieren Verschl. Authentisierung 
Derzeit erlaubte Vorgänge: Authentisierung 

   (S) Umschalten der Signaturnutzbarkeit
   (V) Umschalten der Verschlüsselungsnutzbarkeit
   (A) Umschalten der Authentisierungsnutzbarkeit
   (Q) Beenden

Ihre Auswahl? Q
RSA-Schlüssel können zwischen 1024 und 4096 Bit lang sein.
Welche Schlüssellänge wünschen Sie? (3072) 4096
Die verlangte Schlüssellänge beträgt 4096 Bit
Bitte wählen Sie, wie lange der Schlüssel gültig bleiben soll.
         0 = Schlüssel verfällt nie
        = Schlüssel verfällt nach n Tagen
      w = Schlüssel verfällt nach n Wochen
      m = Schlüssel verfällt nach n Monaten
      y = Schlüssel verfällt nach n Jahren
Wie lange bleibt der Schlüssel gültig? (0) 3y
Key verfällt am Mo 06 Jun 2022 10:36:29 CEST
Ist dies richtig? (j/N) j
Wirklich erzeugen? (j/N) j
Wir müssen eine ganze Menge Zufallswerte erzeugen.  Sie können dies
unterstützen, indem Sie z.B. in einem anderen Fenster/Konsole irgendetwas
tippen, die Maus verwenden oder irgendwelche anderen Programme benutzen.

Die Auswahl zusammengefasst:

  • [8] RSA (Nutzung selber einstellbar): Wir möchten die Funktion Authentisierung ergänzen. Das funktioniert ausschließlich über den Menüpunkt [8].
  • [S] Umschalten der Signaturnutzbarkeit: In der Ausgabe werden bei »Derzeit erlaubte Vorgänge« die Funktionen Signieren und Verschlüsseln angezeigt. Beides soll der neue Unterschlüssel allerdings nicht können. Also wird zunächst die Funktion Signieren abgewählt.
  • [V] Umschalten der Verschlüsselungsnutzbarkeit: Auch die Funktion Verschlüsseln benötigen wir nicht und wählen sie daher ab.
  • [A] Umschalten der Authentisierungsnutzbarkeit: Der neue Unterschlüssel soll allerdings die Funktion Authentisieren unterstützen, weshalb diese aktiviert wird.
  • [3y] Gültigkeit der Schlüssel: Die Gültigkeit des Unterschlüssels wird wiederum auf 3 Jahre festgelegt.

Anschließend ergibt sich folgende Ausgabe:

sec  rsa4096/206C95DB985E7CC0
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/966F11EA5DF244EA
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: E   
ssb  rsa4096/6A2B2209DF66A331
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: A   
[ ultimativ ] (1). Mike Kuketz <nitrokey@kuketz.de>

Der neue Unterschlüssel mit der Funktion Authentisierung wurde also ergänzt. Über die Eingabe von quit verlassen wir den interaktiven Modus wieder und bestätigen die Frage nach

Änderungen speichern?

mit der Eingabe von j:

gpg> quit
Änderungen speichern? (j/N) j

4.3 Backup des Schlüsselmaterials

Bevor wir das Schlüsselmaterial nun auf den Nitrokey übertragen, legen wir zunächst ein Backup auf einem externen Speichermedium (bspw. USB-Stick) an. Dieser kann durch dm-crypt / LUKS zusätzlich verschlüsselt sein und sollte im Anschluss sicher verwahrt werden:

gpg --armor --output privkey_nitrokey@kuketz.de.asc --export-secret-key nitrokey@kuketz.de
gpg --armor --output subkeys_nitrokey@kuketz.de.asc --export-secret-subkeys nitrokey@kuketz.de
gpg --armor --output pubkey_nitrokey@kuketz.de.asc --export nitrokey@kuketz.de
gpg --export-ownertrust > nitrokey@kuketz.de.txt

Oder vereinfacht:

gpg --armor --output privkey_nitrokey@kuketz.de.asc --export-secret-keys nitrokey@kuketz.de
gpg --armor --output pubkey_nitrokey@kuketz.de.asc --export nitrokey@kuketz.de
gpg --export-ownertrust > nitrokey@kuketz.de.txt

Das Widerrufzertifikat sollte ebenfalls gesichert werden:

gpg --output revoke_nitrokey@kuketz.de.asc --gen-revoke nitrokey@kuketz.de

5. Transfer auf den Nitrokey

Wir haben nun einen Hauptschlüssel (Signieren, Zertifizieren) und zwei Unterschlüssel zum Verschlüsseln und Authentisieren generiert. Bevor ihr diese Schlüssel nun auf den Nitrokey übertragt, stellt bitte sicher, dass ihr Sicherheitskopien angelegt habt. Sobald sich die Schlüssel nämlich auf dem Nitrokey befinden, könnt ihr sie von dort aus nicht mehr extrahieren.

Eine OpenPGP-Smartcard, wie sie beim Nitrokey zum Einsatz kommt, hat drei separate Key-Slots. Das bedeutet: Auf einem Security-Token wie dem Nitrokey oder auch YubiKey kann in der Regel ein privater GPG-Schlüssel bzw. bis zu drei Unterschlüssel abgelegt werden. Genau das werden wir nun tun und starten dazu erneut den interaktiven Modus von GnuPG, um die Schlüssel auf die Smartcard zu übertragen:

gpg --edit-key --expert nitrokey@kuketz.de

Ausgabe:

Geheimer Schlüssel ist vorhanden.

sec  rsa4096/206C95DB985E7CC0
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/966F11EA5DF244EA
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: E   
ssb  rsa4096/6A2B2209DF66A331
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: A   
[ ultimativ ] (1). Mike Kuketz <nitrokey@kuketz.de>

gpg> keytocard
Den Hauptschlüssel wirklich verschieben? (j/N) j
Wählen Sie den Speicherort für den Schlüssel:
   (1) Signatur-Schlüssel
   (3) Authentisierungs-Schlüssel
Ihre Auswahl? 1

sec  rsa4096/206C95DB985E7CC0
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/966F11EA5DF244EA
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: E   
ssb  rsa4096/6A2B2209DF66A331
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: A   
[ ultimativ ] (1). Mike Kuketz <nitrokey@kuketz.de>

Der Hauptschlüssel wurde soeben mit dem Befehl keytocard im Key-Slot (1) Signatur-Schlüssel der Smartcard abgelegt. Um nun die zwei Unterschlüssel ebenfalls auf die Smartcard bzw. den Nitrokey zu übertragen, gehen wir wie folgt vor:

gpg> key 1

sec  rsa4096/206C95DB985E7CC0
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb* rsa4096/966F11EA5DF244EA
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: E   
ssb  rsa4096/6A2B2209DF66A331
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: A   
[ ultimativ ] (1). Mike Kuketz <nitrokey@kuketz.de>

gpg> keytocard
Wählen Sie den Speicherort für den Schlüssel:
   (2) Verschlüsselungs-Schlüssel
Ihre Auswahl? 2

sec  rsa4096/206C95DB985E7CC0
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb* rsa4096/966F11EA5DF244EA
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: E   
ssb  rsa4096/6A2B2209DF66A331
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: A   
[ ultimativ ] (1). Mike Kuketz <nitrokey@kuketz.de>

Mit dem Befehl key 1 wechseln wir zunächst auf den ersten Unterschlüssel, der die Funktion Verschlüsselung erbringt. Anschließend wird der Unterschlüssel wieder mit dem Befehl keytocard auf die Smartcard übertragen. Diesmal in den Key-Slot (2) Verschlüsselungs-Schlüssel. Anschließend können wir auch noch den zweiten Unterschlüssel übertragen:

gpg> key 1

sec  rsa4096/206C95DB985E7CC0
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/966F11EA5DF244EA
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: E   
ssb  rsa4096/6A2B2209DF66A331
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: A   
[ ultimativ ] (1). Mike Kuketz <nitrokey@kuketz.de>

gpg> key 2

sec  rsa4096/206C95DB985E7CC0
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/966F11EA5DF244EA
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: E   
ssb* rsa4096/6A2B2209DF66A331
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: A   
[ ultimativ ] (1). Mike Kuketz <nitrokey@kuketz.de>

gpg> keytocard
Wählen Sie den Speicherort für den Schlüssel:
   (3) Authentisierungs-Schlüssel
Ihre Auswahl? 3

sec  rsa4096/206C95DB985E7CC0
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: SC  
     Vertrauen: ultimativ     Gültigkeit: ultimativ
ssb  rsa4096/966F11EA5DF244EA
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: E   
ssb* rsa4096/6A2B2209DF66A331
     erzeugt: 2019-06-07  verfällt: 2022-06-06  Nutzung: A   
[ ultimativ ] (1). Mike Kuketz <nitrokey@kuketz.de>

Auch der letzte Schlüssel bzw. Unterschlüssel wurde nun in den Key-Slot (3) Authentisierungs-Schlüssel auf der Smartcard übermittelt.

Sobald ihr den interaktiven Modus mit quit verlasst und einer Speicherung der Änderungen zustimmt, werden eure Schlüssel unwiderruflich auf den Nitrokey übermittelt. Ab diesem Zeitpunkt verweist der GnuPG-KeyRing lediglich mit einem Zeiger auf die Smartcard – die Schlüssel befinden sich allerdings nicht mehr auf dem Rechner, auf dem sie erstellt wurden:

gpg> quit
Änderungen speichern? (j/N) j

Damit ist die RSA-Schlüsselerstellung und der Transfer auf den Nitrokey abgeschlossen. Eure Schlüssel befinden sich in der sicheren Smartcard-Umgebung des Nitrokeys.

5.1 Wichtig: Öffentlichen Schlüssel bekannt machen

Damit ihr den Nitrokey und die darauf befindlichen Schlüssel auf eurem System verwenden könnt, müsst ihr den öffentlichen Schlüssel eures eben erzeugten RSA-Schlüsselpärchens importieren – und zwar auf jedem System, auf dem ihr den Nitrokey verwenden möchtet. Da wir bereits eine Sicherung des öffentlichen Schlüssels erzeugt haben, können wir diesen mit einem Befehl in den GnuPG-KeyRing importieren bzw. dort bekannt machen:

gpg --import pubkey_nitrokey@kuketz.de.asc
gpg --import-ownertrust nitrokey@kuketz.de.txt

Anschließend verknüpfen wir die auf der Smartcard gespeicherten Schlüssel mit dem lokalen GnuPG-KeyRing:

gpg --card-status

6. ECC-Schlüssel und RSA-Schlüssellänge

6.1 ECC-Dilemma

Neben RSA-Schlüsseln eignen sich in der Praxis auch Schlüssel auf Basis von Elliptic Curve Cryptography (ECC) für die geplanten Anwendungsszenarien OpenPGP/GnuPG-E-Mail-Verschlüsselung und OpenSSH-Public-Key-Authentifizierung. Allerdings gibt es bei der Verwendung von ECC ein paar kleine Fallstricke zu beachten:

  • Curve25519: Lediglich der Nitrokey Start beherrscht die elliptische Kurve Curve25519, die zu den SaveCurves zählt – die einzige Kurve, bei der die Kurvenwahl vollständig transparent nachvollziehbar ist und somit Hintertüren praktisch ausgeschlossen werden können. Die anderen Nitrokeys unterstützen lediglich die Algorithmen NIST P, Brainpool und/oder SECG/Koblitz. Wer also tatsächlich ECC-Schlüssel nutzen möchte, der sollte aktuell einen Nitrokey Start verwenden – und dessen Firmware aktualisieren, da diese unter Umständen von einer Schwachstelle betroffen ist / war.
  • Kompatibilität: Damit ECC-Schlüssel in der Praxis reibungslos funktionieren und bspw. zum Zweck der E-Mail-Verschlüsselung eingesetzt werden können, müssen alle Kommunikationspartner mindestens GnuPG 2.1 oder neuer verwenden. Ist dies nicht der Fall, können Probleme auftreten.

Davon abgesehen hat die Verwendung von ECC gegenüber RSA einen entscheidenden Vorteil: Das Verfahren gilt bei kleinerer Schlüssellänge als genauso sicher wie längere RSA-Schlüssel und ist in der Praxis deutlich schneller – gerade auf den Security-Tokens, bei denen alle Krypto-Operationen (Verschlüsselung, Entschlüsselung, Authentifizierung etc.) direkt auf der Hardware stattfinden, macht sich das bemerkbar.

6.2 RSA-4096-Bit

Je größer die verwendete RSA-Schlüssellänge, desto länger benötigt eine Krypto-Operation auf der Smartcard. Möchte man bspw. eine verschlüsselte E-Mail öffnen, ist die Verwendung eines RSA-2048-Bit-Schlüssels im Vergleich mit einem RSA-4096-Bit-Schlüssel deutlich schneller. Allerdings empfiehlt nicht nur das Bundesamt für Sicherheit in der Informationstechnik (BSI), auf RSA-Schlüssel der Länge 2048 Bit spätestens ab dem Jahr 2022 zu verzichten.

Zur Auswahl stehen also noch RSA-3072-Bit und RSA-4096-Bit. Das GnuPG-Projekt hat in der FAQ eine interessante Antwort auf die Frage Why do people advise against using RSA-4096?:

Almost always when people use 4096-bit RSA they’re doing so because they believe RSA-4096 to be much stronger than it is. The United States’ National Institute of Standards and Technology (NIST) states that RSA-2048 gives roughly 112 bits of security and RSA-3072 gives roughly 128. There is no formal recommendation on where RSA-4096 lies, but the general consensus is that it would come in somewhere around 140 bits – 28 bits of improvement over RSA-2048. This is an improvement so marginal that it’s really not worth mentioning.

If you need more security than RSA-2048 offers, the way to go would be to switch to elliptical curve cryptography – not to continue using RSA.

Was also tun? Da RSA keine Perfect Forward Secrecy unterstützt, empfehle ich mindestens den Einsatz von RSA-3072-Bit oder RSA-4096-Bit. Die Entscheidung mag eventuell zu Lasten der Geschwindigkeit gehen, in Anbetracht des Sicherheitsgewinns allerdings ein vertretbarer Kompromiss.

7. Fazit

Sowohl der GPG-Hauptschlüssel (Signieren / Zertifizieren) als auch die beiden Unterschlüssel für die Verschlüsselung und Authentisierung sind nun auf dem Nitrokey abgelegt. Damit sind alle drei Key-Slots der OpenPGP-Smartcard belegt. Die aufgezeigte Variante hat den Vorteil, dass bei Verlust oder Defekt des Nitrokeys ein Backup der Schlüssel eingespielt werden kann.

Im kommenden Teil der Artikelserie wird der Vorgang beschrieben, wie der GnuPG-Unterschlüssel »Authentisierung« zur passwortlosen Anmeldung an einem SSH-Server genutzt werden kann.

Über den Autor | Kuketz

Mike Kuketz

In meiner freiberuflichen Tätigkeit als Pentester / Sicherheitsforscher (Kuketz IT-Security) schlüpfe ich in die Rolle eines »Hackers« und suche nach Schwachstellen in IT-Systemen, Webanwendungen und Apps (Android, iOS). Des Weiteren bin ich Lehrbeauftragter für IT-Sicherheit an der Dualen Hochschule Karlsruhe, sensibilisiere Menschen in Workshops und Schulungen für Sicherheit und Datenschutz und bin unter anderem auch als Autor für die Computerzeitschrift c’t tätig.

Der Kuketz-Blog bzw. meine Person ist regelmäßig in den Medien (heise online, Spiegel Online, Süddeutsche Zeitung etc.) präsent.

Mehr Erfahren ➡

SpendeUnterstützen

Die Arbeit von kuketz-blog.de wird zu 100% durch Spenden unserer Leserinnen und Leser finanziert. Werde Teil dieser Community und unterstütze auch du unsere Arbeit mit deiner Spende.

Folge dem Blog

Wenn du über aktuelle Beiträge informiert werden möchtest, hast du verschiedene Möglichkeiten, dem Blog zu folgen:

Bleib aktuell ➡


Diskussion

9 Ergänzungen zu “GnuPG-Schlüsselerstellung und Smartcard-Transfer – Nitrokey Teil2”

  1. Comment Avatar cane sagt:

    Das man keine Backup erstellen kann, wenn man den Schlüssel direkt auf dem Nitrokey erzeugt, ist falsch!

    Man kann bei der Schlüsselerstellung direkt auf dem Nitrokey auch ein Backup erstellen lassen. Nur in diesem Fall, unmittelbar bei Schlüsselerstellung, kann der private Schlüssel den Nitrokey verlassen und als Backup gespeichert werden.

  2. Comment Avatar Anonymous sagt:

    Tolles Thema für eine Artikelserie. Für Verschlüsselung von E-Mails und Pubkey SSH habe ich früher einen Nitrokey Pro (1) genutzt und verwendet mittlerweile einen Storage 2. Ich hoffe, dass Nitrokey bald die „Eierlegendewollmilchsau“ auf den Markt bringt und werde diese Beiträge gerne als Anleitungen weiter empfehlen.

    Wie üblich: weiter so und haters gonna hate ;)

  3. Comment Avatar Anonymous sagt:

    Hi!
    Erstmal Super Artikel!

    Ich finde, dass der Backupprozess den Artikel noch abrunden würde – also wie importiere ich meinen gesicherten Key in ein neues Gerät.

    Grüße!

    • Comment Avatar Mike Kuketz sagt:

      Ich verstehe die Frage nicht wirklich. Der Backup-Vorgang wird doch erläutert. Ebenso die Übertragung auf den Nitrokey – du kannst den Schlüssel aus dem Backup auf beliebig viele Security-Tokens übertragen.

      • Comment Avatar Anonymous sagt:

        Wenn ich die Keys auf den Nitrokey geschoben habe, verschwinden sie doch aus meinem lokalen Keyring.
        Wenn ich die Keys, die ich auf dem Backup-USB-Stick gesichert habe, wieder einspielen möchte, müssen sie doch erst wieder in den Keyring von GnuPG aufgenommen werden um danach wieder bei Punkt 5 des Artikel weitermachen zu können, oder habe ich das falsch verstanden?

  4. Comment Avatar Klaus sagt:

    Ich hatte zwei Probleme.
    Auf meinem MX-linux war zwar gbg installiert, ich bekam den Schlüssel nicht auf den Stick übertragen. Die Lösung war es musste noch ein Packet mit dem scdaemon installiert werden.
    Das zweite war mein Admin Passwort funktionierte mit einem mal nicht mehr. Ich hatte dem Stick auf einem Windows Rechner ein neues Benutzer und Adminpasswort gegeben. Danach konnte ich mit dem Versteckten Verzeichniss rumspielen.
    Danach habe ich die Schlüsselgenerierung auf dem MX Rechner gemacht. Und beim Aufspielen der Schlüssel hat irgendwas da nicht geklappt, bis ich rausgefunden habe das mein Admin Passwort bei der Vergabe gekürzt, also die letzten Buchstaben nicht angenommen wurden. Und die drei Versuche sind schneller um als man so denkt. So konnte ich dann auchmal den Werksreset testen.

  5. Comment Avatar K sagt:

    wieso wird überhaupt empfohlen den Hauptschlüssel auf den key zu packen. Ich habe nur die unterschlussel auf dem key und das reicht vollkommen. Selbst bei Verlust des keys kann niemand meine Identität stehlen, selbst wenn er irgendwie an das Passwort kommen würde. Der Hauptschlüssel ist separat sicher verwahrt.

HilfeWenn du konkrete Fragen hast oder Hilfe benötigst, sind das offizielle Forum oder der Chat geeignete Anlaufstellen, um dein Anliegen zu diskutieren. Per E-Mail beantworte ich grundsätzlich keine (Support-)Anfragen – dazu fehlt mir einfach die Zeit. Kuketz-Forum

Abschließender Hinweis

Blog-Beiträge erheben nicht den Anspruch auf ständige Aktualität und Richtigkeit wie Lexikoneinträge (z.B. Wikipedia), sondern beziehen sich wie Zeitungsartikel auf den Informationsstand zum Zeitpunkt des Redaktionsschlusses.

Kritik, Anregungen oder Korrekturvorschläge zu den Beiträgen nehme ich gerne per E-Mail entgegen.