Ondersteuning voor Elliptische Curven (ECC)

RSA-2048 wordt steeds onveiliger

Om veiligheidsredenen beveelt het Duitse Bundesamt für Sicherheit in der Informationstechnik (BSI) het gebruik van RSA-sleutels met een lengte van 2048 bit ` na 2022 niet langer aan <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TG02102/BSI-TR-02102-1.pdf?_blob=publicationFile&v=10>`_. Dit betekent dat binnen afzienbare tijd langere sleutels in gebruik zullen moeten worden genomen. Uitgaande van een gebruiksperiode van vijf jaar is het nu al nodig om langere sleutels te genereren. Langere RSA-sleutels met 3072 bit of 4096 bit zijn echter aanzienlijk trager. Daarom ondersteunt de nieuwe Nitrokey Storage 2 en Pro 2 (resp. de geïntegreerde OpenPGP-kaart versie 3.3) encryptie door middel van elliptische-curve cryptografie (ECC). Deze methode wordt geacht even veilig te zijn met kleinere ECC-sleutels als langere RSA-sleutels en is ook aanzienlijk sneller.

De grondbeginselen van Elliptic-Curve Cryptografie

In tegenstelling tot RSA zijn er veel verschillende vormen (zogenaamde curves) van elliptische-curve cryptografie. Met name de NSA was betrokken bij de ontwikkeling van de NIST-krommen. Zelfs als er geen aanwijzingen zijn voor achterdeurtjes in de curves, kan het gebruik van een bepaalde curve een vertrouwenskwestie opwerpen. Gelukkig ondersteunen de nieuwe Nitrokey Storage 2 en Pro 2 twee soorten curves, namelijk NIST en Brainpool. In wat volgt zullen we Brainpool curves gebruiken. Dit artikel biedt een goed uitgangspunt om een algemeen begrip te krijgen van elliptische-curve cryptografie.

Systeem Vereisten

Om sleutels te maken op basis van elliptische krommen zijn een Nitrokey Storage 2 / Pro 2 en GnuPG versie 2.1.17 of hoger vereist.

U kunt de OpenPGP-kaartversie van Nitrokey lezen via gpg2 —card-status:

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

Het veld ‘Versie’ vertegenwoordigt de versie van de OpenPGP-kaart die in de Nitrokey is geïntegreerd - in dit geval is dat 3.3, zoals nodig voor Elliptic-curve cryptografie. OpenPGP Card versie 2.2 ondersteunt ECC niet.

You can learn about the installed version of GnuPG via gpg2  --version. At least version 2.1.16 is required. The newest GnuPG version for Windows can be found here and the newest version for MacOS can be found here. A suitable version of GnuPG is included in the GNU/Linux distributions Ubuntu (since 18.04), Debian (from Stretch onwards), Arch Linux, Fedora (from Release 26 onwards) and openSUSE Tumbleweed. At the end of this articles are instructions how to manually update GnuPG on older Ubuntu versions.

Belangrijk

GnuPG 2.0 wordt nog steeds gebruikt, maar de ondersteuning daarvoor is in 2017 stopgezet. Alle communicatiepartners moeten GnuPG 2.1 of nieuwer gebruiken voor e-mailencryptie door middel van ECC, anders kunnen er compatibiliteitsproblemen ontstaan. Gebruik ECC daarom alleen als u zeker weet dat u dit probleem kunt omzeilen.

Sleutelgeneratie op de Nitrokey Storage 2 / Pro 2

Als aan deze voorwaarden is voldaan, kunt u aan de slag. (Waarschuwing: bestaande sleutels worden overschreven tijdens het proces!) U heeft nu twee opties. De eerste optie is om de sleutel rechtstreeks op de Nitrokey Storage 2 / Pro 2 aan te maken. Het voordeel hiervan is dat de sleutel zich nooit buiten het apparaat zal bevinden en als zodanig nooit kan worden uitgelezen. De tweede optie is het importeren van een eerder lokaal gegenereerde sleutel. Het voordeel in dit geval is dat u een back-up van de sleutel veilig kunt opslaan, die dan kan worden hersteld in het geval dat de Nitrokey verloren gaat. Alleen de eerste optie wordt hieronder beschreven. Om een sleutel met backup te maken, kunt u de volgende instructies raadplegen en deze algemene informatie gebruiken om de sleutel naar de Nitrokey over te brengen.

Binnen GnuPG is er al een “genereer” commando, waarmee eenvoudig sleutels op het apparaat kunnen worden gemaakt. Het is echter nog niet mogelijk om direct het type sleutel te selecteren, dus moet de sleutel eerst worden voorbereid. Hiervoor gebruiken we de volgende commando’s:

> 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

Als alternatief kunnen ook andere curven worden gekozen, zoals in het volgende punt wordt beschreven.

Nu voeren we gpg2 --card-edit in en zien dat brainpoolP256r1 onder “sleutelattributen” staat in plaats van rsa2048.

> 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]

Dan maken we de sleutel.

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.

De Nitrokey bevat nu elliptische-curve cryptografie in plaats van RSA sleutels en kan zoals gewoonlijk worden gebruikt.

Beschikbare Curven

In de bovenstaande procedure hebben wij de Brainpool-curves gekozen. Als alternatief kunnen ook NIST-curves worden gebruikt. De configuratie wordt als volgt uitgevoerd:

> 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

Update van GnuPG op Ubuntu

De volgende stappen zijn alleen nodig als u een Ubuntu versie ouder dan 18.04 gebruikt. U kunt GnuPG 2.1.18 op zo’n systeem installeren met de onderstaande commando’s. Hiervoor zijn nieuwere Debian pakketten nodig, wat de gemakkelijkste optie is. Deze aanpak is met succes getest op Ubuntu 17.10 en werkt waarschijnlijk ook op 16.04. Het kan echter niet worden uitgesloten dat er problemen optreden tijdens het gebruik.

$ 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

Indien u de installatie ongedaan wilt maken, dient u de volgende commando’s uit te voeren:

$ 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)