nitrokey:linuxmint:pro

Nitrokey Pro in der Praxis unter Linux Mint 20

Bild: Nitrokey Pro USB-Stick In diesem Kapitel befassen wir uns eingehend mit dem Nitrokey Pro unter Linux Mint 20 insbesondere beim NitroPad X230 ein. Neben der verbesserten Absicherung von Login mit Einmalpasswörtern können eMails mit Hilfe von asymmetrischen Schlüsselmaterials (PGP und S/MIME) auch Dateien und ganze Festplatten verschlüsselt und natürlich auch wieder entschlüsselt werden. Hierzu verwenden wir den Nitrokey Pro welcher hier für einen überschaubaren Betrag von nicht einmal 50€ erstanden werden kann. In dem folgenden Beitrag gehen wir auf die Besonderheiten bei der Verwendung unter Linux Mint 20 ein.

Der Nitrokey Pro Cryptostick vereint in einem kleinen Plastikgehäuse einen Kartenleser mit zugehöriger manipulationssicheren OpenPGP Chipkarte, einem zu 100% Open Source und Open Hardware Device. Wie schon erwähnt wird das geheime Schlüsselmaterial (RSA 2048-4096 Bit, ECC 256-512 Bit) im manipulations- und PIN-geschützten integrierten Chipkarte gespeichert und somit bestens gegen Schadcode oder Verlust bzw. Diebstahl und gegen Hardware-Angriffe geschützt.

Anwendungsfälle und Einsatzszenarien:

  • Sicheres Login
    Einmalpassworte können zur Zweitauthentisierung bei vielen Webanwendungen oder Web-Diensten genutzt werden. Darüber hinaus ist auch eine Verwendung bei der Anmeldung an Rechnern oder z.B. bei der Anmeldung an entfernten Systemen mittels Zertifikaten und Schlüsseln bei SSH umsetzbar.
  • Verschlüsselung rund um eMails
    Zur vertraulichen Kommunikation via eMail kann das benötigte Schlüsselmaterial auf dem Kryptostick Nitrokey Pro erzeugt und sicher verwahrt werden. Eine Verwendung unter GnuPG, OpenPGP oder S/MIME ist somit gegeben.
  • Verschlüsselung von Dateien und Massenspeichern(Festplatten)
    Auch hier wird das geheime Schlüsselmaterial, wie auch schon beim Anwendungsfall eMail-Kommunikation, auf dem Kryptostick generiert und sicher vorgehalten. Eine Ver- und Entschlüsselung unserer Daten mit Hilfe von TrueCrypt, GnuPG Tools oder weiteren Anwendungen steht also nichts im Wege.

Weitere Informationen zum USB-Stick Nitrokey Pro findet findet man auch hier bzw. im Support Forum.

Darüber hinaus ist das 100%-Open PCB-Hardware-Design, sowie die Firmware und der Software SourceCode der Nitrokey-Familie in Github hinterlegt und einsehbar.

Informationen über den Stick können wir mit Hilfe des Befehls usb-devices aus dem RPM-Paket usbutils dem System abverlangen.

 # usb-devices
T:  Bus=01 Lev=02 Prnt=02 Port=01 Cnt=01 Dev#= 13 Spd=12  MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=20a0 ProdID=4108 Rev=01.00
S:  Manufacturer=Nitrokey
S:  Product=Nitrokey Pro
S:  SerialNumber=0000D34DB33F000000000000
C:  #Ifs= 2 Cfg#= 1 Atr=80 MxPwr=100mA
I:  If#=0x0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=01 Prot=01 Driver=(none)
I:  If#=0x1 Alt= 0 #EPs= 3 Cls=0b(scard) Sub=00 Prot=00 Driver=(none)

Mit dem Befehl lshw können wir uns ebenso anzeigen lassen, ob der Stick angesteckt und erkannt wird. Da der USB-Stick unter die Klasse input fällt suchen wir gezielt nach diesen Geräte-Typus.

 # lshw -short -C input
H/W path               Device     Class          Description
============================================================
/0/100/1a/1/1/2                   input          Nitrokey Pro

Mit Hilfe des Befehls lsusb aus dem RPM-Paket usbutils können wir auch die Produkt- und Hersteller-Identifikationsnummer des Nitrokey-Sticks ermitteln.

 # lsusb
Bus 001 Device 013: ID 20a0:4108 Clay Logic

Im Syslog wird uns beim Anstecken des Sticks dies entsprechend protokolliert:

Aug 23 20:57:44 Djangos-ThinkPad-X230 kernel: [13990.183533] usb 1-1.2: new full-speed USB device number 14 using ehci-pci
Aug 23 20:57:44 Djangos-ThinkPad-X230 kernel: [13990.293264] usb 1-1.2: New USB device found, idVendor=20a0, idProduct=4108, bcdDevice= 1.00
Aug 23 20:57:44 Djangos-ThinkPad-X230 kernel: [13990.293276] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Aug 23 20:57:44 Djangos-ThinkPad-X230 kernel: [13990.293282] usb 1-1.2: Product: Nitrokey Pro
Aug 23 20:57:44 Djangos-ThinkPad-X230 kernel: [13990.293285] usb 1-1.2: Manufacturer: Nitrokey
Aug 23 20:57:44 Djangos-ThinkPad-X230 kernel: [13990.293289] usb 1-1.2: SerialNumber: 000034DB33F000000000000
Aug 23 20:57:44 Djangos-ThinkPad-X230 kernel: [13990.295273] input: Nitrokey Nitrokey Pro as /devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2/1-1.2:1.0/0003:20A0:4108.000A/input/input19
Aug 23 20:57:44 Djangos-ThinkPad-X230 kernel: [13990.351850] hid-generic 0003:20A0:4108.000A: input,hidraw0: USB HID v1.10 Keyboard [Nitrokey Nitrokey Pro] on usb-0000:00:1a.0-1.2/input0
Aug 23 20:56:37 Djangos-ThinkPad-X230 systemd-resolved[881]: Server returned error NXDOMAIN, mitigating potential DNS violation DVE-2018-0001, retrying transaction with reduced feature level UDP.
Aug 23 20:57:44 Djangos-ThinkPad-X230 mtp-probe: checking bus 1, device 14: "/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2"
Aug 23 20:57:44 Djangos-ThinkPad-X230 mtp-probe: bus: 1, device: 14 was not an MTP device
Aug 23 20:57:44 Djangos-ThinkPad-X230 mtp-probe: checking bus 1, device 14: "/sys/devices/pci0000:00/0000:00:1a.0/usb1/1-1/1-1.2"
Aug 23 20:57:44 Djangos-ThinkPad-X230 mtp-probe: bus: 1, device: 14 was not an MTP device

Für den Zugriff auf die SmartCard bzw. auf den Nitrokey Pro benötigen wir z.B. für GPG den SmartCard-Daemon scdeamon und die Bibliothek libccid welche bei Linux Mint bereits in der Basisinstallation enthalten ist und mit Hilfe der Pakets scdaemon und libccid bereitgestellt werden.

Diese Pakete installieren wir, falls diese nicht bereits im System vorhanden sind, bei Bedarf mit Hilfe von apt.

 $ sudo apt install scdaemon libccid

Für den Betrieb unter Linux Mint 20 insbesondere beim NitroPad X230 müssen wir uns noch passende udev-Definitionen hier besorgen.

Wir wechseln also erst einmal in das entsprechende Konfigurationsverzeichnis /etc/udev/rules.d/.

 # cd /etc/udev/rules.d/

Dann holen wir uns die entsprechende Musterdatei auf unseren Rechner.

 # wget https://www.nitrokey.com/sites/default/files/41-nitrokey.rules

Zum Aktivieren unserer neuen udev-Regeldatei lassen wir diese nun erneut einlesen; hierzu verwenden wir folgenden Befehl:

 # udevadm control --reload-rules

Für die Verwaltung des Sticks stellt uns Nitrokey eine entsprechende Anwendung bzw. App zur Verfügung. Die Softwarequellen finden wir im GitHub-Reposoitory. Auf der Downloadseite zu Ubuntu finden wir Angaben zum eigenen Repository, von dem wir ein passenden RPM-Paket installieen können.

Beim Auslieferungsstand eines NitroPad x320 ist das passende Repository ppa:nitrokey/nitrokey bereits eingebunden. Hat man einen Systemupgrade durchgeführt und dabei wie empfohlen vor einem Systemupgrade die Drittrepositories entfernt oder man möchte unter Linux Mint das Nitrokey-Repository selbst, z.B. nach dem Systemupgrade wieder einbinden, geht man wie folgt vor:

Als normaler Benutzer:

 $ sudo add-apt-repository ppa:nitrokey/nitrokey

Oder als Benutzer mit root-Rechten:

 # add-apt-repository ppa:nitrokey/nitrokey

Bild: Linux Mint Software Sources

Nun installieren wir uns das Paket nitrokey-app mit Hilfe des Paketverwaltungswerkzeugs apt.

 # apt install nitrokey-app

Die installierte Version können wir bei Bedarf wie folgt ermitteln:

 # dpkg -l nitrokey-app

Was uns das Paket alles mitgebracht hat können wir mit Hilfe nachfolgenden Befehls erkunden.

 # dpkg -L nitrokey-app

Nun können wir die Anwendung starten. Hierzu klicken wir auf das Linx Mint Logo links unten und geben in dem Suchfeld nitro ein und wählen anschließend die angezeigte Applikation Nitrokey App mit einem Mausklick aus.

Bild: Linux Mint - Auswahl Programm-/Startmenü

Alternativ können wir natürlich das Programm auch direkt auf der Konsole starten:

 $ nitrokey-app

Ein Hinweis zur Nitrokey App wird ausgegeben.

Bild: Linux Mint - Auswahl Programm-/Startmenü

In der Statusleiste rechts taucht nun das Icon der Nitrokey App auf, welches wir nun mit meinem Mausklick aus-/anwählen.

Bild: Linux Mint - Auswahl der Nitrokey App über die Statusleiste

Wird der Nitrostick Pro angesteckt erfolgt ein entsprechender Hinweise angezeigt.

Bild: Linux Mint - Auswahl Programm-/Startmenü

Wird der Nitrostick Pro abgesteckt erfolgt ein entsprechender Hinweise angezeigt.

Bild: Linux Mint - Auswahl Programm-/Startmenü

Die Smartcard, die im Nitrokey Pro bebaut wurde, ist mit zwei PINs geschützt, der Benutzer-PIN (Standard: 123456) und Admin-PIN (Standard: 12345678).

Wird die Benutzer-PIN mehr als 3x falsch eingeben, wird die Karte für den Benutzer gesperrt. Mit der Admin-PIN kann der Fehleingabezähler zurückgesetzt bzw. eine neue Benutzer-PIN vergeben werden.

Wird jedoch die Admin-PIN mehr als 3x falsch eingegeben, wird die Smart-Card komplett und der Stick ist anschliessend nur noch durch einen Master-Reset in den Auslieferungszustand zu versetzen.

Hierzu kopiert man sich folgende Datei auf den Rechner:

 $ wget https://www.nitrokey.com/sites/default/files/nitrokey-reset.txt

Anschließend führt man einen Factory-Reset aus und benutzt folgenden Befehl:

 $ gpg-connect-agent < nitrokey-reset.txt

Beim Umgang mit diesen PINs ist also unbedingt Vorsicht walten lassen! Ein so strenger PIN-basierter Hardware-Schutz ist unerlässlich, wenn die SmartCard vor dem Zugriff durch die falschen Hände geschützt werde soll.

User- und Admin PIN des Nitrokey Sticks ändern

Was nun noch fehlt ist die Änderung der beiden Default PINs für den Benutzer (123456) und für den Admin-Zugriff (12345678).

Als erstes ändern wir über den betreffenden Menüpunkt die Admin-PIN.

Bild: Linux Mint - Nitrokey App Änderungsdialog Admin-PIN

Nach Eingabe der default PIN 12345678 und unserer individuellen Admin-PIN klicken wir auf die Schaltfläche [ OK ].

Bild: Linux Mint - Nitrokey App Bestätigung der PIN-Änderung

Anschließend machen wir das Gleiche mit der User-PIN.

Bild: Linux Mint - Nitrokey App Änderungsdialog User-PIN

Nach Eingabe der default PIN 123456 und unserer individuellen Admin-PIN klicken wir auf die Schaltfläche [ OK ].

Bild: Linux Mint - Nitrokey App Bestätigung der PIN-Änderung

Passwort-Safe

Der Kryptostick bietet uns die Möglichkeit bis zu 16 Passwörter anzuspeichern, die wir dann später einfach bei entsperrtem Nitrokey Pro Stick abrufen, in den Zwischenspeicher kopieren um es dann bei den (Web)Anwendungen einzufügen.

Über das Programmicon in der Statusleiste erreichen wir die gestartete Nitrokey-App.

Bild: Nitrokey App - Menü via Statusleiste

Wir müssen also erst einmal den Passwort-Safe entsperren damit wir einen Passwort dort generieren und oder hinterlegen können. Zum entsperren müssen wir die von uns vergebene individuelle User-PIN eingeben.

Bild: Nitrokey App - Abfrage der User-PIN

Wurde der Nitrokey Pro noch nicht für den Passworts-Safe Funktion präpariert, da dieser z.B. neu ausgeliefert war, erfolgt ein Hinweis zum benötigten AES-Schlüssel, der für die Passwort-Safe Funktion des Nitrokey Pro benötigt wird.

Bild: Nitrokey App - Hinweis zum noch fehlenden AES-SAchlüssel

Wir werden also aufgefordert unsere individuelle Admin-PIN einzugeben.

Bild: Nitrokey App - Abfrage der Admin-PIN zum Erstellen des AES-Schlüssels

Nach Eingabe der Admin-Pin wird der Schlüssel generiert.

Bild: Nitrokey App - Hinweis zum erstellten AES-SAchlüssel

Da wir zum Entsperren des Passwortsafes zur Eingabe der User-PIN aufgefordert werden, kommen wir dieser Bitte entsprechend nach.

Bild: Nitrokey App - Abfrage der User-PIN

Das entsperren des Passwort-Safes wird uns mit einer Popup-Nachricht angezeigt.

Bild: Nitrokey App - Ninweis zum entsperrten Passwort-Safe

Nun können wir unseren Passwort-Safe generieren. Über das prkgramm-Icon in der unteren Statusleiste erreichen wir nun beim entsperrten Nitrokey Pro diese Funktion.

Bild: Nitrokey App - Menü via Statusleiste

Auf dem Reiter Passwort-Safe finden wir alle benötigten Einstellungspunkte. Hier können wir nun bis zu 16 Passworte sicher versperren und auf bedarf darauf zurückgreifen.

Bild: Nitrokey App - Menüpunkt/Reiter zum definieren der Passworte

Haben wir alle Daten richtig eingetragen sichern wir diese über einen Klick auf die Schaltfläche [ Speichern ].

Bild: Nitrokey App - Ninweis zum erfolgreichen Sichern der Passwort-Safe Daten

Bei entsperrten Passwort-Safe können wir nun über das App-Menü, welches wir über die Statusleiste erreichen, jederzeit auf die gesicherten Passworte zugreifen.

Bild: Nitrokey App - Ninweis zum erfolgreichen Sichern der Passwort-Safe Daten

Bei Bedarf kopieren wir dann das betreffende Passwort und fügen es auf der Eingabemaske ein.

Bild: Nitrokey App - Ninweis zum erfolgreichen Kopieren des Passortes aus dem Passwort-Safe

