Nitrokey Start unterstützt elliptische Kurven (ECC)

RSA-2048 wird zunehmend unsicher

Das Bundesamt für Sicherheit in der Informationstechnik (BSI) empfiehlt RSA-Schlüssel mit einer Länge von 2048 Bit aus Sicherheitsgründen nicht mehr nach dem Jahr 2022 einzusetzen. In absehbarer Zeit müssen somit längere Schlüssel verwendet werden. Bei einer angenommenen Verwendungsdauer von fünf Jahren sollten bereits jetzt sicherere Schlüssel generiert werden. Längere RSA-Schlüssel mit 3072 Bit oder 4096 Bit sind jedoch deutlich langsamer. Deshalb unterstützt der Nitrokey Start (bzw. die zugrundeliegende Firmware Gnuk) seit einiger Zeit die Verschlüsselung mittels elliptischer Kurven (ECC). Dieses Verfahren gilt bei kleinerer Schlüssellänge als genauso sicher wie längere RSA-Schlüssel und ist dabei deutlich schneller.

Grundlagen elliptischer Kurven

Anders als bei RSA gibt es von elliptischen Kurven unterschiedliche Ausprägungen (sog. Kurven). Insbesondere den NIST-Kurven wurde die Involvierung der NSA bei der Entwicklung zulasten gelegt. Auch wenn es keine Belege für Hintertüren in den Kurven gibt, so kann die Verwendung einer bestimmten Kurve eine Vertrauensfrage darstellen. Zum Glück unterstützt der Nitrokey Start mehrere Kurven, nämlich NIST, SECG und Curve25519. Wir verwenden im Folgenden Curve25519 und das darauf aufbauende Ed25519, die einen guten Ruf haben und als sicher gelten. Dieser Artikel gibt einen guten Einstieg zum allgemeinem Verständnis elliptischer Kurven.

System-Vorraussetzungen

Um Schlüssel auf Basis elliptischer Kurven auf dem Nitrokey Start erstellen zu können, muss die Firmware 1.2 aufgespielt sein und GnuPG in Version 2.1.16 oder höher installiert sein.

Über 'gpg2 --card-status' kann man die Firmware-Version des Nitrokey Start ablesen:

> gpg2 --card-status
Reader ...........: 20A0:4211:FSIJ-1.2.4-67083322:0
...

Die Zahl hinter 'FSIJ' gibt den Stand der Software an, in diesem Fall ist es 1.2.4. Ab der Version 1.2 können elliptische Kurven mit dem Nitrokey Start verwendet werden. Falls noch eine ältere Firmware installiert ist, kann man diese mit Hilfe dieser Anleitung aktualisieren.

Die installierte Version von GnuPG erfährt man über 'gpg2 --version'. Es wird mindestens Version 2.1.16 benötigt. Für Windows erhält man die neueste GnuPG Version hier und für macOS hier. In den GNU/Linux-Distributionen Debian (ab Stretch), Arch Linux, Fedora (ab Release 26) und openSUSE Tumbleweed ist bereits eine passende Version von GnuPG enthalten. In der aktuellen Veröffentlichung von Ubuntu (17.10) ist derzeit leider nur GnuPG 2.1.15 enthalten und die Nutzung somit derzeit noch nicht ohne Weiteres möglich. Am Ende des Artikels gibt es Hinweise, wie GnuPG unter Ubuntu manuell aktualisiert werden kann.

Wichtig: GnuPG 2.0 wird noch verwendet, aber der Support wird ca. Ende 2017 auslaufen. Bei Emailverschlüsselung mittels ECC müssen alle Kommunikationspartner GnuPG 2.1 oder neuer verwenden. Andernfalls kann es zu Inkompatibilitäten kommen. Sie sollten daher ECC nur dann verwenden, wenn Sie dieses Problem in Ihrem Fall ausschließen können.

Schlüsselgenerierung auf dem Nitrokey Start

Sind diese Voraussetzungen erfüllt, kann es losgehen. (Achtung: bestehende Schlüssel werden bei diesem Vorgang überschrieben!) Es gibt nun zwei Möglichkeiten. Entweder erstellt man den Schlüssel direkt auf dem Nitrokey Start. Dies hat den Vorteil, dass der Schlüssel nie außerhalb des Gerätes liegt und somit zu keiner Zeit ausgelesen werden kann. Oder man importiert einen zuvor lokal erstellen Schlüssel. Hier liegt der Vorteil darin, dass man ein Backup des Schlüssels sicher verwahren kann und diesen bei Verlust des Nitrokey wiederherstellen kann. Im Folgenden wird nur die erste Variante beschrieben. Um einen Schlüssel mit Backup zu erstellen, kann auf folgende Anleitung zurückgegriffen werden und mittels dieser allgemeinen Hinweise kann der Schlüssel auf den Nitrokey übertragen werden.

