Title: Découverte de la Nitrokey Pro
Category: sécurité
Tags: GPG, open source, open hardware, Nitrokey, pl-fr
Date: 2019-02-05 23:10

[La Nitrokey][l_nk] Pro est une clé USB permettant de stocker des clefs PGP de
façon sécurisée, un certificat X.509, de gérer des mots de passe de type OTP,
HOTP et contient un gestionnaire de mots de passe. Contrairement aux Yubikey,
elle est **open source** (firmware et logiciels) et **open hardware**; tout est
disponible sur un dépôt [github][l_gh_nk].

![Photo de la clé source Nitrokey]({attach}./images/NITRO_0003_d.jpg)

Dans le cadre de ma reprise d'études en Licence Pro ADSILL, j'ai décidé de
présenter ce type de clef, tester les fonctionnalités avec GnuPG et
l'identification par [certificats X.509][l_x509_w].

Je vais tenter ici de faire le tour du propriétaire, son installation sous
Archlinux et les premiers paramétrages pour la gestion de clefs PGP.

## Achat, réception et déballage

J'ai commandé deux clefs (version Pro) directement sur le site officiel. La
version deux de la clé, prenant en charge les [courbes elliptiques][l_ecc] n'est
pas disponible au moment de ma commande, j'ai contacté l'équipe via leur compte
Mastodon et ils m'ont proposé la V1, suffisante pour mes besoins.

Les clefs sont arrivées en mois de cinq jours bien emballées dans une enveloppe
protectrice.

## Installation de l'application "Officielle"

Branchement de la clef, elle apparaît directement :

```console
lsusb
[...]
Bus 003 Device 004: ID 20a0:4108 Clay Logic 
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
[...]
```

Nitrokey fournit une [application open][l_nk_app] source écrite en C++ / QT pour
gérer tout ce qui touche aux mots de passe TOTP, HOTP et ceux enregistrés dans
la partie gestionnaire de mots de passes.

Il suffit de l'installer avec votre gestionnaire de paquets préféré, chez moi
avec Archinux :

```console
sudo trizen -S nitrokey-app
résolution des dépendances…
recherche des conflits entre paquets…
Paquets (3) hidapi-0.8.0rc1-3  libnitrokey-3.4.1-2  nitrokey-app-1.3.2-3
Taille totale installée :  2,82 MiB
:: Procéder à l’installation ? [O/n] 
[...]
```

Puis de la lancer...

![interface Nitrokey-app]({attach}./images/nitrokey_app.png)

Dans le menu `Menu` > `Configurer` > `Changer le PIN utilisateur` et 
`Changer le PIN administrateur` il est possible de changer les codes mis par 
défaut. Il sera aussi possible de le faire avec `gpg`.

## Utiliser le stockage des clefs PGP.

Nous allons nous concentrer sur la partie **smartcard** et plus précisément le
paramétrage pour l'utiliser avec des clefs PGP.

### Choix Installation.

Il y a deux façon de faire en fonctions des besoins :

 - installer `libusb-compat` pour rendre la *smartcard* disponible en espace
     utilisateur et laisser GnuPG l'utiliser en exclusivité
 - installer `pcsclite` et `ccid` et permettre l'utilisation d'OpenSC et GnuPG
     (pksc11 et GnuPG)

Je vais ici détailler la seconde méthode.

### Installation des paquets nécessaires et configuration