Da es sich bei der Chipkarte des Nitrokey Pro um eine standardkompatible OpenPGP-Karte handelt, kann der Kryptostick mit Hilfe von GnuPG verwaltet werden. Hierzu installieren wir uns das Paket gnupg2, sofern es nicht bereits bei der Erstkonfiguration unseres Rechner installiert wurde.

 $ sudo apt install gpg

Alle Sicherheitsfunktionen wie z.B. das Erzeugen/Speichern von GPG-Schlüsseln, das Verschlüsseln/Entschlüsseln einer Datei, das Signieren einer Nachricht, die auf der Hardware ausgeführt werden, können mit Hilfe des Befehls gpg gesteuert werden.

Sollte beim Aufruf des Befehls gpg die Karte nicht sofort angesprochen werden können, einfach den Befehl nochmals ausführen:

 $ gpg --card-status
gpg: selecting openpgp failed: Karte nicht vorhanden
gpg: OpenPGP Karte ist nicht vorhanden: Karte nicht vorhanden

card-status

Mit der Option card-status können wir uns mit dem Befehl gpg –card-status den Kartenstatus ausgeben lassen.

 $ gpg --card-status
Reader ...........: 20F0:4109:0000D34DB33F000000000000:0
Application ID ...: D27600012701020100066000425D0000
Application type .: OpenPGP
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 0000425D
Name of cardholder: [not set]
Language prefs ...: de
Salutation .......: 
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

Die einzelnen Datenfelder haben hierbei folgende Bedeutung:

Datenfeld Beschreibung
Application ID Individuelle (unique) KartenID, diese beinhaltet:
° den Kartentyp
° die Version der Spezifikation
° den Hersteller und
° die Seriennummer des Cryptosticks
Diese Application ID ist einmalig und bei jeder Karte anders.
Version verwendete OpenPGP Version
Manufacturer Hersteller der Karte
Serial number Seriennummer der Karte, die vom Hersteller vergeben wurde.
Name of cardholder Vorname und Nachname des Karteninhabers ( Es sind hier derzeit nur reines ASCII erlaubt, also keine deutschen Umlaute). Dieses Feld wird von GPG nicht verwendet.
Language prefs Gewählte/bevorzugte Sprache (Muttersprache) des Karteninhabers. Dieses Feld wird von GPG nicht verwendet.
Sex Geschlecht des Karteninhabers.: (Männlich (M), Weiblich (F) oder Leerzeichen)
URL of public key Angabe einer URL, mit der der public-key mit Hilfe des Befehls fetch unter gpg --edit-card auf die Karte geladen werden kann.
Login data Bei diesem Feld kann der Account-Name des Karteninhabers abgelegt werden, der bei Anmeldeversuchen genutzt werden kann. GPG führt hier keinerlei Abgleiche zwischen diesem Namen und dem Namen der in einem Schlüssel angegeben und verwendet wird durch!
Signature PIN Hier kann über die beiden Schalter zwingend und nicht zwingend eingestellt werden, ob bei jedem Signatur-Vorgang die PIN abgefragt werden soll, oder nicht. Bei der Option nicht zwingend kann GPG die PIN zwischenspeichern, solange der Nitrokey-Stick angesteckt bleibt.
Key attributes Angaben über Art und Umfang der hinterlegten Schlüssel
Max. PIN lengths Maximale Länge der einzelnen PINs, kann nicht verändert werden!
PIN retry counter Zähler für die verbleibenden Versuche zur Eingabe der richtigen PIN. Der max. Zählwert von 3 wird bei jeder Falscheingabe um eins heruntergesetzt. Sobald die richtige Admin-PIN eingegeben wurde, wir der max. Wert von 3 wieder zurück gesetzt. Die beiden ersten Werte (von links gesehen) werden für die User-PIN verwendet. GPG stellt hierbei sicher, dass beide werde synchronisiert werden. Der zweite (mittlere) Wert wird lediglich für Besonderheiten aus dem ISO-Standard 7816 (https://de.wikipedia.org/wiki/ISO_7816) verwendet. Der dritte (rechte) Wert wird als Fehlversuchszähler für die Admin_PIN verwendet.
Signature counter Zähler der generierten Signaturen bzw. Signaturvorgänge mit der KArte. Der Zähler kann nicht manipuliert werden und wird lediglich zurückgesetzt, sobald ein neuer Signature-Schlüssel erzeugt oder auf die Karte geladen wird.
Signature key Signatur-Schlüssel (primärer OpenPGP-Schlüssel)
created Datum und Uhrzeit an dem der Schlüssel erzeugt wurde
Encryption key Entschlüsselungs-Schlüssel (Unterschlüssel des primären (Signature-)Schlüssels.
created Datum und Uhrzeit an dem der Schlüssel erzeugt wurde
Authentication key Authentifizierung-Schlüssel (Unterschlüssel des primären (Signature-)Schlüssels.
created Datum und Uhrzeit an dem der Schlüssel erzeugt wurde
General key info Diese primäre USer ID wird angezeigt, sobald ein entsprechender öffentlicher Schlüssel (public-key) verfügbar ist.

change-pin

Wie schon mit der Nitrokey App können wir auch mit Hilfe des Befehls gpg --change-pin die Benutzer- und die Admin-PIN, wie auch die PIN zum Zurücksetzen der Benutzer-PIN, ändern.

Die Benutzer-PIN (Menüpunkt 1) wird benötigt für den täglichen Betrieb wie z.B. zum Entsperren des Token, oder zum Signieren und Verschlüsseln. Die Mindestlänge für den User-Pin beträgt 6 Zeichen.

Die Admin-PIN (Menüpunkt 3) wird für die Karten-/Token-Verwaltung verwendet, so z.B. für das Laden von Schlüsseln auf den Krypto-Stick, das Erzeugen von Schlüsseln oder das Ändern von Informationen wie die Inhaberdaten auf der Karte. Die Mindestlänge für die Admin-PIN beträgt 8 Zeichen.

Wird die Benutzer-PIN 3x falsch eingeben, wird die Karte gesperrt und kann dann nur mit der Admin-PIN oder dem Reset-Code zurückgesetzt werden. Wenn Sie den falschen Admin-Pin dreimal eingeben, wird die Karte unbrauchbar und kann dann lediglich mit einem Factory-Reset (Verlußt aller Kartendaten!) zurück gesetzt werden!

Die Reset-PIN (Menüpunkt 4) kann nur zum Zurücksetzen der Benutzer-PIN verwendet werden. Die Mindestlänge für den Reset-Code beträgt 8 Zeichen. Der Reset-Code Fehlerzähler kann wiederum mit der Admin-PIN zurückgesetzt werden. Wird nach zweimaliger Falscheingabe der Benutzer- wie auch der Admin-PIN und dann die richtige PIN eingeben, wird der Fehlerzähler zurückgesetzt.

Worin besteht nun aber der genaue Unterschied zwischen dem Reset-Code und der Admin-PIN? Möchte man in einer Organisation Nitrokey Pro an seine Mitarbeiter ausgeben, werden bestimmte Daten, wie z.B. Namen, die Public Key URL oder auch das erzeugte Schlüsselmaterial zentral vorgegeben. Da der Benutzer selbst diese Daten nicht verändern können soll, wird dieser auch nicht Kenntnis von der Admin-PIN haben. Sperrt sich nun der Mitarbeiter aus, weil er die Benutzer-PIN 3x falsch eingegeben hat, kann der Neutzer natürlich nicht die Admin-PIN eingeben, da er diese nicht kennt. Hier kommt nun der Reset-Code ins Spiel. Mit Hilfe dieses Codes kann der Benutzer nun die Benutzer-PIN zurücksetzen.

 $ gpg --change-pin
gpg: OpenPGP Karte Nr. D276000124010303000500006FDA0000 erkannt

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

Ihre Auswahl?

Beim Menüpunkt 1 können wir z.B. die Benutzer-PIN abändern. Wir werden dann nach der aktuellen PIN gefragt und müssen die neue PIN 2x eingeben zum Abändern.

Bild: PIN-Eingabedialog beim Abändern der Benutzer-/Admin-PIN

card-edit

Mit Hilfe des Befehls gpg --card-edit haben wir entsprechend umfangreiche Zugriffs-, Erstellungs- und Änderungsoptionen auf die Daten und das Schlüsselmaterial, welches auf der Smartcard gespeichert wurden und werden. Viele hilfreiche Informationen zum Umgang mit den Befehlen die uns das Programm gpg bietet, findet man in der zugehörigen Dokumentation auf der Projektseite von https://www.gnupg.org/.

 $ gpg --card-edit
Reader ...........: 20F0:4109:0000D34DB33F000000000000:0
Application ID ...: D27600012701020100066000425D0000
Application type .: OpenPGP
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 000034D4
Name of cardholder: [not set]
Language prefs ...: de
Salutation .......: 
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

gpg/card>
User-Befehle

Mit Hilfe des Befehls help können wir uns anzeigen lassen, welche Optionen im jeweiligen Modus Benutzer oder Admin zur Verfügung stehen.

gpg/card> help
quit           quit this menu
admin          show admin commands
help           show this help
list           list all available data
fetch          fetch the key specified in the card URL
passwd         menu to change or unblock the PIN
verify         verify the PIN and list all data
unblock        unblock the PIN using a Reset Code
Admin-Befehle

Mit dem Befehl admin können wir in den Admin-Modus/-Bereich wechseln und auch dort alle Befehle mit Hilfe von help anzeigen lassen.

gpg/card> admin
Admin commands are allowed
gpg/card> help
quit           quit this menu
admin          show admin commands
help           show this help
list           list all available data
name           change card holder's name
url            change URL to retrieve key
fetch          fetch the key specified in the card URL
login          change the login name
lang           change the language preferences
salutation     change card holder's salutation
cafpr          change a CA fingerprint
forcesig       toggle the signature force PIN flag
generate       generate new keys
passwd         menu to change or unblock the PIN
verify         verify the PIN and list all data
unblock        unblock the PIN using a Reset Code
factory-reset  destroy all keys and data
kdf-setup      setup KDF for PIN authentication
key-attr       change the key attribute

Stick personalisieren

Zunächst wollen wir unseren Stick personalisieren, also mit den Benutzerspezifischen Daten versorgen:

Name of cardholder Vorname und Nachname des Karteninhabers (Es sind hier derzeit nur reines ASCII erlaubt, also keine deutschen Umlaute). Dieses Feld wird von GPG nicht verwendet.
Language prefs Gewählte/bevorzugte Sprache (Muttersprache) des Karteninhabers. Dieses Feld wird von GPG nicht verwendet.
Sex Geschlecht des Karteninhabers.: (Männlich (M), Weiblich (F) oder Leerzeichen)
URL of public key Angabe einer URL, mit der der public-key mit Hilfe des Befehls fetch unter gpg --edit-card auf die Karte geladen werden kann.
Login data Bei diesem Feld kann der Account-Name des Karteninhabers abgelegt werden, der bei Anmeldeversuchen genutzt werden kann. GPG führt hier keinerlei Abgleiche zwischen diesem Namen und dem Namen der in einem Schlüssel angegeben und verwendet wird durch!

Zum Ändern dieser Daten müssen wir nach der Anmeldung an der Karte mit dem Befehl adminin den Admin Bereich wechseln.

 $ gpg --card-edit
Reader ...........: 20F0:4109:0000D34DB33F000000000000:0
Application ID ...: D27600012701020100066000425D0000
Application type .: OpenPGP
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 0000425D
Name of cardholder: [not set]
Language prefs ...: de
Salutation .......: 
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

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

Wir ändern zunächst den Namen des Karteninhabers Name of cardholder:

 gpg/card> name
Cardholder's surname: aka Bastard Operator from Hell
Cardholder's given name: Django

Als nächstes definieren wir die Sprache des Kartenbenutzers:

 gpg/card> lang
Language preferences: de

Im nächsten Schritt setzen wir das Geschlecht des Karteninhabers:

 gpg/card> sex
Salutation (M = Mr., F = Ms., or space): m

Nun setzen wir noch den Anmelde-/Loginnamen entsprechend unserer Umgebung:

 gpg/card> login
Login data (account name): django

Zu guter Letzt setzen wir nun die URL, von der der public-key mit Hilfe des Befehls fetch unter gpg --edit-card auf die Karte geladen werden kann.

 gpg/card> url
URL to retrieve public key: https://keyserver.nausch.org/pks/lookup?op=get&search=0x074ECF6150A6BFED

Somit ergeben sich folgende benutzerindividuellen Daten auf der Karte:

 gpg/card> verify 
Reader ...........: 20F0:4109:0000D34DB33F000000000000:0
Application ID ...: D27600012701020100066000425D0000
Application type .: OpenPGP
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 0000425D
Name of cardholder: Django aka Bastard Operator from Hell
Language prefs ...: de
Salutation .......: Mr.
URL of public key : https://keyserver.nausch.org/pks/lookup?op=get&search=0x074ECF6150A6BFED
Login data .......: django
Signature PIN ....: forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

Nun können wir die Erstinitialisierung abschließen und den Einstellungsdialog mit dem Befehl quit verlassen.

 gpg/card> quit

Schlüsseleigenschaften definieren

Beim Public-Key-Verschlüsselungsverfahren denken wir in erster Linie an die beiden Schlüssel, den public-key, den wir z.B. zum Verschlüsseln von Informationen verwenden und dem secret-key, den wir zum Signieren und zum Entschlüsseln verwenden. Im Nitrokey werden dazu drei verschiende Schlüssel-/slots bereitgestellt:

  1. Signature key
  2. Encryption key
  3. Authentication key

Für alle drei Schlüssel ist im Auslieferungszustand bzw. nach einem Facory Reset jeweils ein RSA-Schlüssel mit einer Schlüssellänge von 2048 vordefiniert. Wir sehen dies bei den Key attributes ...: rsa2048 rsa2048 rsa2048 wenn wir den Status des angestckten Nitro Key-Sticks einsehen oder beim Aufruf der Editieroption.

Mit Hinblick auf die möglichen Unsicherheiten im Bezug auf die RSA-Schlüssellänge1) werden wir uns ersteinmal nicht mit diesen Defaultwerten begnügen, sondern die maximale RSA-Schlüssell#nge von 4096 bit verwenden.

Zum Ändern der Schlüssel und deren Länge verwenden wir den Befehl gpg --card-edit.

 $ gpg --card-edit 
Reader ...........: 20F0:4109:0000D34DB33F000000000000:0
Application ID ...: D27600012701020100066000425D0000
Application type .: OpenPGP
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 000034D4
Name of cardholder: Django aka Bastard Operator from Hell
Language prefs ...: de
Salutation .......: Mr.
URL of public key : https://keyserver.nausch.org/pks/lookup?op=get&search=0x074ECF6150A6BFED
Login data .......: django
Signature PIN ....: not forced
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

gpg/card>

Mit dem Befehl admin wechseln wir in den Administrationsbereich.

gpg/card> admin
Admin commands are allowed

gpg/card>

Das Ändern der Schlüsseleigenschaften erfolgt mit dem Befehl key-attr . Hier wählen wir die Schlüssel-Typ RSA und die Schlüssellänge 4096 bit aus. Nacheinander werden die drei Schüssel-Type abgefragt:

  1. Signature key
  2. Encryption key
  3. Authentication key

Beim Ändern der drei Schlüssel wird jeweils der Admin-PIN der Karte abgefragt.

Bild: Admin-PIN Entry Dialog

gpg/card> key-attr
Changing card key attribute for: Signature key
Please select what kind of key you want:
   (1) RSA
   (2) ECC
Your selection? 1
What keysize do you want? (2048) 4096
The card will now be re-configured to generate a key of 4096 bits
Changing card key attribute for: Encryption key
Please select what kind of key you want:
   (1) RSA
   (2) ECC
Your selection? 1
What keysize do you want? (2048) 4096
The card will now be re-configured to generate a key of 4096 bits
Changing card key attribute for: Authentication key
Please select what kind of key you want:
   (1) RSA
   (2) ECC
Your selection? 1
What keysize do you want? (2048) 4096
The card will now be re-configured to generate a key of 4096 bits

gpg/card

Zum Überprüfen ob unsere Änderungen angenommen wurden verwenden wir den Befehl verify. Nach dem Ändern der Schlüssel werden wir nach der User-PIN des Nitrokey Pro Sticks gefragt.

Bild: User-PIN Entry Dialog

gpg/card> verify 
Reader ...........: 20F0:4109:0000D34DB33F000000000000:0
Application ID ...: D27600012701020100066000425D0000
Application type .: OpenPGP
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 000034D4
Name of cardholder: Django aka Bastard Operator from Hell
Language prefs ...: de
Salutation .......: Mr.
URL of public key : https://keyserver.nausch.org/pks/lookup?op=get&search=0x074ECF6150A6BFED
Login data .......: django
Signature PIN ....: not forced
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

gpg/card>

Beim Parameter Key attributes sehen wir nun die geänderten Schlüsselparameter Key attributes ...: rsa4096 rsa4096 rsa4096

Am Ende verlassen wir den den Karten-Editor mit dem Befehl quit.

Schlüssel auf dem Nitrokey Pro generieren

Pro-Tip:
Aus sicherheitsgesichtspunkten und Anwendersicht ist das Generieren des Schlüsselmaterials auf einer OpenPGP-Smart-Card immer dem manuellen Importieren vorzuziehen!

Wir wollen uns nun einen neuen GPG-Schlüssel in der SmartCard erzeugen und rufen hierzu den Befehl generate auf. Wir werden nun menügeführt durch eine Reihe von Standardfragen geführt, welche alle relevante Daten abfragen, die zur Generierung des Hauptschlüssels wie auch der Unterschlüssel die für die Aufgaben Signatur, Verschlüsselung und Authentifizierung benötigt werden.

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

Zum Generieren des Schlüssels inkl. Unterschlüssel wird der User-PIN des Nitrokey Pro Sticks benötigt und abgefragt.

Bild: User-PIN Entry Dialog

 gpg/card> generate
Make off-card backup of encryption key? (Y/n) n
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: Django aka Bastard Operator from Hell
Email address: django@nausch.org
Comment: 
You selected this USER-ID:
    "Django aka Bastard Operator from Hell <django@nausch.org>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
gpg: key 56D31D76E0C812E8 marked as ultimately trusted
gpg: directory '/home/django/.gnupg/openpgp-revocs.d' created
gpg: revocation certificate stored as '/home/django/.gnupg/openpgp-revocs.d/D7ACC16061ABF3C6E14B1C3856D31D76E0C812E8.rev'
public and secret key created and signed.


gpg/card>

Den Nitrokey Pro Stick auf keinen Fall vom USB-Port trennen!

Bild: Nitrokey Pro mit leuchtender rote LED beim Schlüsselgenerieren

Solange die rote LED Leuchtet werden ausreichend Zufallszahlen generiert und das dauert in aller Regel bis zu 8 Minuten!

Rufen wir nun erneut die auf der OpenPGP-Karte des Nitrokey Pro gespeicherten Daten ab, so sehen wir nun nach Eingabe des Kommandos list den erzeugten PGP-Schlüssel, samt seiner ID und die drei Unterschlüssel zum Signieren, dem Schlüssel zur Verschlüsselung und den dritten Authentifizierungs-Schlüssel.

gpg/card> list
Reader ...........: 20F0:4109:0000D34DB33F000000000000:0
Application ID ...: D27600012701020100066000425D0000
Application type .: OpenPGP
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 000034D4
Name of cardholder: Django aka Bastard Operator from Hell
Language prefs ...: de
Salutation .......: Mr.
URL of public key : https://keyserver.nausch.org/pks/lookup?op=get&search=0x074ECF6150A6BFED
Login data .......: django
Signature PIN ....: not forced
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 4
Signature key ....: D7AC C160 61AB F3C6 E14B  1C38 56D3 1D76 E0C8 12E8
      created ....: 2020-08-29 20:42:00
Encryption key....: 477B 93FF 727F E5F0 6944  B822 4669 6B1C C21C B928
      created ....: 2020-08-29 20:42:00
Authentication key: 89F5 C299 0A1F 8F56 53BB  0DFF 17C7 C6D4 ECB0 A73D
      created ....: 2020-08-29 20:42:00
General key info..: 
pub  rsa4096/56D31D76E0C812E8 2020-08-29 Django aka Bastard Operator from Hell <django@nausch.org>
sec>  rsa4096/56D31D76E0C812E8  created: 2020-08-29  expires: never     
                                card-no: 0005 000034D4
ssb>  rsa4096/17C7C6D4ECB0A73D  created: 2020-08-29  expires: never     
                                card-no: 0005 000034D4
ssb>  rsa4096/46696B1CC21CB928  created: 2020-08-29  expires: never     
                                card-no: 0005 000034D4

gpg/card>
gpg/card> quit

vorhandenen Schlüssel in den Nitrokey Pro importieren

Es kann natürlich auch durchaus sein, dass wir bereits über einem ausreichend großen und sicher verwahrten PGP-Schlüssel verfügen. Da beitet es sich natürlich an, diesen auf in die OpenPGP-Smartcard des Nitrrokey Pro zu importieren und die Version auf der Festplatte des Rechners sicher zu entfernen/zu schreddern.

PGP-Unterschlüssel - subkeys

Bei der Public-Key-Verschlüsselungsverfahren denken wir in erster Linie an die beiden Schlüssel, den public-key, den wir z.B. zum Verschlüsseln von Informationen verwenden und dem secret-key, den wir zum Signieren und zum Entschlüsseln verwenden. Ganz so trivial ist das aber bei genauerer Betrachtung doch nicht und wir müssen uns, bevor wir mit dem Verschieben der Schlüssel aus dem Dateisystem in Richtung SmarctCard des Nitrokeys beschäftigen, mit dem Konzept der Unterschlüssel vertraut machen!

Werfen wir zur genaueren Betrachtung einfach einen Blick in unseren Schlüsselbund.

 $ gpg --list-keys
/home/django/.gnupg/pubring.kbx
-------------------------------
pub   rsa4096 2020-08-30 [SC]
      FEFA8BFEC18C32F19968C5EE412BC6B241503EC7
uid           [ultimate] Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>
sub   rsa4096 2020-08-30 [E]

Obwohl wir zuvor „nur einen“ PGP-Schlüssel generiert generiert hatten, sehen wir nun aber plötzlich zwei Schlüssel. Der eine ist mit dem Wert pub gekennzeichnet, hat die Schlüssel-ID FEFA8BFEC18C32F19968C5EE412BC6B241503EC7 und ist mit „[SC]“ versehen. Der zweite Schlüssel ist als ssb gekennzeichnet und ist mit „[E]“ markiert.

Beide Schlüssel sehen wir auch, wenn wir uns den Inhalt des secrings anzeigen lassen:

 $ gpg --list-secret-keys
/home/django/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096 2020-08-30 [SC]
      FEFA8BFEC18C32F19968C5EE412BC6B241503EC7
uid           [ultimate] Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>
ssb   rsa4096 2020-08-30 [E]
  • Worin besteht nun der genaue Unterschied?
    Nun, der erste Schlüssel ist der primäre Signierungs-Schlüssel und der zweite Schlüssel ist ein Unterschlüssel für die Verschlüsselung, der Verschlüsselung-Schlüssel.

  • Warum nun der ganze Aufstand mit diesem Unterschlüssel?
    Stellen wir uns einmal folgendes Szenario vor: Eines Tagen wollen oder müssen wir den privaten Schlüssel wechseln, da dieser kompromittiert wurde, oder wir stellen fest, dass die ursprünglich gewählte Schlüssellänge nicht mehr unserem gesteigertem Sicherheitsbewusstsein entspricht. Wir können natürlich den alten Schlüssel verwerfen, zurückziehen und löschen, damit dieser unbrauchbar wird. Nur verlieren wir dadurch natürlich sämtliche beglaubigte Unterschriften unserer Kontaktpersonen und Freunde, die ja einen gewissen Vertrauensstatus bezeugen - der Hintergrund zum WoT-Gedanken2). Als Folge daraus müssten wir erneut den ganzen Aufwand mit dem Key-Signing betreiben, was mit unter sehr aufwändig werden könnte!
    Mit Unterschlüssel müssen wir nicht alles über Bord werden, sondern können z.B. weiterhin die beglaubigten Unterschriften unserer Freunde und Bekannten beibehalten und verwenden. Diese Signatur-Informationen sind, genau so wie die primäre User-ID, mit dem primären Signierungsschlüssel verknüpft! Subkeys selbst haben keine eigene Vertrauensstellung, sprich diese werden nicht selbst signiert. Der grosse Vorteil ist nun, dass wir diese Unterschlüssel für genau spezifizierte Einsatzzwecke definieren und nutzt können: Verschlüsselung, Signierung oder Authentifizierung. Diese Schlüssel können wir nun gezielt erneuern und dann an unsere Kontaktpersonen über den Master-Schlüssel verteilen können. Die Änderungen werden dann automatisch in deren Key-Rings als Aktualisierung des bestehenden Schlüssels übernommen, da die Unterschlüssel mit unserem Primary Signing Key signiert sind, dem unsere Kommunikationspartner ja schon bereits vertrauen.

Fragen wir den Status unseres Nitrokey Pro ab, so sehen wir dort am Ende drei Speicherplätze für unterschiedliche Unterschlüssel, genauer gesagt der private Teil der Unterschlüssel, die auf dem Nitrokey Pro gespeichert sind, nämlich den :

  • Signature key : Unterschlüssel zum Signieren
  • Encryption key : Unterschlüssel zum Verschlüsseln
  • Authentication key: Unterschlüssel zum Authentifizieren
 $ gpg --card-status
Reader ...........: 20F0:4109:0000D34DB33F000000000000:0
Application ID ...: D27600012701020100066000425D0000
Application type .: OpenPGP
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 000034D4
Name of cardholder: Django aka Bastard Operator from Hell
Language prefs ...: de
Salutation .......: Mr.
URL of public key : https://keyserver.nausch.org/pks/lookup?op=get&search=0x074ECF6150A6BFED
Login data .......: django
Signature PIN ....: not forced
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

Damit wir nun die drei benötigten Unterschlüssel an die richtige Stelle unseres Nitrokey Pro verschieben können, müssen wir noch ein paar Vorbereitungen treffen:

  1. Erstellen weiterer Unterschlüssel für die Themen:
    1. Signierung
    2. Authentifizierung
  2. Verschieben der privaten Unterschlüssel aus dem Schlüsselbund, der auf der Festplatte gespeichert waren in die OpenPGP-SmartCard des Nitrokey Pros.
  3. Verschieben des primären Signierungs Schlüssel auf ein sicheres Sicherungsmedium.

Die öffentlichen Schlüssel bleiben nach wie vor im Schlüsselbund auf unserer Festplatte /home/~/.gnupg/pubring.gpg gespeichert, lediglich die privaten Unterschlüssel werden durch Proxy-Einträge im Schlüsselbund ersetzt!

Bevor wir nun zum Punkt 1. Erstellen weiterer Unterschlüssel widmen können rufen wir uns die ID des primären Signierungs-Schlüssel in Erinnerung.

 $ gpg --list-keys
/home/django/.gnupg/pubring.kbx
-------------------------------
pub   rsa4096 2020-08-30 [SC]
      FEFA8BFEC18C32F19968C5EE412BC6B241503EC7
uid           [ultimate] Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>
sub   rsa4096 2020-08-30 [E]

In unserem Konfigurationsbeispiel hier ist dies die Key-ID: FEFA8BFEC18C32F19968C5EE412BC6B241503EC7. Zunächst erstellen wir besagten Unterschlüssel zum Signieren:

$ gpg --expert --edit-key D1359446
gpg (GnuPG) 2.2.19; Copyright (C) 2019 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/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg> 

Das Erzeugen von Unterschlüssel erfolgt mit hilfe des Befehls addkey.

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
  (14) Existing key from card
Your selection?

Da wir einen RSA-Unterschlüssel zum Signieren erzeugen möchten, wählen wir hier die Option 4. Bei der Schlüssellänge verwenden wir wie auch schon bei der Erstellung des initialen Schlüsselpaares 4096; die Laufzeit des Unterschlüssels wählen wir entsprechend gleich oder kürzer wie beim primären Signierungs-Schlüssel, in unserem Beispiel also unendlich.

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) 
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y 

