Stöd för elliptiska kurvor (ECC)#

(Nitrokey HSM 2 - Windows)

RSA-2048 blir alltmer osäker#

Av säkerhetsskäl rekommenderar den tyska federala myndigheten för informationssäkerhet (Bundesamt für Sicherheit in der Informationstechnik, BSI) inte längre att RSA-nycklar med en längd på 2048 bitar ` ska användas efter 2023 <https://www.bsi.bund.de/SharedDocs/Downloads/EN/BSI/Publications/TechGuidelines/TG02102/BSI-TR-02102-1.pdf>`__. Detta innebär att längre nycklar kommer att behöva användas inom en överskådlig framtid. Om man utgår från en användningsperiod på fem år är det redan nu nödvändigt att skapa längre nycklar. Längre RSA-nycklar med 3072 bit eller 4096 bit är dock betydligt långsammare. Av denna anledning stöder de nya Nitrokey Storage 2 och Pro 2 (respektive det integrerade OpenPGP-kortet version 3.3) kryptering med hjälp av elliptisk-kurva-kryptografi (ECC). Denna metod anses vara lika säker med mindre ECC-nycklar som längre RSA-nycklar och är dessutom betydligt snabbare.

Grunderna för kryptografi med elliptisk kurva#

Till skillnad från RSA finns det många olika former (så kallade kurvor) av kryptografi med elliptiska kurvor. Det är värt att notera att NSA var inblandad i utvecklingen av NIST-kurvorna. Även om det inte finns några bevis för bakdörrar i kurvorna kan användningen av en viss kurva innebära en förtroendefråga. Lyckligtvis stöder de nya Nitrokey Storage 2 och Pro 2 två typer av kurvor, nämligen NIST och Brainpool. I det följande kommer vi att använda Brainpool-kurvor. Denna artikel ger en bra startpunkt för att få en allmän förståelse för kryptografi med elliptiska kurvor.

Krav#

För att skapa nycklar baserade på elliptiska kurvor krävs Nitrokey Storage 2 / Pro 2 och GnuPG version 2.1.17 eller högre.

Du kan läsa Nitrokeys OpenPGP Card-version via gpg2 --card-status:

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

Fältet ”Version” anger versionen av OpenPGP-kortet som är integrerat i Nitrokey - i det här fallet är det 3.3, vilket behövs för kryptografi med elliptisk kurva. OpenPGP Card version 2.2 stöder inte ECC.

Du kan få information om den installerade versionen av GnuPG via gpg2  --version. Minst version 2.1.16 krävs. Den senaste versionen av GnuPG för Windows finns här och den senaste versionen för MacOS finns här. En lämplig version av GnuPG ingår i GNU/Linux-distributionerna Ubuntu (sedan 18.04), Debian (från och med Stretch), Arch Linux, Fedora (från och med Release 26) och openSUSE Tumbleweed. I slutet av den här artikeln finns instruktioner om hur man manuellt uppdaterar GnuPG på äldre Ubuntu-versioner.

Viktigt

GnuPG 2.0 används fortfarande, men stödet för det har upphört 2017. Alla kommunikationspartners måste använda GnuPG 2.1 eller senare för e-postkryptering med hjälp av ECC, annars kan inkompatibilitetsproblem uppstå. Du bör därför endast använda ECC om du är säker på att du kan kringgå detta problem.

Nitrokey Pro 2, Nitrokey Storage 2 eller Nitrokey HSM 2#

När dessa krav är uppfyllda kan du börja. (Varning: befintliga nycklar kommer att skrivas över under processen!) Du har nu två alternativ. Det första alternativet är att skapa nyckeln direkt på Nitrokey Storage 2 / Pro 2. Fördelen här är att nyckeln aldrig kommer att befinna sig utanför enheten och som sådan aldrig kan läsas ut. Det andra alternativet är att importera en tidigare lokalt skapad nyckel. Fördelen i det här fallet är att du kan lagra en säkerhetskopia av nyckeln på ett säkert sätt, som sedan kan återställas om Nitrokey förloras. Endast det första alternativet beskrivs nedan. För att skapa en nyckel med säkerhetskopia kan du få tillgång till ` följande instruktioner <https://www.gniibe.org/memo/software/gpg/keygen-25519.html>`__ och använda denna allmän information för att överföra nyckeln till Nitrokey.

I GnuPG finns det redan ett ”generate”-kommando som kan användas för att enkelt skapa nycklar på enheten. Det är dock ännu inte möjligt att välja typ av nyckel direkt, så nyckeln måste först förberedas. Vi använder följande kommandon för detta:

> 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

Alternativt kan andra kurvor väljas, vilket beskrivs i nästa avsnitt.

Nu skriver vi gpg2 --card-edit och ser att brainpoolP256r1 finns under ”key attributes” istället för 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]

Sedan skapar vi nyckeln.

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.

Nitrokey innehåller nu elliptisk kurva-kryptografi i stället för RSA-nycklar och kan användas som vanligt.

Tillgängliga kurvor#

I ovanstående förfarande valde vi Brainpool-kurvorna. Alternativt kan NIST-kurvor användas. Konfigurationen utförs på följande sätt:

> 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

Uppdatering av GnuPG på Ubuntu#

Följande steg behövs endast om du använder en Ubuntu-version äldre än 18.04. Du kan installera GnuPG 2.1.18 på ett sådant system med kommandona nedan. Detta involverar nyare Debianpaket, vilket är det enklaste alternativet. Det här tillvägagångssättet har testats framgångsrikt på Ubuntu 17.10 och fungerar förmodligen även på 16.04. Det kan dock inte uteslutas att det kan uppstå problem under användningen.

$ 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

Om du vill ångra installationen måste du utföra följande kommandon:

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