Bien que souvent considéré comme complexe, GPG est surtout un outil plein de surprises. Il permet notamment de stocker et utiliser vos clefs à travers un dispositif USB et le standard OpenPGP Card. De quoi concilier l'aspect pratique avec le besoin de sécurité.
Maintenant que nous avons vu comment générer une paire de clefs presque parfaite via GnuPG (GPG) et comment la diffuser sur un annuaire en ligne ou même via Facebook, nous allons nous intéresser à un autre point crucial : le stockage et l'utilisation des sous-clefs au quotidien.
Comme nous avons pu le voir dans notre précédent article, l'idéal est d'avoir toujours à disposition les sous-clefs pour le chiffrement et la signature (ou même l'authentification), mais de garder bien au chaud la clef primaire. Cette dernière ne doit en effet pas tomber en de mauvaises mains ou même être simplement perdue.
Vos clefs GPG dans une carte à puce
Si nous avons déjà évoqué différentes solutions pour cette clef comme le stockage hors-ligne en version papier – sous forme d'un QR Code – qu'en est-il pour les sous-clefs ? Car celles-ci restent stockées dans votre machine et il n'est pas forcément pratique de les utiliser sur un autre ordinateur sans augmenter le risque de fuite, alors qu'il est désormais courant d'en utiliser plusieurs au quotidien (à la maison, au bureau, un portable, etc.)
Heureusement, il existe une solution permettant de combiner sécurité et praticité : la carte à puce (ou smart card). Il s'agit, un peu comme la carte SIM de votre smartphone ou votre carte bancaire, de placer vos (sous) clefs dans un composant matériel sécurisé depuis lequel elles pourront être lues, utilisées, mais pas extraites. Il faudra ainsi disposer de la puce et d'un code PIN afin de pouvoir exploiter vos clefs. Un fonctionnement qui est nativement géré par GPG.
Pour cela il est possible d'utiliser une smart card ISO/IEC 7816 ou une clef USB de sécurité qui intègre une implémentation du standard OpenGPG Card. Si la version la plus récente est la 3.0 (qui supporte notamment les clefs ECC), on la retrouve le plus souvent dans sa version 2.1. On notera au passage que l'ANSSI propose une implémentation d'OpenPGP Card 3.x pour le système Java Card, SmartPGP, sous licence GPLv2.
La solution classique : la smart card GnuPG
Un tel produit n'est pas si complexe à trouver. Il existe ainsi différentes solutions. Pour notre test du jour, nous en avons retenu trois qui pourront fonctionner avec un simple port USB.
Le premier est le plus souvent évoqué, il s'agit de la smart card GnuPG « officielle ». Elle est ainsi mise en avant sur le site de g10code, la société du développeur principal de GnuPG, Werner Koch. Elle est notamment distribuée dans une version personnalisée par la Free Software Foundation Europe à ses membres.
Elle utilise le système BasicCard de ZeitControl et n'est vendue que par une boutique en ligne : Kernel Concepts. La commande ne se passe que par email (en anglais ou en allemand), la livraison se fait sous quelques jours (dans notre cas nous avons même reçu un ours en chocolat en cadeau). Elle est vendue aux alentours de 17 euros à l'unité, et de 14 euros pour un pack de 10.
Ça commence à devenir bon. Au passage, si vous avez des questions... ;) #CryptoFreak pic.twitter.com/M925Er6vdj
— David Legrand (@davlgd) 21 décembre 2016
Si vous désirez une version avec une découpe de la puce au format SIM, cela vous coûtera 0,60 euro supplémentaire par carte. Une option qui est utile puisqu'elle permet d'intégrer la puce dans un lecteur de smart card au format USB, comme le lecteur Gemalto proposé à un peu moins de 20 euros. Pratique si vous n'avez pas de lecteur de smart card sur votre machine ou intégré à votre ordinateur portable.
Cette solution vous reviendra ainsi à 40 euros environ, livraison comprise. Attention, le paiement ne peut se faire que par virement bancaire ou PayPal (+5 % facturés dans ce cas, soit 42 euros).
Le modèle à tout faire : la Yubikey
La seconde solution est d'utiliser une Yubikey Neo ou 4. Toutes deux intègrent une implémentation OpenPGP Java Card (sous licence GPL v2) lui permettant de faire office de smart card et d'être utilisée comme telle avec GnuPG.
Cette fois, il vous en coûtera entre 40 et 60 euros selon les cas, mais ces clefs peuvent aussi être utilisées pour la connexion à deux facteurs (U2F), pour déverrouiller une session macOS ou Windows et peuvent générer des mots de passe à la demande (OTP, OATH-HOTP/TOTP).
La petite nouvelle : la Nitrokey
Dans le même genre, il existe la Nitrokey. Un projet issu de l'évolution de la Crypto stick, financé en partie sur Indiegogo. Là aussi, il s'agit de proposer une solution qui ouvre de nombreuses possibilités (gestionnaire de mots de passe, OTP, S/MIME, etc.), dont le fonctionnement comme smart card OpenPGP (via Java Card).
C'est le cas des modèles Start et Pro, annoncées à 29 et 49 euros (comptez 7,40 à 20 euros de frais de livraison). L'ensemble repose en bonne partie sur l'open source et a fait l'objet d'un audit fin 2015.
De multiples possibilités, un fonctionnement unique
Notez que ce ne sont bien entendu pas les seules initiatives du genre. D'autres travaillent d'ailleurs à ajouter une implémentation OpenPGP Card à leurs produits, comme les français de Ledger qui proposent des clefs faisant office de portefeuille pour crypto-monnaies, mais intègrent déjà d'autres types d'application comme l'authentification à deux facteurs U2F.
Mais l'intérêt de reposer sur un standard et de disposer d'une gestion native au sein de GnuPG, c'est que le fonctionnement est identique quelle que soit la solution retenue. Pour commencer ce guide, nous partirons du principe que vous avez déjà suivi notre analyse de GPG, son fonctionnement de base et la création d'une paire de clefs « presque parfaite ».
La première étape pour transférer vos clefs sur la carte à puce est de connecter celle-ci à votre machine. Elle devrait être reconnue sur n'importe quel système d'exploitation (Linux, macOS ou encore Windows).
Notez que sous différentes distributions Linux, en plus de disposer de GPG 2.x (nos essais sont effectués avec la branche moderne GPG 2.1), vous aurez parfois besoin d'installer scdeamon,
pcscd
et pcsc-tools
afin de reconnaître et gérer votre clef USB comme une smart card. Sous Debian/Ubuntu, cela revient à taper la commande suivante :
apt install scdaemon pcscd pcsc-tools
Parfois, et sous différents OS, votre clef pourra ne plus être reconnue. Le plus simple est alors de « tuer » scdeamon
puis de le relancer. Tout devrait alors rentrer dans l'ordre.
Une fois ceci fait, il vous suffit d'ouvrir un terminal (Windows+R, cmd
pour Windows). Vous pourrez alors taper la commande suivante afin de constater que votre carte est bien reconnue :
gpg --card-status
Reader ...........: Gemalto USB Key Smart Card Reader 0
Application ID ...: D2760001240102010005000084C70000
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 000084C7
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]
Comme vous pouvez le voir, de nombreuses informations sont manquantes. On peut aussi remarquer qu'il est possible de stocker trois clefs (jusqu'à RSA 4096 bits pour la version 2.1 d'OpenPGP Card) et qu'il existe un compteur au niveau du code PIN (jusqu'à 32 caractères).
Notez également qu'il existe (comme souvent) deux code PIN différents :
- Utilisateur : permet l'accès aux clefs (par défaut 123456 en général)
- Admin : permet d'écrire des informations sur la carte (par défaut 12345678 en général)
Vous aurez plusieurs méthodes pour mettre à jour les informations contenues dans la puce. La plus simple est de passer par un gestionnaire de clefs qui le permet, comme GPA. Il dispose en effet d'un onglet « Card » permettant d'ouvrir une fenêtre d'édition. Vous pourrez y changer les informations principales : nom, sexe, pseudo, langue, URL de la clef publique, code PIN.
Malheureusement, ce sera à peu près tout. Il serait pourtant bien pratique de voir les gestionnaires de clefs intégrer de manière les smart cards, ce qui pourrait favoriser leur usage par un plus large public. Bien entendu, vous pouvez aussi passer par la ligne de commande, avec la fonction gpg --card-edit
. En tapant admin
, puis help
, vous verrez les différentes possibilités qui s'offrent à vous :
gpg/carte> help
quit quitter ce menu
admin afficher les commandes d'administration
help afficher cette aide
list afficher toutes les données disponibles
name modifier le nom du détenteur de la carte
url modifier l'URL pour récupérer la clef
fetch récupérer la clef indiquée dans l'URL de la carte
login modifier l'identifiant de connexion
lang modifier les préférences de langue
sex modifier le sexe du détenteur de la carte
cafpr modifier une empreinte d'autorité de certification
forcesig inverser le paramètre obligeant à entrer le code personnel pour les signatures
generate générer de nouvelles clefs
passwd menu pour modifier ou déverrouiller le code personnel
verify vérifier le code personnel et afficher toutes les données
unblock débloquer le code personnel en utilisant un code de réinitialisation
factory-reset destroy all keys and data
Les fonctions name
, url
, login
, lang
ou sex
vous permettront de modifier les informations de base de votre identité. Si vous avez une URL indiquée pour votre clef publique, fetch
vous permettra de la télécharger sur la machine. Pour modifier votre code PIN (classique ou admin) vous devrez utiliser la fonction passwd
.
Si vous vous trompez plus de trois fois, la puce sera rendue inopérante et vous devrez procéder à une réinitialisation. Pour cela, rien de plus simple puisque vous devrez taper les trois commandes suivantes :
gpg --card-edit
admin
factory-reset
Cette sécurité est aussi la raison pour laquelle vous devez disposer d'une copie de vos clefs hors de votre smart card. En cas de souci, vous pourrez les importer puis les remettre en place. Par défaut, GPG permet de générer les clefs directement au sein de la puce :
gpg --card-edit
admin
generate
Cette procédure vous permet de disposer d'une sauvegarde de la clef de chiffrement, mais vous ne pourrez pas avoir de copie des autres clefs. Elle est donc déconseillée.
Le transfert de vos sous-clefs sur la smart card
Si vous avez suivi notre guide permettant de générer une paire de clefs presque parfaite via GPG, vous devez disposer d'une clef primaire de certification que vous aurez mise en sécurité puis supprimée de la machine courante.
Vous disposez aussi d'au moins deux sous-clefs, toujours accessibles, pour la signature et le chiffrement. Notez que vous pouvez aussi en ajouter une pour l'authentification (auth) ce qui peut être utile dans certains cas (nous le verrons dans un prochain article).
En tapant gpg -K
vous pourrez afficher les informations sur cette clef, et notamment son ID et son empreinte :
sec# rsa4096/0xD3CFD97417D94589 2017-02-07 [C] [expires: 2018-02-07]
Key fingerprint = D670 AB49 FBEB 1002 37CA 4277 D3CF D974 17D9 4589
uid [ultimate] Jean Deauh <me@jeandeauh.fr>
ssb rsa4096/0x72C2EBE383F28C98 2017-02-07 [S] [expires: 2018-02-07]
ssb rsa4096/0x5E17DEB66A7BC8BB 2017-02-07 [E] [expires: 2018-02-07]
Ces informations peuvent être utiles pour l'éditer, nous le ferons à travers l'adresse email dans notre cas :
gpg --edit-key me@jeandeauh.fr
Pour transférer l'une de nos sous-clefs sur la smart card, il nous faut tout d'abord la sélectionner via la fonction key
qui permet d'indiquer la ligne de la clef concernée (la première étant la ligne 0). Dans notre cas, nous allons commencer par la première sous-clef (ssb) de signature :
gpg> key 1
pub rsa4096/0xD3CFD97417D94589
created: 2017-02-07 expires: 2018-02-07 usage: C
trust: ultimate validity: ultimate
ssb* rsa4096/0x72C2EBE383F28C98
created: 2017-02-07 expires: 2018-02-07 usage: S
ssb rsa4096/0x5E17DEB66A7BC8BB
created: 2017-02-07 expires: 2018-02-07 usage: E
[ultimate] (1). Jean Deauh <me@jeandeauh.fr>
Une fois ceci fait, il faut demander le transfert avec la fonction keytocard :
gpg> keytocard
Please select where to store the key:
(1) Signature key
(3) Authentication key
Your selection? 1
On reproduit la même opération avec la seconde clef, mais avec une subtilité. Il faut tout d'abord déselectionner la première avant de procéder au transfert :
gpg> key 1
pub rsa4096/0xD3CFD97417D94589
created: 2017-02-07 expires: 2018-02-07 usage: C
trust: ultimate validity: ultimate
ssb rsa4096/0x72C2EBE383F28C98
created: 2017-02-07 expires: 2018-02-07 usage: S
ssb rsa4096/0x5E17DEB66A7BC8BB
created: 2017-02-07 expires: 2018-02-07 usage: E
[ultimate] (1). Jean Deauh <me@jeandeauh.fr>
gpg> key 2
pub rsa4096/0xD3CFD97417D94589
created: 2017-02-07 expires: 2018-02-07 usage: C
trust: ultimate validity: ultimate
ssb rsa4096/0x72C2EBE383F28C98
created: 2017-02-07 expires: 2018-02-07 usage: S
ssb* rsa4096/0x5E17DEB66A7BC8BB
created: 2017-02-07 expires: 2018-02-07 usage: E
[ultimate] (1). Jean Deauh <me@jeandeauh.fr>
gpg> keytocard
Please select where to store the key:
(2) Encryption key
Your selection? 2
gpg> save
On termine avec la fonction save
, et l'on pourra ensuite constater que GPG a bien enregistré que nos clefs sont stockées sur une smart card. Elles ont été remplacées par un stub. Ainsi, la machine sait qu'il peut utiliser ces clefs mais ne dispose que d'un lien virtuel vers une smart card pour les utiliser.
Une fois terminée, les informations contenues dans notre smart card étaient les suivantes :
Reader ...........: Gemalto USB Key Smart Card Reader 0
Application ID ...: D2760001240102010005000084C70000
Version ..........: 2.1
Manufacturer .....: ZeitControl
Serial number ....: 000084C7
Name of cardholder: Jean Deauh
Language prefs ...: fr
Sex ..............: male
URL of public key : https://www.jeandeauh.fr/pubkey.gpg
Login data .......: jeandeauh54
Signature PIN ....: forcé
Key attributes ...: rsa4096 rsa4096 rsa2048
Max. PIN lengths .: 32 32 32
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: F692 2092 9CAD 48F2 81E2 AB53 72C2 EBE3 83F2 8C98
created ....: 2017-02-07 15:33:45
Encryption key....: 5551 CD51 6903 2502 D165 CF29 5E17 DEB6 6A7B C8BB
created ....: 2017-02-07 15:33:55
Authentication key: [none]
General key info..: sub rsa4096/0x72C2EBE383F28C98 2017-02-07 Jean Deauh <me@jeandeauh.fr>
sec# rsa4096/0xD3CFD97417D94589 created: 2017-02-07 expires: 2018-02-07
ssb> rsa4096/0x72C2EBE383F28C98 created: 2017-02-07 expires: 2018-02-07
card-no: 0005 000084C7
ssb> rsa4096/0x5E17DEB66A7BC8BB created: 2017-02-07 expires: 2018-02-07
card-no: 0005 000084C7
Vous pouvez vérifier que les stubs sont bien en place en éditant votre paire de clefs. Vous obtiendrez alors un résultat qui vous indique le numéro de votre smart card :
pub rsa4096/0xD3CFD97417D94589
created: 2017-02-07 expires: 2018-02-07 usage: C
trust: ultimate validity: ultimate
ssb rsa4096/0x72C2EBE383F28C98
created: 2017-02-07 expires: 2018-02-07 usage: S
card-no: 0005 000084C7
ssb rsa4096/0x5E17DEB66A7BC8BB
created: 2017-02-07 expires: 2018-02-07 usage: E
card-no: 0005 000084C7
[ultimate] (1). Jean Deauh <me@jeandeauh.fr>
Vous pouvez tester la signature d'un fichier avec et sans votre clef USB insérée dans la machine pour vérifier que tout va bien en utilisant la procédure suivante :
echo "Coucou" > test.txt
gpg -s test.txt
Comment utiliser la smart card sur une nouvelle machine ?
Mais que faire pour recréer ces stubs sur une autre machine afin de pouvoir utiliser vos clefs ? Il suffit de disposer de la partie publique de votre paire de clefs. Elle peut être récupérée depuis un annuaire ou un site où vous l'avez mise à disposition.
Comme indiqué précédemment, vous pouvez aussi le faire avec l'information url
de votre smart card :
gpg --card-edit
fetch
Vous pourrez ensuite vérifier que la clef publique est présente au sein de la machine avec un gestionnaire de clefs ou la commande gpg -k
. Si c'est le cas, la procédure ne demandera qu'une commande :
gpg --card-status
GPG vérifiera que les clefs stockées correspondent à une clef publique présente sur la machine. Si oui, les stubs nécessaires seront créés et les informations de la carte affichées. Vous pourrez alors signer et déchiffrer des documents et des messages comme si votre paire de clef était présente sur la machine.
Une bonne protection en cas de perte ou de vol
Or, comme ce ne sera pas le cas, vous n'avez pas à craindre qu'un petit malin vienne accéder à vos fichiers pour tenter de récupérer vos clefs privées et de deviner votre phrase de passe.
À l'inverse, il faudra protéger votre smart card afin d'éviter qu'elle ne tombe en de mauvaises mains. Mais celle-ci aura l'avantage de limiter les erreurs au niveau du code PIN et donc les risques, même en cas de perte ou de vol.
Retrouvez notre dossier Chiffrement, clefs de sécurité et cryptobidules :
- Chiffrement : notre antisèche pour l'expliquer à vos parents
- OpenPGP et GnuPG : 25 ans de chiffrement pour tous, ce qu'il faut savoir avant de s'y mettre
- GPG : création de votre première paire de clefs et chiffrement d'un fichier
- GPG : comment créer une paire de clefs presque parfaite