Bild: Passphrase-Dialog beim Generieren eines neunen PGP(sub)-Keys

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/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>
gpg>

Das Gleiche machen wir nun erneut für unseren Authentifizierungs-Unterschlüssel.

 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
  (14) Existing key from card
Your selection?

Für unseren Verschlüsselungs-Unterschlüssel wählen wir nun eben hier entsprechend die Option 8.

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?

Uns wir nun angezeigt, dass aktuell Signierung und Verschlüsselung vorausgewählt wurde: Current allowed actions: Sign Encrypt. Wir wählen nun nacheinander die Optionen für Signierung mit „S“ und Verschlüsselung mit „E“ ab und Signierung mit „A“ an.

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?

An der nun definierten Option Current allowed actions: Authenticate sehen wir, dass nun nachfolgend ein Authentifizierungs-Unterschlüssel generiert werden soll. Mit Q Verlassen wir diesen Dialog und generieren den besagten Authentifizierungs-Unterschlüssel.

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) 
Key does not expire at all
Is this correct? (y/N) y
Really create? (y/N) y 

Zum Generieren des Schlüssels werden wir um Bestätigung der Passphrase gebeten.

Bild: Passphrase-Dialog beim Generieren eines neunen PGP(sub)-Keys

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/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
ssb  rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>

GnuPG listet nun den Primary Schlüssel zum Signieren und alle Unterschlüssel auf mit dem jeweiligen Verwendungszweck usage auf. E steht für Verschlüsseln, S für Signieren und A für Athentifizierung.

Zu guter letzt speichern wir nun mit dem Befehl save unsere gerade erstellen Unterschlüssel im Schlüsselspeicher auf der Festplatte ab.

gpg> save

Fragen wir nun erneut den Schlüsselbund mit den secret-keys ab sehen wir nun unsere drei Unterschlüssel.

 $ gpg --list-secret-keys
/home/django/.gnupg/pubring.kbx
-------------------------------
sec   rsa4096 2020-08-30 [SC]
      FEFA8BFEC18C32F19968C5EE412BC6B241503EC7
uid           [ultimate] Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>
ssb   rsa4096 2020-08-30 [E]
ssb   rsa4096 2020-08-30 [S]
ssb   rsa4096 2020-08-30 [A]
Schlüssel in die ChipCard des Nitrokey Pro verschieben

Nun werden wir die vorhin generierten Schlüssel an Ort und Stelle in die SmartCard des Nitrokey Pro verschieben. Hierzu verwenden wir den Befehl keytocard des Programms gpg. Wie schon beim Generieren der Unterschlüssel müssen wir angeben, welche primäre Schlüssel-ID bearbeitet oder genauer gesagt verschoben werden soll. In unserem Konfigurationsbeispiel ist das die ID FEFA8BFEC18C32F19968C5EE412BC6B241503EC7.

 $ gpg --edit-key FEFA8BFEC18C32F19968C5EE412BC6B241503EC7
gpg (GnuPG) 2.2.19; Copyright (C) 2019 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/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
ssb  rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>

