Security Token für GPG-Verschlüsselung

Aufmerksam auf die Thematik wurde ich durch einen Kommilitonen aus dem Bereich IT-Security, der einen solchen USB-Stick unter anderem für SSH und Email-Verschlüsselung verwendet. Vorteil ist, dass der private Schlüssel nicht auf dem Computer gespeichert ist und somit nur sehr viel schwerer geklaut werden kann. Für einen Trojaner oder Hacker sind keine Sicherheitslücken bekannt, erst wenn jemand den Stick klauen würde, könnte er mit viel Aufwand den Schlüssel extrahieren.

Ich fand die Idee für meinen Passwort-Manager Password Store ideal geeignet, um besonders sensible Passwörter wie Bankzugang besser schützen zu können. Nach ersten erfolglosen Versuchen, sehr kostengünstige Varianten (https://blog.danman.eu/2-usb-crypto-token-for-use-with-gpg-and-ssh/) nachzubauen, entschloss ich mich zum Selbstbau.
Die deutsche Firma Nitrokey hat sämtliche Hard- und Software freigegeben. Der Nitrokey Start entspricht bis auf kleine Änderungen dem japanischen Projekt GnuK. Der Nitrokey Plus2 arbeitet mit einer PGP-Smartcard im Inneren, diese soll noch mehr gegen Angriffe geschützt sein. Zudem kann dieser Nitrokey mit zugehöriger App zur Zweifaktorauthentifizierung mit dem verbreiteten TOTP-Verfahren genutzt werden.

Nachbau

Ein wichtiges Design-Kriterium war, dass man es per Hand mit Lötstation (ohne Heißluft) löten kann. Daher bin ich auf eine andere Bauform des Mikrocontrollers (TQFP statt QFN) umgestiegen. Finanziell gelohnt hat sich der Selbstbau im Vergleich zum Kauf kaum: Zwar waren die Bauteilkosten etwas geringer (ca. 15€ pro Token), aber durch Mindestbestellwert und iterativem Platinendesign (inklusive ausprobieren, welches Gehäuse sich eignet) habe ich letztlich nur mengenmäßig mehr Token, als eigentlich benötigt, bekommen. Aber besonders durch die Fehlersuche konnte ich einiges Wissen dazugewinnen.

ST-Link V2 Clone

Version 1 und Version 2

Die erste Version war ein ziemlich schnelles Unterfangen. Weihnachten stand direkt vor der Tür und ich wollte die Weihnachtspause für das Einrichten nutzen. So habe ich innerhalb eines Tages habe nach dem originalen Schaltplan des Nitrokey Start eine Leiterplatte in KiCad entworfen, die von der Größe her in ein Gehäuse eines kostengünstigen STLink-Clones passt. Das Loch für eine Befestigung am Schlüsselring ist dabei für maximale Stabilität direkt in der Leiterplatte. Die Platine wurde bei Aisler bestellt, ein deutsch/holländisches Unternehmen, die in guter Qualität und für Hobbybastler akzeptablen Preisen arbeiten.

Nachbau eines Nitrokey Plus 2

Version 2 ist direkt danach entstanden. Der Schaltplan entspricht dem Nitrokey Pro2 und ist – bis auf zusätzlichen Smartcard-Halter und fehlenden Touch-Controller – sehr ähnlich zu dem Nitrokey Start. Mit Smartcard lässt sich daraus ein Nitrokey Pro2 bauen, ohne Smartcard ein Nitrokey Start. Die Komponenten wurden bei Digikey bestellt, die Bestellnummern konnten direkt aus dem GIT-Repo genutzt werden. Mit einer Variante habe ich einen Nitrokey Pro2 nachgebaut, wofür ich zusätzlich eine OpenPGP-Smartcard V3 benötigte.

Die bereits kompilierte Firmware von Nitrokey ließ sich ohne Probleme auf die Controller spielen. Viel schwieriger sah es jedoch mit selbst kompilieren aus. Erst nach langer Fehlersuche und Google kam ich darauf, dass die ARM-GCC-Toolchain von meinem Ubuntu 18.04 fehlerhaft war.

Ein weiteres Unterfangen war die Wahl des Gehäuses: Die Alugehäuse der ST-Link-Clones sind zwar kosengünstig (2$ mit ST-Link), stabil und schön klein – aber hinten offen und bereits beschriftet. Ummanteln mit Schrumpfschlauch war eine Möglichkeit.
Weiterhin probierte ich diverse USB-Stick Gehäuse, zum Teil konnte man diese auf Ebay ohne Inhalt bekommen, zum Teil sehr günstig mit 32MB-USB-Sticks oder bei Aliexpress.

verschiedene Gehäuse-Möglichkeiten: ST-Link-Gehäuse ummantelt, Schrumpfschlauch, USB-Stick Gehäuse

Version 3

Entstanden ist die Version, weil ich schließlich noch ein schönes USB-Gehäuse gefunden habe, für das aber die Platine noch etwas angepasst werden musste. Zudem wollte ich die GnuK-Firmware mit dem chinesischen Mikrocontroller GD32F103 (einem ST32F103 Clone) testen und die Kosten durch Komponenten von Aliexpress etwas senken.

USB-Stickgehäuse – links original, rechts mit GnuK
Bestückte PCBs mit Korrektur

Leider gestaltete sich die Inbetriebnahme als ziemlich schwierig. Mein Schaltplan basierte immer noch auf den Nitrokey Start, der eine andere TVS-Diode verbaut hat, als der originale GnuK. Erst nach Mailkontakt mit Niibe Yutaka, dem Entwickler von GnuK, kam ich darauf, dass in seiner verwendeten TVS-Diode NUF2221 ein Pullup-Widerstand verbaut war, den ich völlig übersehen hatte. Im Gegensatz zu den originalen STM32-Mikrocontrollern funktioniert das Pullup über einen externen Mikrocontroller-Pin nicht.

Rückseite – Korrektur Mit Fädeldraht

Mit der neusten Version (Juli 2020) von Nitrokey Start ist es übrigens möglich, bis zu 3 Identitäten (bezogen auf den Schlüssel), auf dem Stick zu speichern. Neben der Verwendung im Passwortmanager nutze ich den GPG Stick auch zur E-Mailverschlüsselung – bzw. genauer gesagt Entschlüsselung. Mein GPG-Schlüssel ist bei Kontakt hinterlegt.