Unter GnuPG gibt es bereits einen Befehl 'generate', mit dem auf einfache Weise Schlüssel direkt auf dem Gerät erstellt werden können. (Aktualisierung 20.11.2017: Mit GnuPG 2.2.2 und neuer, während des Kommandos "generate" können Sie die Schlüssellänge "25519" eingeben um Curve25519 auszuwählen. In diesem Fall können Sie die nächsten Zeilen überspringen.) Bisher kann damit allerdings nicht die Art des Schlüssels direkt ausgewählt werden. Also muss der Stick zunächst kurz vorbereitet werden. Dafür benutzen wir folgende Befehle:

> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 22 ed25519" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 cv25519" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 22 ed25519" /bye

Alternativ könnten andere Kurven ausgewählt werden, wie im nächsten Abschnitt beschrieben.

Nun geben wir 'gpg2 --card-edit' ein und sehen, dass nun unter 'Key attributes' ed25519 bzw. cv25519 anstatt rsa2048 steht.

> gpg2 --card-edit
Reader ...........: 20A0:4211:FSIJ-1.2.4-67083322:0
Application ID ...: D276000124010200FFFE670833220000
Version ..........: 2.0
Manufacturer .....: unmanaged S/N range
Serial number ....: 67083322
Name of cardholder: [not set]
Language prefs ...: [not set]
Sex ..............: unspecified
URL of public key : [not set]
Login data .......: [not set]
Signature PIN ....: forced
Key attributes ...: ed25519 cv25519 ed25519
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 3 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

Anschließend erstellen wir den Schlüssel.

gpg/card> admin
Admin commands are allowed

gpg/card> generate
Make off-card backup of encryption key? (Y/n) n
Please note that the factory settings of the PINs are
PIN = '123456' Admin PIN = '12345678'
You should change them using the command --change-pin
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
GnuPG needs to construct a user ID to identify your key.
Real name: Jane Doe
Email address: [email protected]
Comment:
You selected this USER-ID:
"Jane Doe <[email protected]>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
gpg: key 7F8C68E1B084E169 marked as ultimately trusted
gpg: revocation certificate stored as '/home/jane/.gnupg/openpgp-revocs.d/F8C00BC1636A7D7604A31A877F8C68E1B084E169.rev'
public and secret key created and signed.

Nun enthält der Nitrokey Start elliptische Kurven anstatt RSA-Schlüssel und kann wie gewohnt verwendet werden.

Verfügbare Kurven

In dem Vorgehen oben haben wir uns für die Kurve ed25519 bzw. cv25519 von Daniel Bernstein entschieden. Alternativ können NIST oder SECG Kurven eingesetzt werden. Die Konfiguration wird entsprechend wie folgt vorgenommen:

Option NIST-Kurven:

> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 19 nistp256" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 nistp256" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 19 nistp256" /bye

Option SECG-Kurven: Warnung: Diese Kurve wird nicht für E-Mailverschlüsselung empfohlen sondern ausschließlich für Bitcoin-bezogene Anwendungsfälle!

> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 19 secp256k1" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 secp256k1" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 19 secp256k1" /bye

Option Curve25519:

> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 1 22 ed25519" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 2 18 cv25519" /bye
> gpg-connect-agent "SCD SETATTR KEY-ATTR --force 3 22 ed25519" /bye

Aktualisierung von GnuPG unter Ubuntu

Die folgenden Schritte sind nur nötig, wenn eine Ubuntu Version älter als 18.04 verwendet wird. Die unten stehenden Befehle installieren GnuPG 2.1.18 auf solch einem System. Dabei wird auf aktuellere Debian-Pakete zurückgegriffen, was die einfachste Möglichkeit ist. Dieses Vorgehen wurde unter Ubuntu 17.10 erfolgreich getestet und läuft vermutlich auch unter 16.04. Trotzdem kann nicht ausgeschlossen werden, dass bei der Benutzung Probleme auftreten.

$ mkdir gnupg_tmp
$ cd gnupg_tmp
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/gnupg_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/dirmngr_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/gnupg-agent_2.1.18-8~deb9u1_amd64.deb
$ wget http://ftp.debian.org/debian/pool/main/g/gnupg2/scdaemon_2.1.18-8~deb9u1_amd64.deb
$ sudo dpkg -i *
$ cd ..
$ rm -rf gnupg_tmp

Falls Sie die Installation wieder rückgängig machen wollen, müssen Sie folgende Befehle ausführen:

$ sudo dpkg --remove --force-depends gnupg dirmngr gnupg-agent scdaemon
(entfernt die manuell installieren Pakete)
$ sudo apt-get install gnupg dirmngr gnupg-agent scdaemon
(installiert dieselben Pakete aus den regulären Paketquellen)

23.10.2019

Comments

In most of our models we are restricted by the algorithms supported by the chip vendor so that we can't support this curve anytime soon. However, for curiosity, please add a reference to find more information about that curve.
To know more about "anders_1032_1" 1033 bit elliptic curve go to the secure url address at: https://intern.fh-wedel.de/~an/crypto/accessories/domains_anders.html You can contact the creator directly at the e-mail: an [you know what to put here] fh-wedel [dot] de if you have any questions or doubts about these elliptic curve.
how are the changes to start with new hardware/chip to support curve25519 in stick with more features (even PGP and FIDO2) next?

Pages

Add new comment

Fill in the blank.