Unterstützung elliptischer Kurven (ECC)#

(Nitrokey Pro 2 - Linux)

RSA-2048 wird zusehends unsicherer#

Das Bundesamt für Sicherheit in der Informationstechnik (BSI) empfiehlt aus Sicherheitsgründen, ab 2022 ` keine RSA-Schlüssel mit einer Länge von 2048 Bit mehr zu verwenden <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TG02102/BSI-TR-02102-1.pdf?_blob=publicationFile&v=10>`__ .Dies bedeutet, dass in absehbarer Zeit längere Schlüssel verwendet werden müssen. Geht man von einer Nutzungsdauer von fünf Jahren aus, ist es bereits jetzt notwendig, längere Schlüssel zu erzeugen. Längere RSA-Schlüssel mit 3072 Bit oder 4096 Bit sind jedoch deutlich langsamer. Aus diesem Grund unterstützt der neue Nitrokey Storage 2 und Pro 2 (bzw. die integrierte OpenPGP-Karte Version 3.3) die Verschlüsselung mittels Elliptik-Kurven-Kryptographie (ECC) . Diese Methode gilt bei kleineren ECC-Schlüsseln als ebenso sicher wie bei längeren RSA-Schlüsseln und ist zudem wesentlich schneller.

Grundlagen der Elliptische-Kurven-Kryptographie#

Im Gegensatz zu RSA gibt es viele verschiedene Formen (sogenannte Kurven) der Elliptik-Kurven-Kryptographie. Insbesondere war die NSA an der Entwicklung der NIST-Kurven beteiligt. Auch wenn es keine Hinweise auf Hintertüren in den Kurven gibt, kann die Verwendung einer bestimmten Kurve eine Vertrauensfrage aufwerfen. Glücklicherweise unterstützen die neuen Nitrokey Storage 2 und Pro 2 zwei Arten von Kurven, nämlich NIST und Brainpool. Im Folgenden werden wir Brainpool-Kurven verwenden. Dieser Artikel bietet einen guten Einstieg, um ein allgemeines Verständnis der Kryptographie mit elliptischen Kurven zu erlangen.

Systemanforderungen#

Um Schlüssel auf Basis elliptischer Kurven zu erzeugen, wird ein Nitrokey Storage 2 / Pro 2 und GnuPG ab Version 2.1.17 benötigt.

Sie können die OpenPGP-Kartenversion von Nitrokey über gpg2 --card-status lesen:

> gpg2 --card-status
Reader ...........: 20A0:...
Application ID ...: D276...
Version ..........: 3.3
...

Das Feld ‚Version‘ stellt die Version der im Nitrokey integrierten OpenPGP Card dar - in diesem Fall ist es 3.3, wie sie für die Elliptic-Curve-Kryptographie benötigt wird. OpenPGP Card Version 2.2 unterstützt keine ECC.

Die installierte Version von GnuPG können Sie über gpg2  --version erfahren. Es wird mindestens die Version 2.1.16 benötigt. Die neueste GnuPG-Version für Windows finden Sie hier und die neueste Version für MacOS finden Sie hier. Eine passende Version von GnuPG ist in den GNU/Linux-Distributionen Ubuntu (seit 18.04), Debian (ab Stretch), Arch Linux, Fedora (ab Release 26) und openSUSE Tumbleweed enthalten. Am Ende dieses Artikels finden Sie eine Anleitung, wie Sie GnuPG auf älteren Ubuntu-Versionen manuell aktualisieren können.

Wichtig

GnuPG 2.0 wird zwar noch verwendet, aber die Unterstützung dafür wurde 2017 eingestellt. Alle Kommunikationspartner müssen GnuPG 2.1 oder neuer für die E-Mail-Verschlüsselung mittels ECC verwenden, da sonst Inkompatibilitätsprobleme auftreten können. Daher sollten Sie ECC nur verwenden, wenn Sie sicher sind, dass Sie dieses Problem umgehen können.

Schlüsselerzeugung am Nitrokey Storage 2 / Pro 2#

Sobald diese Voraussetzungen erfüllt sind, können Sie loslegen. (Achtung: bestehende Schlüssel werden dabei überschrieben!) Sie haben nun zwei Möglichkeiten. Die erste Möglichkeit ist, den Schlüssel direkt auf dem Nitrokey Storage 2 / Pro 2 zu erstellen. Dies hat den Vorteil, dass sich der Schlüssel nie außerhalb des Geräts befindet und somit auch nicht ausgelesen werden kann. Die zweite Möglichkeit besteht darin, einen zuvor lokal erzeugten Schlüssel zu importieren. Der Vorteil hierbei ist, dass Sie ein Backup des Schlüssels sicher aufbewahren können, das im Falle eines Verlustes des Nitrokeys wiederhergestellt werden kann. Im Folgenden wird nur die erste Möglichkeit beschrieben. Um einen Schlüssel mit Backup zu erstellen, können Sie auf die folgende Anleitung zugreifen und diese allgemeine Informationen verwenden, um den Schlüssel auf den Nitrokey zu übertragen.

Innerhalb von GnuPG gibt es bereits einen „generate“-Befehl, mit dem man auf einfache Weise Schlüssel auf dem Gerät erzeugen kann. Allerdings ist es bisher nicht möglich, die Art des Schlüssels direkt auszuwählen, so dass der Schlüssel zunächst vorbereitet werden muss. Dazu verwenden wir die folgenden Befehle:

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

Alternativ können auch andere Kurven gewählt werden, wie im nächsten Abschnitt beschrieben.

Jetzt geben wir gpg2 --card-edit ein und sehen, dass unter „Schlüsselattribute“ brainpoolP256r1 statt rsa2048 steht.

> gpg2 --card-edit
Reader ...........: 20A0:4109:0000000000000:0
Application ID ...: D276000124010303000500005F100000
Version ..........: 3.3
Manufacturer .....: ZeitControl
Serial number ....: 00005F10
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 ...: brainpoolP256r1 brainpoolP256r1 brainpoolP256r1
Max. PIN lengths .: 64 64 64
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]

Dann 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: jane.doe@example.org
Comment:
You selected this USER-ID:
"Jane Doe <jane.doe@example.org>"
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.

Der Nitrokey verwendet nun Elliptische-Kurven-Kryptographie anstelle von RSA-Schlüsseln und kann wie gewohnt verwendet werden.

Verfügbare Kurven#

Im obigen Verfahren haben wir die Brainpool-Kurven gewählt. Alternativ können auch die NIST-Kurven verwendet werden. Die Konfiguration wird wie folgt durchgeführt:

> 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

Aktualisierung von GnuPG unter Ubuntu#

Die folgenden Schritte sind nur erforderlich, wenn Sie eine Ubuntu-Version älter als 18.04 verwenden. Sie können GnuPG 2.1.18 auf einem solchen System mit den unten stehenden Befehlen installieren. Dies beinhaltet neuere Debian-Pakete, was die einfachste Option ist. Diese Vorgehensweise wurde erfolgreich auf Ubuntu 17.10 getestet und funktioniert wahrscheinlich auch auf 16.04. Allerdings kann das Auftreten von Problemen bei der Nutzung nicht ausgeschlossen werden.

$ 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 rückgängig machen wollen, müssen Sie folgende Befehle ausführen:

$ sudo dpkg --remove --force-depends gnupg dirmngr gnupg-agent scdaemon
  # (removes manually installed packages)
$ sudo apt-get install gnupg dirmngr gnupg-agent scdaemon
  # (installs the appropriate packages from regular package repositories)