Für später merken wir uns nun in Welcher Reichenfolge die Unterschlüssel aufgelistet werden bzw. welche Key-ID zu welcher Aktion gehört. Die Key-ID 0 ist die des primären Signierungs-Schlüssel!

  • Sub-Key 1 - D5D9674D9331F388 - E = encrypt = verschlüsseln
  • Sub-Key 2 - A6EC2C062AEE3AB8 - S = sign = signieren
  • Sub-Key 3 - 28B0CB362EC9939D - A = authorize = authentifizieren

gpg> </code> Da wir die privaten Schlüssel unserer drei Unterschlüssel verschieben wollen, wechseln wir mikt dem Command toggle von der Ansicht der öffentlichen in die Ansicht der privaten Schlüssel.

gpg> toggle
sec  rsa4096/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
ssb  rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>

Als erstes verschieben wir den privaten Verschlüsselungs-Unterschlüssel. Hierzu wählen wir diesen mit Eingabe von „1“ ein. Die Auswahl wird uns dann durch den * angezeigt.

gpg> key 1
sec  rsa4096/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb* rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
ssb  rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>

Nun verschieben wir den ausgewählten Schlüssel in die SmartCard des Nitrokey mit dem Command keytocard. Als Ziel wählen wir dann richtiger Weise die Option 2 = Encryption key aus

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

Zum Entsperren des PGP-Schlüssels werden wir um Bestätigung der Passphrase gebeten.

Bild: Passphrase-Dialog beim Generieren eines neunen PGP(sub)-Keys

Zum Speichern des Schlüssels auf der OpenPGP-Smartcard des Nitrokey Pro erfolgt anschließend die Abfrage/Eingabe der ADMIN-PIN.

Bild: Admin-PIN Entry Dialog

sec  rsa4096/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb* rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
ssb  rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>

Als nächstes verschieben wir den privaten Signierungs-Unterschlüssel aus, in dem wir erst den bereits ausgewählten Verschlüsselungs-Key abwählen und dann den Signierungs-Key anwählen.

gpg> key 1
sec  rsa4096/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
ssb  rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>
gpg> key 2
sec  rsa4096/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb* rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
ssb  rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>

Nun verschieben wir den privaten Signierungs-Unterschlüssel in Richtung SmartCard des Nitrokey Pro. Hier wählen wir nun die 1 für Signature key aus.

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

Zum Entsperren des PGP-Schlüssels werden wir um Bestätigung der Passphrase gebeten.

Bild: Passphrase-Dialog beim Generieren eines neunen PGP(sub)-Keys

sec  rsa4096/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb* rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
ssb  rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>

Zu guter Letzt fehlt nun noch unser Authentifizierungs-Unterschlüssel. Wir wählen also wieder den Schlüssel 2 ab und den Schlüssel 3 aus.

gpg> key 2
sec  rsa4096/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
ssb  rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>
gpg> key 3
sec  rsa4096/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
ssb* rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>

Nun verschieben wir den privaten Authentifizierungs-Unterschlüssel in Richtung SmartCard des Nitrokey Pro. Hier wählen wir nun die 3 für Authentication key aus.

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

Zum Entsperren des PGP-Schlüssels werden wir um Bestätigung der Passphrase gebeten.

Bild: Passphrase-Dialog beim Generieren eines neunen PGP(sub)-Keys

sec  rsa4096/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
ssb  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
ssb* rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>

Zum Abschluss speichern wir nun unsere Änderungen im lokalen key-ring mit dem Befehl save.

gpg> save

Wenn wir jetzt den Kartenstatus abfragen, werden unsere drei Unterschlüssel entsprechend mit angezeigt.

 $ gpg --card-status
Reader ...........: 20F0:4109:0000D34DB33F000000000000:0
Application ID ...: D27600012701020100066000425D0000
Application type .: OpenPGP
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 000034D4
Name of cardholder: Django aka Bastard Operator from Hell
Language prefs ...: de
Salutation .......: Mr.
URL of public key : https://keyserver.nausch.org/pks/lookup?op=get&search=0x074ECF6150A6BFED
Login data .......: django
Signature PIN ....: not forced
Key attributes ...: rsa4096 rsa4096 rsa4096
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: 41A8 4ABC 8C4D D712 49E3  DC6E A6EC 2C06 2AEE 3AB8
      created ....: 2020-08-30 12:01:28
Encryption key....: 1D03 3786 F875 686B 3423  9B82 D5D9 674D 9331 F388
      created ....: 2020-08-30 11:31:04
Authentication key: 140B 5460 7269 96FE 98F7  C9AA 28B0 CB36 2EC9 939D
      created ....: 2020-08-30 12:07:06
General key info..: sub  rsa4096/A6EC2C062AEE3AB8 2020-08-30 Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>
sec   rsa4096/412BC6B241503EC7  created: 2020-08-30  expires: never     
ssb>  rsa4096/D5D9674D9331F388  created: 2020-08-30  expires: never     
                                card-no: 0005 000034D4
ssb>  rsa4096/A6EC2C062AEE3AB8  created: 2020-08-30  expires: never     
                                card-no: 0005 000034D4
ssb>  rsa4096/28B0CB362EC9939D  created: 2020-08-30  expires: never     
                                card-no: 0005 000034D4
Schlüssel aus dem lokalen Schlüsselspeicher entfernen

Löschen wir nun den kompletten Schlüssel aus der lokalen Schlüsseldatei, können wir folgenden Befehl verwenden.

 $ gpg --delete-secret-key django@nausch.org
gpg (GnuPG) 2.2.19; Copyright (C) 2019 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/412BC6B241503EC7 2020-08-30 Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

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

Doch Achtung: Hier wird der komplette Schlüssel gelöscht, also den privaten Primären Signing Key und nicht nur die Proxy-Einträge! Dies kann zu Problemen bei der späteren Verwendung des Nitrokey Pro auf der Konsole führen, da das gpg-Programm versucht den Schlüssel im Schlüsselbund zu finden!

Der gpg-Befehl --delete-secret-keys hat als Bezugspunkt den primären Signierungsschlüssel und würde beim entfernen dieses Schlüssels natürlich auch die Unterschlüssel entfernen. Da wir nur den privaten primären Signierungsschlüssel aus dem Schlüsselbund löschen wollen, exportieren wir die privaten Unterschlüssel, bevor wir den privaten Primary Signing Key löschen und werden diese dann anschließend wieder importieren.

Wir exportieren also erst einmal die Unterschlüssel und legen diese in einer lokalen Datei ab. Zunächst holen wir uns aber noch die Schlüssel-IDs da wir diese beim Exportieren eigens angeben müssen.

 $ gpg --edit-key FEFA8BFEC18C32F19968C5EE412BC6B241503EC7
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/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
ssb  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
     card-no: 0005 000034D4
ssb  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
     card-no: 0005 000034D4
ssb  rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
     card-no: 0005 000034D4
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>

Den Editierdialog verlassen wir mit dem Command quit.

gpg> quit

Nun exportieren wir die Unterschlüssel in die Datei subkeys mit Hilfe folgenden Aufrufs, bei dem wir die IDs der Unterschlüssel gefolgt von einem ! jeweils angeben:

 $ gpg -o subkeys --export-secret-subkeys 564BA287! ACCE2639! EC65030E!

Nun löschen wir den primären Signierungsschlüssel inkl. der Unterschlüssel.

 $ gpg --delete-secret-key django@nausch.org
gpg (GnuPG) 2.2.19; Copyright (C) 2019 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/412BC6B241503EC7 2020-08-30 Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

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

Ein erneuter Aufruf des privaten Schlüsselspeichers zeigt und, dass dort nun keine Einträge mehr vorhanden sind.

 $ gpg --list-secret-keys

Nun importieren wir wieder die zuvor gesicherten privaten Unterschlüssel

 $ gpg --import subkeys
gpg: key 412BC6B241503EC7: "Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>" not changed
gpg: To migrate 'secring.gpg', with each smartcard, run: gpg --card-status
gpg: key 412BC6B241503EC7: secret key imported
gpg: Total number processed: 1
gpg:              unchanged: 1
gpg:       secret keys read: 1

Lassen wir uns nun den Inhalt des privaten Schlüsselbundes anzeigen, sehen wir die zurückgesicherten Unterschlüssel wieder.

 $ gpg --edit-key FEFA8BFEC18C32F19968C5EE412BC6B241503EC7
gpg (GnuPG) 2.2.19; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.


pub  rsa4096/412BC6B241503EC7
     created: 2020-08-30  expires: never       usage: SC  
     trust: ultimate      validity: ultimate
sub  rsa4096/D5D9674D9331F388
     created: 2020-08-30  expires: never       usage: E   
sub  rsa4096/A6EC2C062AEE3AB8
     created: 2020-08-30  expires: never       usage: S   
sub  rsa4096/28B0CB362EC9939D
     created: 2020-08-30  expires: never       usage: A   
[ultimate] (1). Django aka BOfH (Bastard Operator from Hell) <django@nausch.org>

gpg>

Den Dialog verlassen wir wieder mit dem Connamd quit.

Zu guter letzt vernichten wir die Datei mit den gesicherten privaten Unterschlüsseln.

 $ shred --zero --remove subkeys

Rückruf-Zertifikat erstellen

Sollte ein Bösewicht unseren Nitrokey Pro Stick in seine Finger kriegen, kann er mit dem Schlüsselmaterial nur etwas anfangen, wenn er die User-PIN bzw. Admin-PIN zum Neusetzen der User-PIN kennen würde. Sollte man jedoch genau in die Bredullie kommen, einen Schlüssel für ungültig erklären zu müssen, da z.B. der Nitrokey Pro verloren bzw. gestohlen wurde oder man schlichtweg die beiden PINs vergessen haben sollte, ist es zweckmäßig entsprechend vorbereitet zu sein.

Alternativ zu dem nachfolgend beschriebenen manuellen Weg, kann man sich das Leben natürlich auch einfach machen und das bei der Schlüsselerstellung erzeugte Rückrufzertifikates im Verzeichnis ~/.gnupg/openpgp-revocs.d/ bedienen!

$ ll ~/.gnupg/openpgp-revocs.d/D7ACC16061ABF3C6E14B1C3856D31D76E0C812E8.rev 
-rw------- 1 django django 1815 Aug 29 22:50 /home/django/.gnupg/openpgp-revocs.d/D7ACC16061ABF3C6E14B1C3856D31D76E0C812E8.rev
$ cat ~/.gnupg/openpgp-revocs.d/D7ACC16061ABF3C6E14B1C3856D31D76E0C812E8.rev
This is a revocation certificate for the OpenPGP key:

pub   rsa4096 2020-08-29 [S]
      D7ACC16061ABF3C6E14B1C3856D31D76E0C812E8
uid          Django aka Bastard Operator from Hell <django@nausch.org>

A revocation certificate is a kind of "kill switch" to publicly
declare that a key shall not anymore be used.  It is not possible
to retract such a revocation certificate once it has been published.

Use it to revoke this key in case of a compromise or loss of
the secret key.  However, if the secret key is still accessible,
it is better to generate a new revocation certificate and give
a reason for the revocation.  For details see the description of
of the gpg command "--generate-revocation" in the GnuPG manual.

To avoid an accidental use of this file, a colon has been inserted
before the 5 dashes below.  Remove this colon with a text editor
before importing and publishing this revocation certificate.

:-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: This is a revocation certificate

iQI2BCABCAAgFiEE16zBYGGr88bhSxw4VtMdduDIEugFAl9Kv3sCHQAACgkQVtMd
duDIEujqfxAAhH0jTA0I4iZP0LG/iB+Rti3QHNfkj1w/dEyBdL3IlVq3LKrJEpcq
n1DG5vFRusz3ciP6vDviDHK6oDhBnSoFrY/11ONnd7yMD0dtdnKhMpy1GHiiVrzP
q0GI5nXU5L7cE6CbcXpLgRuFXvesuGwj0DUqTQ3GN8NeE7XJ+EPqOkjp5D5lCpK0
BAZWOFFWKA6dXKVOTtYNYimqtiVY7NXzZUTOCjLIfqxZYvR4GgK1fB8XjGVMDlxM
WkhHidI3D/NTa/X65SfK5HCdYzXzGsn3GlJl6U4bPYG0iV+aqF7ysdBlh+gkpF9r
raCNrgDV0mvySWehMfrUhqTcwxRoQjAHn84OpkqJJ7wRx08hXuqKcbWBk+m1O4qd
TBE97UvCLucHnkYMzz2AOqMyCkIfKR+CbTiSpwnr661Yb+9gaYQaNT/ORLWucGzU
Xsq2B4n/vu1wbwTJjGXAGAgJe/ZYA6TMXYe7G1RLe/gt+SqycrvXAZw6YBWVij1k
0OV4lGJ1j9rHv+xTsvfeZ7jB41NOBrLcZa/Ad2Vut3RfWu9FTUKR25puo1vMjDXF
/6CLRly1VckNPbRQeuanyvuR+4ICwxabgZOZ3ILKkgVQRf5mBwHB/OMqBjJQuJr1
9kT92WZqXxGBcS3iHScFNJYrdRgGJwozq7ZjQ7N3g/1Tgu0GIpZzy8U=
=PyKR
-----END PGP PUBLIC KEY BLOCK-----

Hierzu erstellen wir uns nun ein Revocation Certificate3). Dieses Revocation Certificate muss an einem besonderen sicheren und streng geheimen Ort aufbewart werden, da damit ein Angreifer den Key seines Opfers unwiederbringlich zurückziehen und dies ohne jegliche weitere Sicherung oder Passphraseabfrage könnte.

Grundsätzlich wird dieses Rückrufzertifikat mit dem Befehk gpg --gen-revoke key-ID erzeugt. Wir benötigen also die Key-ID, die wir nun zuerst einmal ermitteln:

 $ gpg  --list-sigs
gpg: checking the trustdb
gpg: public key of ultimately trusted key EB88DE44CE617AE0 not found
gpg: public key of ultimately trusted key FD5246D6F789CC8E not found
gpg: public key of ultimately trusted key AB590C22BBEE7177 not found
gpg: public key of ultimately trusted key 4F5AE805485F5308 not found
gpg: public key of ultimately trusted key 9308FC78386863AC not found
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   6  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 6u
/home/django/.gnupg/pubring.kbx
-------------------------------
pub   rsa4096 2020-08-29 [SC]
      D7ACC16061ABF3C6E14B1C3856D31D76E0C812E8
uid           [ultimate] Django aka Bastard Operator from Hell <django@nausch.org>
sig 3        56D31D76E0C812E8 2020-08-29  Django aka Bastard Operator from Hell <django@nausch.org>
sub   rsa4096 2020-08-29 [A]
sig          56D31D76E0C812E8 2020-08-29  Django aka Bastard Operator from Hell <django@nausch.org>
sub   rsa4096 2020-08-29 [E]
sig          56D31D76E0C812E8 2020-08-29  Django aka Bastard Operator from Hell <django@nausch.org>

Die Key-ID lautet für unseren Schlüssel also D7ACC16061ABF3C6E14B1C3856D31D76E0C812E8.

 $ gpg --gen-revoke D7ACC16061ABF3C6E14B1C3856D31D76E0C812E8
sec  rsa4096/56D31D76E0C812E8 2020-08-29 Django aka Bastard Operator from Hell <django@nausch.org>

Create a revocation certificate for this key? (y/N)

Da wir uns sicher sich dieses Zertifikat erstellen zu wollen, beantworten wir die FRage hier natürlich mit y.

Als nächstes werden wir gefragt, warum wir den Schlüssel zurückziehen wollen (werden).

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?

In diesem Beispiel wählen wir die Nummer 3 für Schlüssel wird nicht mehr benutzt aus.

Your decision? 3

Anschließend haben wir noch die Möglichkeit einen ergänzenden Text anzuführen.

