Nitrokey Pro in der Praxis unter Linux Mint 20
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.
Hardwareinformationen
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
Paketabhängigkeiten
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
udev-Regeln
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
Anwendungsfälle - Software
Nitrokey-App
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
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.
Alternativ können wir natürlich das Programm auch direkt auf der Konsole starten:
$ nitrokey-app
Ein Hinweis zur Nitrokey App wird ausgegeben.
In der Statusleiste rechts taucht nun das Icon der Nitrokey App auf, welches wir nun mit meinem Mausklick aus-/anwählen.
Wird der Nitrostick Pro angesteckt erfolgt ein entsprechender Hinweise angezeigt.
Wird der Nitrostick Pro abgesteckt erfolgt ein entsprechender Hinweise angezeigt.
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.
Nach Eingabe der default PIN 12345678 und unserer individuellen Admin-PIN klicken wir auf die Schaltfläche [ OK ].
Anschließend machen wir das Gleiche mit der User-PIN.
Nach Eingabe der default PIN 123456 und unserer individuellen Admin-PIN klicken wir auf die Schaltfläche [ OK ].
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.
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.
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.
Wir werden also aufgefordert unsere individuelle Admin-PIN einzugeben.
Nach Eingabe der Admin-Pin wird der Schlüssel generiert.
Da wir zum Entsperren des Passwortsafes zur Eingabe der User-PIN aufgefordert werden, kommen wir dieser Bitte entsprechend nach.
Das entsperren des Passwort-Safes wird uns mit einer Popup-Nachricht angezeigt.
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.
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.
Haben wir alle Daten richtig eingetragen sichern wir diese über einen Klick auf die Schaltfläche [ Speichern ].
Bei entsperrten Passwort-Safe können wir nun über das App-Menü, welches wir über die Statusleiste erreichen, jederzeit auf die gesicherten Passworte zugreifen.
Bei Bedarf kopieren wir dann das betreffende Passwort und fügen es auf der Eingabemaske ein.
GnuPG
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.
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:
- Signature key
- Encryption key
- 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:
- Signature key
- Encryption key
- Authentication key
Beim Ändern der drei Schlüssel wird jeweils der Admin-PIN der Karte abgefragt.
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.
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.
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!
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:
- Erstellen weiterer Unterschlüssel für die Themen:
- Signierung
- Authentifizierung
- Verschieben der privaten Unterschlüssel aus dem Schlüsselbund, der auf der Festplatte gespeichert waren in die OpenPGP-SmartCard des Nitrokey Pros.
- 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
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.
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.
Zum Speichern des Schlüssels auf der OpenPGP-Smartcard des Nitrokey Pro erfolgt anschließend die Abfrage/Eingabe der ADMIN-PIN.
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.
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.
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.
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----- 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 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
Secure Shell (SSH)
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>
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.
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!
EMail mit Thunderbird
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.
Hier suchen wir dann über die Suchoption nach dem Add-on EnigMail.
Zum Installieren klicken wir auf die grüne Schaltfläche + Add to Thunderbird beim angezeigtem Add-on EnigMail.
Es öffnet sich ein Dialogfenster bei dem angezeigt wird, ob GnuPG im system vorhanden ist.
Anschließend wird nach gültigem Schlüsselmaterial gesucht.
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.
Die Einstelungen zu den Konten finden wir unter dem Menüpunkt Account Settings.
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.
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.
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.
Nach eingabe der USER-PIN wird die Anchricht mit Hilfe des secret-keys auf der OpenPGP-SmartCard entschlüsselt und angezeigt.
Über die Schaltfläche [ Details V ] können wir uns Details zu der verschlüsselten Nachricht bzw. zum verwendetetn Schlüssel anzeigen lassen.
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.
Die Einstelungen zu den Konten finden wir unter dem Menüpunkt Account Settings.
In dem Fenster zu den Account-Einstellungen wählen wir dann den Punkt Security aus.
Hier klicken wir dann auf die Schaltfläche [ 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.
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.
Da nur ein Zertifikat auf dem Nitrokey Pro gespeichert ist, fällt die Auswahl für das betreffende Zertifikat nicht sonderlich schwer.
Zum Sichern der Eingaben klicken wir auch hier auf die Schaltfläche [ OK ].
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 ].
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.
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.
Nach eingabe der USER-PIN wird die Anchricht mit Hilfe des secret-keys auf der OpenPGP-SmartCard entschlüsselt und angezeigt.
Über das Schloß-Symbol in der eMailansicht können wir uns Details zu der verschlüsselten Nachricht bzw. zum verwendetetn Schlüssel anzeigen lassen.