Je vais suivre la documentation disponible sur le [wiki
d'Archliux][l_archlinux].

```console
trizen -S opensc pcsclite ccid
résolution des dépendances…
recherche des conflits entre paquets…

Paquets (3) ccid-1.4.30-2  opensc-0.19.0-2  pcsclite-1.8.24-1

Taille totale du téléchargement :  1,20 MiB
Taille totale installée :        4,26 MiB

:: Procéder à l’installation ? [O/n] o
[...]
```

Il faut alors creer le fichier `.gnupg/scdaemon.conf` pour spécifier à gnupg
d'utiliser [pcsclite][l_pcsclite] pour l'accès à la *smartcard* avec le contenu
suivant : 

```console
pcsc-driver /usr/lib/libpcsclite.so
card-timeout 5
disable-ccid
```

Il faut ensuite activer le service `pcscd` 

```console
# systemctl start pcscd.service
```

Il suffit de remplacer `start` par `enable` pour que son activation soit
permanente.

#### Tester...

Après avoir insérer (ou réinsérer) la Nitrokey, on va tester le fonctionnement
avec OpenSC et GnuPG, commençons par de dernier :

```console
gpg --card-status
Reader ...........: Nitrokey Nitrokey Pro (0000000000000000XXXXXXXX) 00 00
Application ID ...: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: XXXXXXXX
Name of cardholder: [non positionné]
Language prefs ...: de
Sex ..............: non indiqué
URL of public key : [non positionné]
Login data .......: [non positionné]
Signature PIN ....: forcé
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]
```

Passons maintenant à OpenSC :

```console
opensc-tool -n
Using reader with a card: Nitrokey Nitrokey Pro (0000000000000000XXXXXX) 00 00                                                                           
Failed to connect to card: Reader in use by another application
```

Oups, ça ne s'est pas vraiment bien passé et il y a une raison : GnuPG accède à
la *smartcard* de façon exclusive pour des raisons de sécurité, ça en cause
[ici][l_secu_gpg]. Il y a deux possibilités : installer une version
[patchée][l_scdaemon_patched] de scdaemon pour l'empêcher de verrouiller l'accès
à la *smartcard* (pas tip-top question sécurité) ou couper le sifflet à scdaemon
pour laisser OpenSC y accéder. Nous allons utiliser la seconde méthode : 

```console
gpgconf --kill scdaemon
```

Et là miracle tout fonctionne : 

```console
opensc-tool -n
Using reader with a card: Nitrokey Nitrokey Pro (0000000000000000XXXXXX) 00 00
OpenPGP card v2.1 (0005 00005C17)
```

Et voilà! Ce n'est pas toujours très pratique mais fonctionnel.

### Paramétrer la carte avec GnuPG

Paramétrer la carte se fait avec l'argument `--edit-card` :

```console
gpg --edit-card
Reader ...........: Nitrokey Nitrokey Pro [...]
[...]

gpg/carte>
```

À partir de cette invite de commande, il est possible de rentrer des commandes
pour paramétrer la clef, la commande `help` affiche l'aide. Voici une liste de
commande utiles :

 - `admin` : activer / désactiver les commandes administrateur
 - `passwd` : changer les codes PIN, que se soit administrateur ou utilisateur
 - `name`, `login`, `sex`, `lang` : changer les informations du détenteur de la
      carte.
 - `url` : adresse où est stockée la clef publique
 - `generate` : générer de nouvelles clefs.

#### Changer les codes PIN par défaut

Garder les mots de passes et codes PIN par défaut, nous allons donc tous les
changer, enfin le code PIN utilisateur et celui administrateur.

```console
gpg --edit-card
[...]
gpg/carte> admin
Les commandes d'administration sont permises

gpg/carte> passwd
gpg: carte OpenPGP nº D27600012401XXXXXXXXXXXXXXXXXXXX détectée

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Quel est votre choix ?

```

Le `reset code` vous sera demandé si vous réinitialisez le compteur d'essai de
code PIN erronés.

#### Paramétrer ses informations personnelles

A la suite des précédents changements, nous allons paramétrer les informations
personnelles sur la clef.


```console
gpg/carte> name
Nom du détenteur de la carte : Turanga
Prénom du détenteur de la carte : Leela

gpg/carte> login
Données d'identification (nom du compte) : leelaturanga

gpg/carte> sex
Sexe ((M)asculin, (F)éminin ou espace) : F

gpg/carte> lang 
Préférences de langue : en
```

#### Générer une paire de clef

Maintenant que toutes les informations sont saisies, il ne reste plus qu'à
générer les clefs. Mais avant de passer aux choses sérieuses, il faut paramétrer
la taille des clefs générée : 

```console
gpg/carte> key-attr 
Changing card key attribute for: Signature key
Sélectionnez le type de clef désiré :
   (1) RSA
   (2) ECC
Quel est votre choix ? 1
Quelle taille de clef désirez-vous ? (2048) 4096
La carte sera maintenant reconfigurée pour générer une clef de 4096 bits
Changing card key attribute for: Encryption key
Sélectionnez le type de clef désiré :
   (1) RSA
   (2) ECC
Quel est votre choix ? 1
Quelle taille de clef désirez-vous ? (2048) 4096
La carte sera maintenant reconfigurée pour générer une clef de 4096 bits
Changing card key attribute for: Authentication key
Sélectionnez le type de clef désiré :
   (1) RSA
   (2) ECC
Quel est votre choix ? 1
Quelle taille de clef désirez-vous ? (2048) 4096
La carte sera maintenant reconfigurée pour générer une clef de 4096 bits
```

Le passage des clefs à 4096 bits ralenti sensiblement **la génération de
celles-ci** par la Nitrokey, passant de quelques secondes à plusieurs minutes.

Il ne reste plus qu'à générer les clefs : 

```console
gpg/carte> generate 
Faut-il faire une sauvegarde hors carte de la clef de chiffrement ? (O/n) o
Veuillez indiquer le temps pendant lequel cette clef devrait être valable.
         0 = la clef n'expire pas
      <n>  = la clef expire dans n jours
      <n>w = la clef expire dans n semaines
      <n>m = la clef expire dans n mois
      <n>y = la clef expire dans n ans
Pendant combien de temps la clef est-elle valable ? (0) 1m
La clef expire le jeu. 07 mars 2019 22:29:17 CET
Est-ce correct ? (o/N) o

GnuPG doit construire une identité pour identifier la clef.

Nom réel : Leela Turanga
Adresse électronique : leela.turanga@planetexpress.com
Commentaire : 
Vous avez sélectionné cette identité :
    « Leela Turanga <leela.turanga@planetexpress.com> »

Changer le (N)om, le (C)ommentaire, l'(A)dresse électronique
ou (O)ui/(Q)uitter ? o
De nombreux octets aléatoires doivent être générés. Vous devriez faire
autre chose (taper au clavier, déplacer la souris, utiliser les disques)
pendant la génération de nombres premiers ; cela donne au générateur de
nombres aléatoires une meilleure chance d'obtenir suffisamment d'entropie.
gpg: Remarque : sauvegarde de la clef de la carte dans « /home/lee[...] »
gpg: clef 91BF810624DD9070 marquée de confiance ultime.
gpg: revocation certificate stored as '/home/lee/.gnupg/openpgp-revocs.d/[...]
les clefs publique et secrète ont été créées et signées.
```

La sauvegarde de la clé permettra de déchiffrer les données en cas de perte,
panne ou vol de la Nitrokey. Sauvegardez la bien au chaud, avec son certificat
de révocation.

## Conclusion

Voici un petit aperçu des fonctionnalités de cette clef open source et étudié
plus en profondeur la partie PGP avec GnuPG. Dans un prochain article, nous
verrons comment importer un ensemble de clefs existante dans la Nitrokey.

[l_nk]:https://www.nitrokey.com
[l_gh_nk]:https://github.com/nitrokey
[l_x509_w]:https://fr.wikipedia.org/wiki/X.509
[l_ecc]:https://fr.wikipedia.org/wiki/Cryptographie_sur_les_courbes_elliptiques
[l_pcsclite]:https://pcsclite.apdu.fr/
[l_nk_app]:https://github.com/Nitrokey/nitrokey-app
[l_archlinux]:https://wiki.archlinux.org/index.php/GnuPG#Smartcards
[l_secu_gpg]:https://lists.gnupg.org/pipermail/gnupg-devel/2015-September/030247.html
[l_scdaemon_patched]:https://aur.archlinux.org/packages/gnupg-scdaemon-shared-access/