Enter an optional description; end it with an empty line:
> 
> Dies war nur ein Demonstrationsschlüssel!
> 

Nach eingebae der geforderten Leerzeile, erfolgt noch eine Sicherheitsabfrage, ob die eingegebenen Daten auch in Ordnung sind.

Reason for revocation: Key is no longer used
Dies war nur ein Demonstrationsschlüssel!
Is this okay? (y/N) 

Dies bestätigen wir im positiven Fall mit Eingabe von y. Zum Generieren des Rückrufzertifikates wird der User-PIN des Nitrokey Pro Sticks benötigt und abgefragt.

Bild: User-PIN Entry Dialog

Anschließend wird am Bildschirm das revocation certificate zusammen mit einem Hinweis zur Handhabung ausgegeben.

ASCII armored output forced.
-----BEGIN PGP PUBLIC KEY BLOCK-----
Comment: This is a revocation certificate

iQJgBCABCABKFiEE16zBYGGr88bhSxw4VtMdduDIEugFAl9LceUsHQNEaWVzIHdh
ciBudXIgZWluIERlbW9uc3RyYXRpb25zc2NobMO8c3NlbCEACgkQVtMdduDIEuhE
2BAAkN5OSAUdPijH9DQZFwcGO8z/JxnPd5wZBtBM6HPe/lnv+23k4vzK04jHcPus
qffOLnrtSCrG+4dYiVZbIGQcJojZ1W9bt3L+TX1JB60wqFsh9mLbhaPuewxPcgT1
NTAJCtC994sml/g0c+zsOtZX4fCc8y5+sm+bIQOC+maLURGojntxY2rD1mQYdlxg
MxXcYziXMh15ZX9ngK85KS0QcZL8QUV8ESm6r+VkA4SCpOI7KyLLuphz1cc1usek
8w5e/IDRdjHyRgu139X/r/z2rtV0yYZUeUZcl2u1th7eHKb1iH9We6UZFSnflx91
32sZ0hf1FvQWWooU68jloJAocJ7QxTgGVtz9iA+ITOQFXNolOSCX0TyA9jU7ut5y
RHFyBYjVwiAZkeXOUu8JRPk4EPeXNpJj31MmSEhsnvlhS/7phiTBzhT6vVz4H7mU
CVykLIGXBsro6jymBBDurYJns4Y8YzERGZWwZ5gzYiB9YhceZfT1hFHgKmQp9/XY
bEOoF3xANY0QR/kGXOePGhinjeEeG9O8ZqlnMvqBr9T9WmBdS3WigUcwPXQd1+tq
jTRI0bGlwhQzP/8AB1I0Td0GrLSMb+jaAjo/fDWDpIBzKMtJkPHrafdn/9RrWp8+
BF6jSDammL2iRi4dRmjZ26Uh62vmw4kmT+pl4iKlP8wPP8M=
=P7qn
-----END PGP PUBLIC KEY BLOCK-----
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!

Bitte speichern Sie es auf einem Medium welches sie wegschliessen können; falls Mallory (ein Angreifer) Zugang zu diesem Zertifikat erhält, kann erIhren Schlüssel unbrauchbar machen. Es wäre klug, dieses Widerrufszertifikat auch auszudrucken und sicher aufzubewahren, falls das ursprüngliche Mediumnicht mehr lesbar ist. Aber Obacht: Das Drucksystem kann unter Umständen eine Kopie anderen Nutzern zugänglich machen.

Den Zertifikatsblock speichern wir dann in einer Textdatei an einem sicheren Ort ab.

 $ vim revocation.crt

Soll nun der Schlüssel zurückgezogen werden, so braucht man lediglich die Datei revocation.crt in den öffentlichen Schlüsselbund pubring.pgp zu importieren. GnuPG erkennt nun das Rückrufzertifikat für einen der Schlüssel handelt und hängt des diesem ohne weitere Sicherheitsabfrage an.

 $ gpg --import revocation.crt 
gpg: key 56D31D76E0C812E8: "Django aka Bastard Operator from Hell <django@nausch.org>" revocation certificate imported
gpg: Total number processed: 1
gpg:    new key revocations: 1
gpg: public key of ultimately trusted key EB88DE44CE617AE0 not found
gpg: public key of ultimately trusted key FD5246D6F789CC8E not found
gpg: public key of ultimately trusted key AB590C22BBEE7177 not found
gpg: public key of ultimately trusted key 4F5AE805485F5308 not found
gpg: public key of ultimately trusted key 9308FC78386863AC not found
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   6  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 6u

Anschließend können wir uns den Inhalt des öffentlichen Schlüsselringes anzeigen lassen:

 $ gpg --list-sigs 
/home/django/.gnupg/pubring.kbx
-------------------------------
pub   rsa4096 2020-08-29 [SC] [revoked: 2020-08-30]
      D7ACC16061ABF3C6E14B1C3856D31D76E0C812E8
rev          56D31D76E0C812E8 2020-08-30  Django aka Bastard Operator from Hell <django@nausch.org>
      reason for revocation: Key is no longer used
         revocation comment: Dies war nur ein Demonstrationsschlüssel!
uid           [ revoked] Django aka Bastard Operator from Hell <django@nausch.org>
sig 3        56D31D76E0C812E8 2020-08-29  Django aka Bastard Operator from Hell <django@nausch.org>

Beim Schlüssel mit der ID 56D31D76E0C812E8 sehen wir nun am Zeilenanfang ein rev, welches uns anzeigt, dass dieser Schlüssel zurückgezogen (revoked) wurde. Anschließend läd man den Schlüssel auf einen Keyserver.

Export des public-key in ein key-file

Um einen Schlüssel einem Kommunikationspartner direkt auszuhändigen, oder um den öffentlichen Schlüssel auf einer Homepage zu veröffentlichen, ist es notwendig den public Key zu exportieren. Hierzu benutzen wir den Befehl gpg --export --armor keyID > public-key.asc

 $ gpg --export --armor 4F9FC2E6F458253C > 4F9FC2E6F458253C-public-key.asc
 $ cat 4F9FC2E6F458253C-public-key.asc
-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBF9LdpgBEACLm8JPQyPHk+3/Y+FnNoa01RdZpRQkdVGKJGa+Do82VdJufUgB
v0qOhbeTLiY+NOHtCmWi8cALoqiaXoO6Owk3VonlUOhvwuu4Lv5ZauF7GJ8nHpis
hXOmVH8wAf9NmK+ORqEqFN+M2ROEzZXPfuTTOaMrktPCF3+U1FaHEtlQ66+cmOOX
UI0SMA1sFYMRC1BQOiz3PgMVSZodbh1PefgnITLlnTl+uOaDdOfnCzjL66DUbc7I
4BUdWyhsMYHjMpRZhbqhwHvjNU+S5aquJObHPGxnpzEMzM2ockpAAi7ceP6d8stc
nbO5ohMK6H5VQ092p4DhjnyWygduWn0AF7lLZ+xaWN2CEOstU2TJ822dr2lBRZ1z
fJTEBy+fGMg2zFExxB51CIPLnmDb4PJk8dLIJ39IIAOEG+Mafb5Th8kh7xcJUUrS
O3YAXtlfOm9D+mipoyfNMz3tFS4QkrKE/BTsO47lY+wU74h7zC/x4MgGKap7S6gk
z16tMzg2Hf0fus1m1t/eE6uf8IL0JwqaruYCBv3bMojDWaZWdsk/kBycuVPzGjxv
WUDm8fBOo6DHx8rCkl6z+R7iWJoyIqD3TPdiL0+6f3QPhaeyZ1ey8Bx4Os+aRipg
Rcl7Dco7iY+UZYWPAl5s94rWtqSBy308RG58JUWjToPjYyJs068IzZMCpQARAQAB
tHFEamFuZ28gYWthIFtCT2ZIXSBCYXN0YXJkIE9wZXJhdG9yIGZyb20gSGVsbCAo
RGphbmdvc1dJS0kgRGVtb25zdHJhdGlvbnMtUEdQLVNjaGzDvHNzZWwpIDxkamFu
Z29AbWFpbHNlcnZlci5ndXJ1PokCTgQTAQgAOBYhBJXYNKe0+MQk7/QapE+fwub0
WCU8BQJfS3aYAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEE+fwub0WCU8
2moP/1u+nlHXUfMF936WUWOiQyel3Cu00Vp4IaI1dFuk4dkzZT2LRJdGYLWohizH
HOWmCMSvVFQMjFHqjp6FSYs7ste55pbmEL97Qa5e9eUujbHIFeszZbtPJFDRlE08
8SNH+3sGc8UYnefSlQ4YPFFjRCVSzlmiByus0MucISyqAeS8j0ZDD709rtKXjLJW
NzU1JqYyMWAgxhIqaAHPTkewX0K/sF/SvMPVhGdTPl0yyF1R/qNPmAaIqtbCKz5c
lglW0OaK5uc+Y3/2acYA3jeYVPipX5KQ555x53glV5S/Rsr8uHi+DgOCu5az0a2N
7akpLUESxakL4SFb1K5aTnU+3eoy6rsIS12YwaHGHe0BwoAWTaIBBNU5DWatlzIj
oyZ9ZoyKWz+vCwgQDQLOkOVz8+Gk4SsBZniieeWOr5s1CBKGZnEwFBnLmXpcffLs
ir4xTW9I/2y6Jn0aPRNthwhKcWpqmNj/SPkWti1+N92ZYSP9GlvTl3auVzdJuXDS
cBXJJY6G/XO1nO+StGzn00XyPCMQns3XW0gMsSe7jMPwICfd9go5i++sP6LfmAhx
gFtSV1EnHyPcPVOTPZnM28r+1g26eqiCVMbvTNcC6kziBUT6z9xQFrnbnL25psf+
8u/tBXj2JGyEOVKk9itvX8EnFNTygZQHeOZH3n6EwJLOwaS8uQINBF9LdpgBEAC2
rEVCbNDmQb0DUHyAwVhrXqMVhaQFDPWbuyd8NnVeSRd3p0h57Hu8igyuRYihithz
iNiROZqNR1F1dYYbB6QC3V43dzHVKm3xkJwO+Txkk7cTQQsb+qb9mWDHSXz1/SbI
S0IY/w06y872n7LGjNb0ZO9KOqo90T7qLQI39dGu2MGz8pK5K4j1KcjKWNnF1J9D
8IGZdeq8FX6NTV+AWVy6WZMucuThiRzyQjY3Wb35YfvbwuhQoH9C+E6+aWmvyOWd
Kax7YYRA+2E4dX/koubA9VsyLi7J4SyzqesKopxjm66zYqq1HqSXqyUiQo+9nWB4
2hi0zodukjkmbcGnuk6CNP4iMrzwoZxJDrO4ZYsFd3gZGgRQDaURjTQOZhkMGYJZ
f2Tjg92luPoc/2LnnKMR6uCSNBgSrqU/Ub+BoA03fYmMoy7SgQW1vucd/q/TzTl4
/EJFmi7Lw78+ZJx4Ps9sjVI0xQ4dMWJ8VPFK5cr3DS6QwWe+T4PI3H/7iCiohc2o
0B3OweVD17U9nX7HGMlFVmtTPt9g86W7RIwoBpk7+fH+u+xl8zibNCWNMWCvGhdi
SulHHb3js2iHR3w1m0s0freDjLSQDAmHAuxdknivL4Dm5vWmiy7fB+atiYP+ZzUv
RRQWgIwk+fV1831izvGMSUxjzjduLL6X37NIQsWAgQARAQABiQI2BBgBCAAgFiEE
ldg0p7T4xCTv9BqkT5/C5vRYJTwFAl9LdpgCGyAACgkQT5/C5vRYJTxRxw/+Kove
1c1i+bbyeIvYl7f558N81DBZtupIQS61iHJqDQ8kUkXBFX82+xIfxxy9eSPGs9Gj
EW+QZ243q73fsmfqLdet/m1vTSpF5uW8PxSj1LDy1BbT+aUSZyZVuftDwhsVT6XZ
fLoW/V855qZYd6kp4wW5MshtZIGsTqkxAvC809xfM8BbYvquX2t1CNpdcozBc/af
xEx9BktgnjbNxk0x7AErTHqZ+OqJTk4CpP7YTNjPm8GJK/JnkjJTiZEAb7gqW7OD
zBhoY3mhIlt4Y2BBZ0k/4FF+KmghRkL3rjImXhjG2SU9UIMm3In5y4FKRkkqEEB3
aBp6jo4AbIflmlZg52gnKc1jC5MnjS3dTQoDExSo6ynK6b60X/ny/E6IpSe47jw4
yDUVSAK68Ci0QAgjTvU2iofI68xVrz5hAZSwiKyyKVsbNN4zg6zxKJu/87Jx8161
mzsKo+kkl5DNM2MX5Wdh6FEcaoB8AyGF+091AXWxlDj6X1luscafxfvvdJEno/Ay
MFtJkI49qQ4Dso9KsicUikgr28UU5lzfpbax3C0JCIQt1JnrCqaU1S115dQJ5i0s
cbos9mSswME2kzNNP64e4MgfsozUI2wv5PLX8h8DtChWw62aKJLqOlcDb5cAn4o9
Kz/vRbZQpKOqN0CA14lRSYoLt6zyIyQts9wzgbG5Ag0EX0t2mAEQAIvKRzbXABn0
4oB7CPeNJXi31GrSXA8ljpO/HC2pxr4uBPeN93FjM55ACL7Y52FzRBsERQgR8DdT
WGY2fFfHgz536aa0Q6qkzsnVxhCeb1phf+ODpxrcG2wGRDxdkxEoRBt9TFua8ZU7
rO1Y73pL95aK9NCF3ruAsrjWb8ksPm2cnFBFnNOnp4p6ykStM//vLrSvDklxFKTD
rhVuVagvoc5K5EdvikS42T046ehxCUzixB55/ePw7Jv3ovgkxYlC2KXZSotUxboL
IWEQ+3BXwkoGQCboO/NuXzulCvmNFejtRbsgJNeRDJhmPlmguzXi+14WFxGPp9is
5iKfEJthdX2dE1Nt0Whhr4GApQCNrlgbhxjN+3JgLYfKez0eHQ0bXND1m86J8URZ
geiayJxAFWrufdUBHQbK6NbKxohdRzt1fZjUpFiWX11RXWh9al3g8yeMoG9BZveR
CycU1WCVMxiK+BBl7/DyzfJx37gt9LHU0OrgXpsQM0t9jB4Ypy/qfonAePrcOrLP
7T/Z0eCvYpdrWv0VOtDOcONST3tFRrb04H873x//T0R7/LeBD0i8g2fGI8GhShBu
C8XdchYbeK28Zk6f/tsyof9g4eKYaOwQsLMk+ft+Ij/3h8FluZ1Hr4w7wYUXcSKc
hXQ3vMVthBd+Ccgyf/CJmB1OMX7gBe2RABEBAAGJAjYEGAEIACAWIQSV2DSntPjE
JO/0GqRPn8Lm9FglPAUCX0t2mAIbDAAKCRBPn8Lm9FglPO3nD/0Qlp+zUVrg057q
NlYabJFXTxMEQhPC+3RG4CEOSq+kSz61GtsiW8GAxTRLiLykB5aoD+XvkePYAF9K
VhXDtXtipYOYMatavYRpOEG9TaipiaWCHgBeXyYhNPCcIEmIJCn2YYWIfFvRLtZ9
o+OXE9Y6VmHHZ6Q719ka/sTfCyCMIukhS0jyZCFwdNNsiE0EoYXOaBgl9ZCo4SA/
QvXTNcjOiOx/BMuHAWVMTAMnu6sSoWkBVHgYkP92iFVKn6wkbZJ/qbON0irZjGgH
3ZD+T8lrxZcOUMpSmmuVYIyJaUCboFCN8YHXW5zFp5j64z74MNIA5BtfyR46EPB/
QC7VzyejbGHrxelPI54brXF3GOZVfnpITvl+y/x3w30C46ET6ZPSoI3zLe0Eng4L
ObBX+UWvfAJ9cSDlrhxUHVJQAZ1KrxhtGcLNjBvlKQ/LN8cEXzHLgOypMeF9atSm
jO6r2E/4dVPoV5pER+TQjZqH/MLaKfccIc2Lo/yY+mfDkNhqqfeayZdnDtlxtRre
NRtfumeQ4YnESLwG2XjJCdQQ6LR49ZH2tsGtGNBAat7Zhgms7Ce5vGScnjB7sR7y
hYktJhA5fZNNoAb1bY/eA96BROK6r6X7M93sE4Gy5pVlUnbECfJE5HjsMTkuqFjd
IzDlVzSwrK8D4rWTJl87lVJoJWDiQw==
=Ll0y
-----END PGP PUBLIC KEY BLOCK-----

Export des public-key auf einen Keyserver

Den zuvor exportierten public key können wir nun in einem WEB-Formular auf einem Keyserver manuell eintragen. Oder wir exportieren diesen direkt aus dem öffentlichen Schlüsselring:

 $ gpg --keyserver keys.openpgp.org --send-key 4F9FC2E6F458253C
gpg: sending key 4F9FC2E6F458253C to hkp server keys.gnupg.net

Um nun nicht jedesmal den Keysever manuell angeben zu müssen, hinterlegen wir diesen in der Konfigurationsdatei ~/.gnupg/gpg.conf.

 $ vim ~/.gnupg/gpg.conf
...
# Djangos bevorzugter Keyserver, eingetragen am 28.04.2009
keyserver hkp://keys.gnupg.net

Nunmehr reicht ein:

 $ gpg --send-key 4F9FC2E6F458253C
 gpg: sending key 4F9FC2E6F458253C to hkp server keys.gnupg.net

Ob man in Zeiten von Überwachungsphantasten in Unternehmen und vor allem auch bei einer NSA oder BND, noch RSA-Schlüssel einsetzen kann und mag, muss natürlich jeder Admin für sich selbst entscheiden.

Der Sicherheitsguru Bruce Schneier hat in seinem Blog hierzu eine eindeutige Aussage getätigt:

„On the crypto bits in your guardian piece, I found especially interesting that you suggest classic discrete log crypto over ecc. I want to ask if you could elaborate more on that.“ I no longer trust the constants. I believe the NSA has manipulated them through their relationships with industry.

EED25519 ist ein Elliptic Curve Signature Schema, welches beste Sicherheit bei vertretbaren Aufwand verspricht, als ECDSA oder DSA dies der Fall ist. Zur Auswahl sicherer kryptografischer Kurven bei der Elliptic-Curve Cryptography findet man auf der Seite hier hilfreiche Erklärungen und eine Gegenüberstellung der möglichen verschiedenen Alternativen.

Mit Hinblick auf die möglichen Unsicherheiten im Bezug auf die RSA-Schlüssellänge4) werden wir uns ersteinmal nicht mit diesen Defaultwerten begnügen, sondern die maximale RSA-Schlüssell#nge von 4096 bit verwenden.

Will oder muss man weiterhin auf RSA-Schlüssel zurückgreifen, ist wenigstens auf eine ausreichend große Schlüssellänge zurück zu greifen! Bei der initialen Einrichtung unseres Nitrokey Pro hbaen wir bei der Definition der Schlüsseleigenschaften bereits einen RSA-Key mit einer Länge von 4096 bit definiert. In aller Regel wird dies entsprechend ausreichen.

SSH Client vorbereiten

Damit wir beim Verbindungsaufbau auf den Authentication Key zugreifen können, müssen wir unseren Client entsprechend vorbereiten.

Hierzu aktivieren wir zunächst die Option enable-ssh-support in der Konfigurationsdatei ~/.gnupg/gpg-agent.conf des GPG-Agenten.

 $ vim ~/.gnupg/gpg-agent.conf
~/.gnupg/gpg-agent.conf
# File re-created by pEp
# See backup in '/home/django/.gnupg/gpg-agent.conf.1.pep.bkp'
 
# File re-created by pEp
# See backup in '/home/django/.gnupg/gpg-agent.conf.0.pep.bkp'
 
default-cache-ttl 300
max-cache-ttl 999999
 
# Django : 2020-08-05
#          SSH-Unterstützung beim gnupg-agent aktiviert 
enable-ssh-support

Anschließend müssen wir noch die Datei ~/.bashrc erweitern, damit der SSH_AUTH_SOCK für den Zugriff des SSH-Schlüssels auf dem Nitrokey Start genutzt werden kann.

 $ vim ~/.bashrc
~/.bashrc
# .bashrc
 
# Source global definitions
if [ -f /etc/bashrc ]; then
        . /etc/bashrc
fi
 
# User specific environment
PATH="$HOME/.local/bin:$HOME/bin:$PATH"
export PATH
 
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
 
# User specific aliases and functions
 
# Django : 2020-08-05
#          Definition des SSH_AUTH_SOCK für den Zugriff des SSH-Schlüssels auf dem Nitrokey Start
unset SSH_AGENT_PID
        if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
        export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi

Damit unsere Änderungen aktiv werden, müssen wir nun zum Schluss noch den pgp-agent restarten bzw. einen Neustart des Clients erwirken. Der Einfachheit halber für den pragmatischen weg und melden uns einmal von unserer X-Session an unserem Clientrechner ab und wieder an!

Public-Key des RSA4096-Keys für SSH exportieren

Für den Zugriff auf unser Ziel-System mit Hilfe der SSH benötigen wir noch den öffentlichen Schlüssel unseres Authentication Keys, den wir nun exportieren werden. Zunächst besorgen wir uns die betreffende Schlüsselkennung des Autentication Keys, genauer gesagt die 4 letzten Zahlenreihen des nachfolgenden Aufrufs.

 $ gpg --card-status | grep Authentication\ key
Authentication key: 765D 1F7C 8AF0 1360 30FF  FB20 872B 620E 5C5D 1F71

In diesem Konfigurationsbeispiel ist die Schlüssel-ID des Autentication Keys also die Nummer 872B620E5C5D1F71 (also die vier letzten vierer Blöcke).

Nun exportieren wir den öffentlichen Schlüssel und schreiben diesen in eine separate Datei.

 $ $ gpg --export-ssh-key 872B620E5C5D1F71  >> ~/.ssh/872B620E5C5D1F71.pub

Der Öffentliche Schlüssel in diesen Konfigurationsbeispiel lautet also:

 $ cat ~/.ssh/872B620E5C5D1F71.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCa1OmylijwG9NXLN7OukmiZAtITHOFkEdb4ztmgL87h+Bn4PbEvMcErbXqCEtLTZK8IQYg+7JU1/Nw+FJyqjk2PAaCnrdEUm8aLRGS1/RPv6MCtbVFkqjVO6mp+PDfPURcMKeJrNVIYdJHmQO7UBLCUKCm8HNrPGEZDrOoN0jvxLSss1Cgu30d8eu3TZmAZBt+kHpUeIuovJD6kGHDZk5MVoDWz+w2/f6AisVhnNTND+D7cLwFpDL7aFOZd1CI6a3pIOc1V7dWnWSYtvJWukNbeh1J0cm04QK8e2L5+A7PmdxqXGXBo6U1al4XFb55I51BYDblkc6h5KRbSDUhXlfD8Iaqrq1lR9cMURYfLovnk5botf7CcMZh/pyj6g1xgkqaddS9m5f7mBEitSmOCAAjHXpxkienwT7DidbMLhUJ+uUFRx2XhjQWAep2l+ZM4FRljFllAGETzxVFR/S7U1fzqU2VF+u5XIh1vGi4MdPKHDtmU1gLBHBsvpsYHUz2AR7Q5rUFKHqpY+24iDRYJp//HrBRkLNNPFYAzEfX/WCk8znuX67vloG7i4vlVowQmiCBN2E3gv3Z+liPYLaKbfmS35+3LcxuQA/nwW/gW9SbGt75RA+hDt62KxMF9QZVvz4DDefp3qvIkP5PFOG/WLfrjxPLptxo0A8jZhcsSOOwxQ== openpgp:0x5C5D1F71

Diesen Schlüssel kopieren wir nun auf das entsprechende Zielsystem an Ort und Stelle ~/.ssh/authorized_keys.

 $ scp ~/.ssh/872B620E5C5D1F71.pub zielhost.dmz.nausch.org: && ssh zielhost.dmz.nausch.org 'cat authorized_keys >> ~/.ssh/authorized_keys'

SSH-Verbindung aufbauen

Nun können wir wie gewohnt eine Verbindung zu unserem entfernten System aufbauen.

 $ ssh zielhost.dmz.nausch.org

bzw.

 $ ssh <IP-Adresse-des-Zielhosts>

Bild: Bildschirmhardcopy beim Verbindungsaufbau / Passwortabfrage der SSH

Da der SSH-Key zur Authentication nicht im Dateisystem liegt, sondern auf der SmartCard des Nitrokey werden wir nun nach der User-PIN gefragt, damit auf den privaten Schlüssel der Karte zugegriffen werden kann.

Bild: Bildschirmhardcopy beim einer Remote-Verbindung via SSH

Der entsperrte Schlüssel der SmartCard des Nitrokey Start wird nur für den Verbindungsaufbau zum Zielsystem verwendet. Bei jedem erneuten SSH-Verbindung müssen wir erneut bei angestecktem Nitrokey Start die PIN Nummer zum Entsperren eingeben!

PGP

Unseren zuvor auf dem Nitrokey Pro erzeugtem Schlüsselmaterial wollen wir nun verwenden, um bei Thunderbird unsere elektronische Kommunikation per eMail abzusichern.

Bei Thunderbird 68.10.0 (64-bit) ist es angeraten nicht das benötigte add-on Enigmail via apt zu installieren, sondern direkt über den zugehörigen Menüpunkt in der Anwendung selbst!

Über das Menü (das Icon mit den drei Querstreifen rechts oben am Bildschirm) wählen wir den Menüpunkt Add-ons aus.

Bild: Bildschirmhardcoby von Thunderbild - Auswahl Add-ons Menü

Hier suchen wir dann über die Suchoption nach dem Add-on EnigMail.

Bild: Bildschirmhardcoby von Thunderbild - Auswahl Add-ons Menü

Zum Installieren klicken wir auf die grüne Schaltfläche + Add to Thunderbird beim angezeigtem Add-on EnigMail.

Bild: Bildschirmhardcoby von Thunderbild - Auswahl Add-ons Menü

Es öffnet sich ein Dialogfenster bei dem angezeigt wird, ob GnuPG im system vorhanden ist.

Bild: Bildschirmhardcoby von Thunderbild - Installation /Prüfung der Anhängigkeiten

Anschließend wird nach gültigem Schlüsselmaterial gesucht.

Bild: Bildschirmhardcoby von Thunderbild - Importieren des vorhandenen Schlüsselmaterials

Nun müssen wir die PGP-Unterstützung und den zugehörigen PGP-Key dem Konto zuweisen. Dazu klicken wir erneut auf das Menü-Icon rechts oben am Bildschirm (das Icon mit den drei Querstreifen) wählen nun den Menüpunkt Preferences aus.

Bild: Bildschirmhardcoby von Thunderbild - Auswahl Preferences Menü

Die Einstelungen zu den Konten finden wir unter dem Menüpunkt Account Settings.

Bild: Bildschirmhardcoby von Thunderbild - Auswahl Account-Settings Menü

Bei betreffenden Konto klicken wir dann auf die Schaltfläche [ OpenPGP Security ] und wählen den zur eMail-Adresse gehörigen PGP-Key, der auf dem Nitrokey generiert und gespeichert wurde, aus.

Bild: Bildschirmhardcoby von Thunderbild - Auswahl PGP-Schlüssel bei den Account Einstellungen

Sobald wir nun eine Nachricht verschicken die signiert werden soll, wird vor dem Versand die PIN abgefragt und die Nachricht mit dem Signatur-Unterschlüssel unterschrieben.

Bild: Bildschirmhardcoby von Thunderbild - Abfrage User PIN bei Versand/Signierung einer eMail

Sobald wir eine verschlüsselte Nachricht öffnen, werden wir nach der PIN gefragt, damit der Schlüssel zum Entschlüsseln auf der SmartCard freigeschalten werden kann.

Bild: Bildschirmhardcoby von Thunderbild - Abfrage User PIN beim Versuch eine verschlüsselte eMail zu öffnen

Nach eingabe der USER-PIN wird die Anchricht mit Hilfe des secret-keys auf der OpenPGP-SmartCard entschlüsselt und angezeigt.

Bild: Bildschirmhardcoby von Thunderbild - Auswahl Add-ons Menü

Über die Schaltfläche [ Details V ] können wir uns Details zu der verschlüsselten Nachricht bzw. zum verwendetetn Schlüssel anzeigen lassen.

Bild: Bildschirmhardcoby von Thunderbild - Auswahl Add-ons Menü

S/MIME (X.509)

Vorbereitungen - micro-ca-tool und libengine-pkcs11-openssl

Damit wir ein X.509-Zertifikat bei einer CA5) bezioehen können, benötigen wir einen CSR6). Für die Erstellung dieses CSRs verwenden wir das micro-ca-tool.

Bevor wir es von GitHub herunterladen installieren wir noch die benötigte libengine:

 $ sudo apt install libengine-pkcs11-openssl

Anschließend legen wir uns ein entsprechendes Verzeichnis für das Toool im Homeverzeichnis ~/ unseres Admin-Users an.

 $ mkdir ~/nitrokey
 $ cd  ~/nitrokey

Dann Clonen wir das Projekt.

 $ git clone https://github.com/sektioneins/micro-ca-tool.git

Anschließend verlinken wir noch das ausführbare Shell-Script, welches uns die Arbeit entsprechend vereinfachen wird.

 $ ln -s ~/nitrokey/micro-ca-tool/micro-ca-tool ~/bin/micro-ca-tool

Mit der Option -h können wir uns einen Hilfetext von micro-ca-tool anzeigen lassen.

 $ micro-ca-tool -h
                 mmm    mm         mmmmmmm               ""#
 m   m         m"   "   ##            #     mmm    mmm     #
 #   #         #       #  #           #    #" "#  #" "#    #
 #   #   """   #       #mm#   """     #    #   #  #   #    #
 #mmm#m         "mmm" #    #          #    "#m#"  "#m#"    "mm
 #
 "               (C) 2015 SektionEins GmbH / Ben Fuhrmannek
                 https://sektioneins.com/
                 https://github.com/sektioneins/micro-ca-tool
[#] Version: 0.1

Welcome to µ-CA.
This tool will help you to perform basic tasks with your CA:
* Create CA as files
* or Create CA on a SmartCard
* or Create CA as files and store on SmartCard
* Create intermediate CA
* Sign other certificates
* Backup CA key with n-of-m scheme key sharing
* Create client certificates
* Basic SmartCard functions: Info, Read, Write, Generate keys, Reset

SECURITY NOTE: This tool handles secret keys. As such it is best to follow the 
following guidelines:
* Use this tool only on single-user and non-networked systems.
* Make sure files are stored on an encrypted filesystem only. E.g. copy this 
script to a crypto-container.
* Do not leave unencrypted private keys when done. Better encrypt them for 
backup or store them on an HSM.
* When done, unmount the encrypted filesystem.

[#] Usage: /home/django/bin/micro-ca-tool [-c <config>] [-v] [-h] [<menu> <submenu>]
[#]   -c  specify alternative config file
[#]   -v  be verbose
[#]   -h  show this help message
[#]  optional [<menu> <submenu>] directly calls a function, then exits.
CSR mit Hilfe des micro-ca-tool erstellen

Den CSR7) oder auf Deutsch Zertifikatsignierungsanforderung erstellen wir der Einfachheit halber mit Hilfe des micro-ca-tool.

Das Tool hält alle relevanten Konfigurationsparameter in einer zugehörigen Datei micro-ca-tool.config vor.

 $ cat micro-ca-tool.config
micro-ca-tool.config
## autogenerated config file for micro-ca-tool 0.1
cfg_app_openssl="/usr/bin/openssl"
cfg_app_pkcs15_init="pkcs15-init"
cfg_app_pkcs15_tool="pkcs15-tool"
cfg_file_engine_pkcs11="/usr/lib/x86_64-linux-gnu/engines-1.1/libpkcs11.so"
cfg_file_opensc_pkcs11="/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so"

Nun erzeugen wir uns einen CSR denn wir später bei der CA unseres Vertrauens einreichen vund bitten werden, dass diese den CSR signieren und uns siomit ein Zertifikat auisstellen mögen.

Wir müssen dem micro-ca-tool nun nur noch folgende Parameter mitgeben

  • Subject : Im Falle eines X.509 für eMailverschlüsselung ist diese die eMailadresse des betreffenden Kontos, in unserem Falle also /CN=django@nausch.org
  • CSR Filename : Dateiname der CSR-Datei
  • Private Key : Zum Erstellen und Signieren des CSR muss des Tool wiossen wo es den privatzen Schlüssel auf der Karte findet. Wir lassen uns also erst einmal zur Sicherheit den Inhalt der OpenPGP-SmartCard anzeigen.
     $ micro-ca-tool sc i
                    mmm    mm         mmmmmmm               ""#
     m   m         m"   "   ##            #     mmm    mmm     #
     #   #         #       #  #           #    #" "#  #" "#    #
     #   #   """   #       #mm#   """     #    #   #  #   #    #
     #mmm#m         "mmm" #    #          #    "#m#"  "#m#"    "mm
     #
     "               (C) 2015 SektionEins GmbH / Ben Fuhrmannek
                     https://sektioneins.com/
                     https://github.com/sektioneins/micro-ca-tool
    [#] Version: 0.1
    Using reader with a card: Nitrokey Nitrokey Pro (000034D40000000000000000) 00 00
    Private RSA Key [Signature key]
    	Object Flags   : [0x03], private, modifiable
    	Usage          : [0x20C], sign, signRecover, nonRepudiation
    	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
    	ModLength      : 4096
    	Key ref        : 0 (0x00)
    	Native         : yes
    	Auth ID        : 01
    	ID             : 01
    	MD:guid        : 48870840-df64-70eb-2bc0-105a4f678b41
    
    Private RSA Key [Encryption key]
    	Object Flags   : [0x03], private, modifiable
    	Usage          : [0x22], decrypt, unwrap
    	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
    	ModLength      : 4096
    	Key ref        : 1 (0x01)
    	Native         : yes
    	Auth ID        : 02
    	ID             : 02
    	MD:guid        : 7b0d3403-7bbc-a9cc-a3e2-213e3296ecb2
    
    Private RSA Key [Authentication key]
    	Object Flags   : [0x03], private, modifiable
    	Usage          : [0x222], decrypt, unwrap, nonRepudiation
    	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
    	ModLength      : 4096
    	Key ref        : 2 (0x02)
    	Native         : yes
    	Auth ID        : 02
    	ID             : 03
    	MD:guid        : c805d2b2-2d84-3703-089a-3d691d17e5b3
    
    Public RSA Key [Signature key]
    	Object Flags   : [0x02], modifiable
    	Usage          : [0xC0], verify, verifyRecover
    	Access Flags   : [0x02], extract
    	ModLength      : 4096
    	Key ref        : 0 (0x00)
    	Native         : no
    	Path           : b601
    	ID             : 01
    
    Public RSA Key [Encryption key]
    	Object Flags   : [0x02], modifiable
    	Usage          : [0x11], encrypt, wrap
    	Access Flags   : [0x02], extract
    	ModLength      : 4096
    	Key ref        : 0 (0x00)
    	Native         : no
    	Path           : b801
    	ID             : 02
    
    Public RSA Key [Authentication key]
    	Object Flags   : [0x02], modifiable
    	Usage          : [0x51], encrypt, wrap, verify
    	Access Flags   : [0x02], extract
    	ModLength      : 4096
    	Key ref        : 0 (0x00)
    	Native         : no
    	Path           : a401
    	ID             : 03
    

    In unsererm Fall ist das der Schlüssel 01:01.

    Using reader with a card: Nitrokey Nitrokey Pro (000034D40000000000000000) 00 00
    Private RSA Key [Signature key]
    	Object Flags   : [0x03], private, modifiable
    	Usage          : [0x20C], sign, signRecover, nonRepudiation
    	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
    	ModLength      : 4096
    	Key ref        : 0 (0x00)
    	Native         : yes
    	Auth ID        : 01
    	ID             : 01
    	MD:guid        : 48870840-df64-70eb-2bc0-105a4f678b41

Wir rufen nun also das Tool micro-ca-tool wir folgt auf und geben dann die entsprechenden Daten an:

 $ micro-ca-tool sc new-csr
                 mmm    mm         mmmmmmm               ""#
 m   m         m"   "   ##            #     mmm    mmm     #
 #   #         #       #  #           #    #" "#  #" "#    #
 #   #   """   #       #mm#   """     #    #   #  #   #    #
 #mmm#m         "mmm" #    #          #    "#m#"  "#m#"    "mm
 #
 "               (C) 2015 SektionEins GmbH / Ben Fuhrmannek
                 https://sektioneins.com/
                 https://github.com/sektioneins/micro-ca-tool
[#] Version: 0.1
[?] Subject [/CN=Hans Wurst] /CN=django@nausch.org
[?] CSR Filename [usercert-0094.csr] django-nausch.org-csr.pem
[?] Private Key (<Auth-ID>:<Key-ID>) [02:03] 01:01
OpenSSL> (dynamic) Dynamic engine loading support
[Success]: SO_PATH:/usr/lib/x86_64-linux-gnu/engines-1.1/libpkcs11.so
[Success]: ID:pkcs11
[Success]: LIST_ADD:1
[Success]: LOAD
[Success]: MODULE_PATH:/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so
Loaded: (pkcs11) pkcs11 engine
OpenSSL> engine "pkcs11" set.
Enter PKCS#11 token PIN for OpenPGP card (User PIN (sig)):
OpenSSL>

Nach Eingabe der USER-PIN wird der CSR im aktuell genutzten Pfad gespeichert. Bei Interesse können wir mit dem Befehl openssl uns den Inhalt dieses CSRs ausgeben und anzeigen lassen.

 $ openssl req -noout -text -in django-nausch.org-csr.pem
Certificate Request:
    Data:
        Version: 1 (0x0)
        Subject: CN = django@nausch.org
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                RSA Public-Key: (4096 bit)
                Modulus:
                    00:9d:ff:71:02:88:0f:9f:68:7a:04:13:97:76:7f:
                    d5:93:0a:29:5f:4d:07:b5:1e:1f:44:8a:21:f4:76:
                    33:52:a1:85:1c:6d:81:da:52:18:01:7c:53:0e:35:
                    8a:df:0e:97:b9:90:d5:f2:20:2d:ab:92:8a:4f:4e:
                    40:ba:99:70:2a:d3:6c:32:9c:47:45:e2:b6:35:62:
                    71:60:e4:ae:00:7c:39:90:32:d6:bf:69:18:7e:19:
                    a2:9d:92:20:69:95:47:18:ed:01:87:11:ea:04:8b:
                    26:79:56:d4:76:3a:c1:68:25:b7:13:0f:58:41:fd:
                    2d:33:b9:e4:80:ab:da:25:e1:65:b0:9d:52:61:4d:
                    49:e9:6e:60:ef:7a:67:e0:e3:07:0e:86:49:36:51:
                    dc:31:89:95:ad:cc:d4:b6:72:f8:91:82:c2:05:d6:
                    54:6b:c3:30:ac:dc:e5:65:c9:08:01:8a:e3:f5:f9:
                    7c:47:06:c7:16:24:81:f0:6b:0c:78:f9:fa:cc:7a:
                    73:b0:4d:a7:c1:c3:d8:cc:da:1c:ae:a8:91:34:4a:
                    9f:7e:87:fe:1f:48:2b:17:fb:1c:10:bd:32:3c:29:
                    4e:98:e0:d0:53:24:7a:ae:09:9e:0b:40:98:68:65:
                    57:fd:c2:86:a3:5e:a1:ec:c6:60:72:63:bb:b3:b3:
                    95:e6:ac:8f:56:fd:37:3e:25:c8:f7:4c:a5:e6:d8:
                    ab:f6:f6:8b:63:ff:bc:1f:5f:28:8f:5b:c4:43:11:
                    65:d7:1d:1d:ca:e7:89:bc:95:4b:ca:64:c1:d2:d4:
                    2e:61:01:0d:78:56:5e:04:5a:00:e0:e7:93:ca:61:
                    c2:2f:d4:03:ce:fd:68:98:be:d1:4f:d6:b8:cb:40:
                    1c:7d:fe:6d:33:76:70:50:9e:69:54:d0:d6:e9:8a:
                    85:aa:37:ee:ce:94:8d:b1:ad:54:9a:4d:5c:39:bf:
                    0b:24:06:62:b6:05:dd:ee:17:47:04:17:5e:f3:6a:
                    a6:b1:cc:c4:c0:70:3c:43:3b:c1:ea:e2:73:68:41:
                    22:8f:a4:d6:14:9e:5e:50:de:e0:f3:de:df:5d:a1:
                    bd:44:41:3a:ba:27:78:4c:78:39:8b:f1:60:17:8b:
                    99:61:b3:13:29:7f:d4:02:14:76:42:34:39:00:e5:
                    9d:a7:36:d3:6e:72:f9:9a:8f:0c:c5:b5:5b:14:b4:
                    fa:29:d0:28:e2:f1:d0:db:80:44:52:00:43:28:3b:
                    15:be:e1:b8:1e:b1:10:5d:71:b2:e6:8c:2b:7a:a8:
                    f3:90:8d:b7:29:d8:58:ce:36:e2:7e:59:b7:11:b8:
                    ec:c7:41:22:07:ec:ce:83:67:10:c4:4a:b0:92:12:
                    4b:a2:59
                Exponent: 65537 (0x10001)
        Attributes:
            a0:00
    Signature Algorithm: sha256WithRSAEncryption
         8a:8e:89:d6:8b:b1:01:b4:92:0c:f6:1e:64:0e:8a:d3:ab:22:
         46:f7:47:f7:2e:32:a9:7d:33:51:31:78:7c:a1:fd:21:25:22:
         c9:38:45:32:56:2f:34:8b:88:a7:24:f3:6f:28:bd:c1:96:fc:
         7f:3f:e6:2e:80:0d:71:81:d5:01:63:38:d7:3e:aa:e8:e1:a8:
         3d:0a:d6:b1:6d:15:d1:f3:d2:9f:a7:56:c5:f1:74:fb:ad:bc:
         90:a2:ad:4d:ec:fc:dd:35:fb:a2:30:7d:87:32:5c:e9:b2:9c:
         86:e9:89:48:d3:9d:f1:4a:ec:a0:ba:6f:08:d5:7a:29:37:54:
         60:69:a0:f8:12:87:ff:02:d5:37:ca:8a:42:57:8e:96:36:f7:
         e6:b0:97:51:01:03:d8:db:73:21:65:52:c4:3d:d6:51:c9:ef:
         1d:b9:1a:cb:d0:b9:50:ab:5c:46:ab:0b:9c:66:92:30:08:52:
         bd:74:09:2b:37:e8:6c:39:0f:9a:c3:cc:ed:3b:77:07:f8:d4:
         ec:c7:32:76:78:0c:31:af:57:9d:cd:29:f0:5f:ad:5e:cd:c4:
         21:be:2a:5f:c9:82:a6:db:47:23:cd:8a:71:81:4e:13:04:e2:
         31:b3:fb:d6:52:c9:65:42:0f:5d:b5:b3:8a:c9:fb:b4:f6:2b:
         f4:44:ec:45:8a:00:96:f0:a0:19:6d:e6:bd:0d:5f:59:68:09:
         9d:c0:f1:d4:c4:e8:37:fd:0e:6f:fb:a9:48:69:27:2e:3b:3e:
         9e:d7:5b:3e:08:f2:f6:9a:82:b5:a6:e3:7f:0f:b9:a7:34:1a:
         f5:7a:d6:e9:62:1e:d7:c9:2e:6c:dd:88:87:b4:82:ef:3e:e9:
         ff:35:05:ca:fe:f5:2e:1e:fd:44:0a:06:ba:cd:95:5f:99:79:
         2b:0f:a8:b3:13:2a:a2:0e:32:66:bb:82:9a:bb:e5:73:82:32:
         20:6b:af:56:8a:c8:49:16:07:7d:f1:9d:7b:7c:99:00:f7:e0:
         69:68:17:6b:8a:25:1c:98:45:20:35:41:d3:3a:42:ae:c3:67:
         b8:21:5b:f4:21:0a:54:99:59:1e:28:ed:79:a0:e4:ac:11:de:
         91:ca:4c:1a:38:ac:83:15:ea:82:2c:c8:7e:33:9c:ec:34:90:
         4c:58:85:b5:6d:2a:80:b2:7c:c6:49:3d:46:99:83:cd:8f:08:
         67:a5:c7:8d:ea:66:d3:2f:59:3b:09:59:0f:e1:69:62:e1:7c:
         e2:c8:04:7d:6d:bb:27:63:08:c1:fc:5a:1c:07:89:1e:1b:37:
         84:79:63:33:22:bc:6a:58:5a:3e:55:30:6f:d0:79:0d:1a:59:
         f9:20:49:1a:fd:75:65:1a

Die Date laden wir nun entweder auf der WEB-GUI der CA hoch oder kopieren den Inhalt der Datei und fügen diese im Betreffenden Formularfeld ein, welches die CA zur Verfügung stellt.

 $ cat django-nausch.org-csr.pem
-----BEGIN CERTIFICATE REQUEST-----
MIIEZjCCAk4CAQAwITEfMB0GA1UEAwwWZGphbmdvQG1haWxzZXJ2ZXIuZ3VydTCC
AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAJ3/cQKID59oegQTl3Z/1ZMK
KV9NB7UeH0SKIfR2M1KhhRxtgdpSGAF8Uw41it8Ol7mQ1fIgLauSik9OQLqZcCrT
bDKcR0XitjVicWDkrgB8OZAy1r9pGH4Zop2SIGmVRxjtAYcR6gSLJnlW1HY6wWgl
txMPWEH9LTO55ICr2iXhZbCdUmFNSeluYO96Z+DjBw6GSTZR3DGJla3M1LZy+JGC
wgXWVGvDMKzc5WXJCAGK4/X5fEcGxxYkgfBrDHj5+sx6c7BNp8HD2MzaHK6okTRK
n36H/h9IKxf7HBC9MjwpTpjg0FMkeq4JngtAmGhlV/3ChqNeoezGYHJju7Ozleas
j1b9Nz4lyPdMpebYq/b2i2P/vB9fKI9bxEMRZdcdHcrnibyVS8pkwdLULmEBDXhW
XgRaAODnk8phwi/UA879aJi+0U/WuMtAHH3+bTN2cFCeaVTQ1umKhao37s6UjbGt
VJpNXDm/CyQGYrYF3e4XRwQXXvNqprHMxMBwPEM7weric2hBIo+k1hSeXlDe4PPe
312hvURBOroneEx4OYvxYBeLmWGzEyl/1AIUdkI0OQDlnac2025y+ZqPDMW1WxS0
+inQKOLx0NuARFIAQyg7Fb7huB6xEF1xsuaMK3qo85CNtynYWM424n5ZtxG47MdB
IgfszoNnEMRKsJISS6JZAgMBAAGgADANBgkqhkiG9w0BAQsFAAOCAgEAio6J1oux
AbSSDPYeZA6K06siRvdH9y4yqX0zUTF4fKH9ISUiyThFMlYvNIuIpyTzbyi9wZb8
fz/mLoANcYHVAWM41z6q6OGoPQrWsW0V0fPSn6dWxfF0+628kKKtTez83TX7ojB9
hzJc6bKchumJSNOd8UrsoLpvCNV6KTdUYGmg+BKH/wLVN8qKQleOljb35rCXUQED
2NtzIWVSxD3WUcnvHbkay9C5UKtcRqsLnGaSMAhSvXQJKzfobDkPmsPM7Tt3B/jU
7McydngMMa9Xnc0p8F+tXs3EIb4qX8mCpttHI82KcYFOEwTiMbP71lLJZUIPXbWz
isn7tPYr9ETsRYoAlvCgGW3mvQ1fWWgJncDx1MToN/0Ob/upSGknLjs+ntdbPgjy
9pqCtabjfw+5pzQa9XrW6WIe18kubN2Ih7SC7z7p/zUFyv71Lh79RAoGus2VX5l5
Kw+osxMqog4yZruCmrvlc4IyIGuvVorISRYHffGde3yZAPfgaWgXa4olHJhFIDVB
0zpCrsNnuCFb9CEKVJlZHijteaDkrBHekcpMGjisgxXqgizIfjOc7DSQTFiFtW0q
gLJ8xkk9RpmDzY8IZ6XHjepm0y9ZOwlZD+FpYuF84sgEfW27J2MIwfxaHAeJHhs3
hHljMyK8alhaPlUwb9B5DRpZ+SBJGv11ZRo=
-----END CERTIFICATE REQUEST-----

Nach erfolgter Verifizierung durch die CA wird uns diese ein Zertifikat präsentieren oder zum Download anbieten.

 $ vim django-nausch.org-certificat.pem
-----BEGIN CERTIFICATE-----
MIIGfzCCBGegAwIBAgIDFKmlMA0GCSqGSIb3DQEBCwUAMHkxEDAOBgNVBAoTB1Jv
b3QgQ0ExHjAcBgNVBAsTFWh0dHA6Ly93d3cuY2FjZXJ0Lm9yZzEiMCAGA1UEAxMZ
dEBjYWNlcnQub3JnMB4XDTIwMDgzMDE4MDgyNVoXDTIyMDgzMDE4MDgyNVowQTEY
Q0EgQ2VydCBTaWduaW5nIEF1dGhvcml0eTEhMB8GCSqGSIb3DQEJARYSc3VwcG9y
MBYGA1UEAxMPQ0FjZXJ0IFdvVCBVc2VyMSUwIwYJKoZIhvcNAQkBFhZkamFuZ29A
bWFpbHNlcnZlci5ndXJ1MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA
nf9xAogPn2h6BBOXdn/VkwopX00HtR4fRIoh9HYzUqGFHG2B2lIYAXxTDjWK3w6X
uZDV8iAtq5KKT05AuplwKtNsMpxHReK2NWJxYOSuAHw5kDLWv2kYfhminZIgaZVH
GO0BhxHqBIsmeVbUdjrBaCW3Ew9YQf0tM7nkgKvaJeFlsJ1SYU1J6W5g73pn4OMH
DoZJNlHcMYmVrczUtnL4kYLCBdZUa8MwrNzlZckIAYrj9fl8RwbHFiSB8GsMePn6
zHpzsE2nwcPYzNocrqiRNEqffof+H0grF/scEL0yPClOmODQUyR6rgmeC0CYaGVX
/cKGo16h7MZgcmO7s7OV5qyPVv03PiXI90yl5tir9vaLY/+8H18oj1vEQxFl1x0d
yueJvJVLymTB0tQuYQENeFZeBFoA4OeTymHCL9QDzv1omL7RT9a4y0Acff5tM3Zw
UJ5pVNDW6YqFqjfuzpSNsa1Umk1cOb8LJAZitgXd7hdHBBde82qmsczEwHA8QzvB
AOWdpzbTbnL5mo8MxbVbFLT6KdAo4vHQ24BEUgBDKDsVvuG4HrEQXXGy5owreqjz
6uJzaEEij6TWFJ5eUN7g897fXaG9REE6uid4THg5i/FgF4uZYbMTKX/UAhR2QjQ5
kI23KdhYzjbiflm3Ebjsx0EiB+zOg2cQxEqwkhJLolkCAwEAAaOCAUYwggFCMAwG
A1UdEwEB/wQCMAAwVgYJYIZIAYb4QgENBEkWR1RvIGdldCB5b3VyIG93biBjZXJ0
aWZpY2F0ZSBmb3IgRlJFRSBoZWFkIG92ZXIgdG8gaHR0cDovL3d3dy5DQWNlcnQu
b3JnMA4GA1UdDwEB/wQEAwIDqDBABgNVHSUEOTA3BggrBgEFBQcDBAYIKwYBBQUH
AwIGCisGAQQBgjcKAwQGCisGAQQBgjcKAwMGCWCGSAGG+EIEATAyBggrBgEFBQcB
AQQmMCQwIgYIKwYBBQUHMAGGFmh0dHA6Ly9vY3NwLmNhY2VydC5vcmcwMQYDVR0f
VR0RBBowGIEWZGphbmdvQG1haWxzZXJ2ZXIuZ3VydTANBgkqhkiG9w0BAQsFAAOC
BCowKDAmoCSgIoYgaHR0cDovL2NybC5jYWNlcnQub3JnL3Jldm9rZS5jcmwwIQYD
AgEACkbMXEhM1FGXrJUWXwkmld3vEulz62u8Frzcv/966o4qFs2UiXQ44rZNJQf6
Gu5+26SlnyjCFtF3nHVY005abfri3Bvc0BNAiibodV1SFnSk9AuHFRRSGtaw4TLk
PybeS8dq+NB376nOpdtj8xbYU6oJV479QKuHM2etgWpFWRHWsrjoBkbAQ7I5sQZb
H9a21pYqdHeElkHPlfmSI3KQ+z0vo7SLqOE3alRPZnw9CUg3rh99MP11ZB5GEDOj
Dk3TQHfWbPQ9J3G004YfPKbfz/mJnIGN3nyxRzgV/LaRtI57XOKbKoDi1Q0zSxlg
sU2Q/GEQsnCJHSLkbDMNg99YgeqMstfM6jblaaWmubIn0yyohlPj7JSmDrP0Fw/N
2xpyVq3+qZwxxUQxK3mSD4LZ6XwBiiMPWF50qibfEWNajpyi3uUcPyDeOesjtNKO
CmjnItTPUJXrFImv8S56G4Eu5PCau0PRcLP/7tflt0eEStRpL1AHzu/4gwBUu2LX
ZVBseQdtbKV6ePB58SEk6tOXNeNFtsWlrpWmlzuVH2ukaT9G/NfVc3vOx1TCylUr
3COLw+Rtw6TWRo3+izMjOREmK5O8eMHZoHaMShA3q3aAr1jwxFmk5cFU2jUzZrOh
105SyG2nNDn1ndsvyka2L57qb8j6V8Hkdig/7ond+xx+j5I=
-----END CERTIFICATE-----

Dieses Zertifikatsfile importieren wir nun mit Hilfe des Prgramms pkcs15-init in die OpenPGP Smart-Card des Nitrokey Pros.

 $ pkcs15-init --store-certificate  django-nausch.org-certificat.pem --id 3
Using reader with a card: Nitrokey Nitrokey Pro (000034D40000000000000000) 00 00
Security officer PIN [Admin PIN] required.
Please enter Security officer PIN [Admin PIN]:

Beim Import werden wir wie erwartet nach der ADMIN-PIN gefragt.

Zum Schluss können wir uns nocheinmal anzeigen lassen und somit überzeugen, dass das betreffende Zertifikat richtig importiert wurde.

 $ micro-ca-tool sc i
                 mmm    mm         mmmmmmm               ""#
 m   m         m"   "   ##            #     mmm    mmm     #
 #   #         #       #  #           #    #" "#  #" "#    #
 #   #   """   #       #mm#   """     #    #   #  #   #    #
 #mmm#m         "mmm" #    #          #    "#m#"  "#m#"    "mm
 #
 "               (C) 2015 SektionEins GmbH / Ben Fuhrmannek
                 https://sektioneins.com/
                 https://github.com/sektioneins/micro-ca-tool
[#] Version: 0.1
Using reader with a card: Nitrokey Nitrokey Pro (000034D40000000000000000) 00 00
X.509 Certificate [Cardholder certificate]
	Object Flags   : [0x00]
	Authority      : no
	Path           : 3f007f21
	ID             : 03
	Encoded serial : 02 03 14A9A5

Private RSA Key [Signature key]
	Object Flags   : [0x03], private, modifiable
	Usage          : [0x20C], sign, signRecover, nonRepudiation
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 4096
	Key ref        : 0 (0x00)
	Native         : yes
	Auth ID        : 01
	ID             : 01
	MD:guid        : 48870840-df64-70eb-2bc0-105a4f678b41

Private RSA Key [Encryption key]
	Object Flags   : [0x03], private, modifiable
	Usage          : [0x22], decrypt, unwrap
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 4096
	Key ref        : 1 (0x01)
	Native         : yes
	Auth ID        : 02
	ID             : 02
	MD:guid        : 7b0d3403-7bbc-a9cc-a3e2-213e3296ecb2

Private RSA Key [Authentication key]
	Object Flags   : [0x03], private, modifiable
	Usage          : [0x222], decrypt, unwrap, nonRepudiation
	Access Flags   : [0x1D], sensitive, alwaysSensitive, neverExtract, local
	ModLength      : 4096
	Key ref        : 2 (0x02)
	Native         : yes
	Auth ID        : 02
	ID             : 03
	MD:guid        : c805d2b2-2d84-3703-089a-3d691d17e5b3

Public RSA Key [Signature key]
	Object Flags   : [0x02], modifiable
	Usage          : [0xC0], verify, verifyRecover
	Access Flags   : [0x02], extract
	ModLength      : 4096
	Key ref        : 0 (0x00)
	Native         : no
	Path           : b601
	ID             : 01

Public RSA Key [Encryption key]
	Object Flags   : [0x02], modifiable
	Usage          : [0x11], encrypt, wrap
	Access Flags   : [0x02], extract
	ModLength      : 4096
	Key ref        : 0 (0x00)
	Native         : no
	Path           : b801
	ID             : 02

Public RSA Key [Authentication key]
	Object Flags   : [0x02], modifiable
	Usage          : [0x51], encrypt, wrap, verify
	Access Flags   : [0x02], extract
	ModLength      : 4096
	Key ref        : 0 (0x00)
	Native         : no
	Path           : a401
	ID             : 03
Vorbereitungen - Thunderbird Einstellungen

Nun müssen wir die PGP-Unterstützung und den zugehörigen PGP-Key dem Konto zuweisen. Dazu klicken wir erneut auf das Menü-Icon rechts oben am Bildschirm (das Icon mit den drei Querstreifen) wählen nun den Menüpunkt Preferences aus.

Bild: Bildschirmhardcoby von Thunderbild - Auswahl Preferences Menü

Die Einstelungen zu den Konten finden wir unter dem Menüpunkt Account Settings.

Bild: Bildschirmhardcoby von Thunderbild - Auswahl Account-Settings Menü

In dem Fenster zu den Account-Einstellungen wählen wir dann den Punkt Security aus.

Bild: Bildschirmhardcopy Thunderbird-Account-Einstellungen - Punkt Security

Hier klicken wir dann auf die Schaltfläche [ Security Devices ]

Bild: Bildschirmhardcopy Thunderbird-Account-Einstellungen - Punkt Security Devices

Damit Thunderbird auf die OpenPGP-SmartCard des Nitrokey Pro zugreifen kann, müssen wir noch die dazu benötigte Bibliothek /usr/lib/x86_64-linux-gnu/opensc-pkcs11.so. Wir klicken also dazu die Schaltfläche [ Load ] an und wäheln dann den Speicherort dieser Bibliothek entsprechend aus.

Bild: Bildschirmhardcopy Thunderbird-Account-Einstellungen - Load PKC#S11 Device Treiber Auswahl

Zum Sichern der Eingaben klicken wir hier auf die Schaltfläche [ OK ]. Da auf die OpenPGP-SmartVCard des Nitrokey zugegriffen werden muss, wird entsprechend nach der USER-PIN gefragt.

Bild: Bildschirmhardcopy Thunderbird-Account-Einstellungen - Load PKC#S11 Device Treiber Auswahl

Da nur ein Zertifikat auf dem Nitrokey Pro gespeichert ist, fällt die Auswahl für das betreffende Zertifikat nicht sonderlich schwer.

Bild: Bildschirmhardcopy Thunderbird-Account-Einstellungen - Auswahl Zertifikat

Zum Sichern der Eingaben klicken wir auch hier auf die Schaltfläche [ OK ].

Bild: Bildschirmhardcopy Thunderbird-Account-Einstellungen - Auswahl Zertifikat

Da wir ja mit dem Zertifikat unsere ausgehende Post signieren wollen und natürlich eingehende verschlüsselte Nachrichten entschlüsseln wollen, bejahren wir diese Frage hier natürlich mit einem Klick auf die Schaltfläche [ Yes ].

Bild: Bildschirmhardcoby von Thunderbild - Auswahl Account-Settings Menü

Sobald wir nun eine Nachricht verschicken die signiert werden soll, wird vor dem Versand die PIN abgefragt und die Nachricht mit dem Signatur-Unterschlüssel unterschrieben.

Bild: Bildschirmhardcoby von Thunderbild - Abfrage User PIN bei Versand/Signierung einer eMail

Sobald wir eine verschlüsselte Nachricht öffnen, werden wir nach der PIN gefragt, damit der Schlüssel zum Entschlüsseln auf der SmartCard freigeschalten werden kann.

Bild: Bildschirmhardcoby von Thunderbild - Abfrage User PIN beim Versuch eine verschlüsselte eMail zu öffnen

Nach eingabe der USER-PIN wird die Anchricht mit Hilfe des secret-keys auf der OpenPGP-SmartCard entschlüsselt und angezeigt.

Bild: Bildschirmhardcoby von Thunderbild - Anzeige der entschlüsselten eMail

Über das Schloß-Symbol in der eMailansicht können wir uns Details zu der verschlüsselten Nachricht bzw. zum verwendetetn Schlüssel anzeigen lassen.

Bild: Bildschirmhardcoby von Thunderbild - Details zur Mailverschlüsselung

Links


1) , 4)
BSI TR-02102-1 „Kryptographische Verfahren: Empfehlungen und Schlüssellängen“ Version: 2020-01 vom 02.04.2020
2)
Web of Trust
3)
Rückruf-Zertifikat
5)
Certification Authority ⇒ Zertifizierungsstelle
6) , 7)
Certificate Signing Request
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
  • nitrokey/linuxmint/pro.txt
  • Zuletzt geändert: 18.11.2024 18:56.
  • von 127.0.0.1