Deux problèmes avec password-store et GnuPG

Pour gérer mes mots de passe, j’utilise l’excellent outil pass du projet password-store. Celui-ci utilise GnuPG pour chiffrer chaque mot de passe.

J’ai récemment changé de système d’exploitation (j’y reviendrai probablement en détails dans un prochain article) et je suis tombé sur deux problèmes avec ces deux outils. Comme j’ai mis un certain temps à trouver la cause et la solution à chacun de ces deux problèmes, je les partage ici si cela peut aider quelqu’un.

« Pas de clef secrète »

Le problème

Après avoir migré vers mon nouveau système d’exploitation et après avoir installé password-store, je demande un mot de passe et j’obtiens une erreur inquiétante :

$ pass show <nom du mot de passe>
gpg: starting migration from earlier GnuPG versions
gpg: porting secret keys from '/home/julien/.gnupg/secring.gpg' to gpg-agent
gpg: migration succeeded
gpg: échec du déchiffrement : Pas de clef secrète

Mon explication

En changement de système d’exploitation, je suis passé d’une version 1.x de GnuPG (version 1.4 ou 1.7) vers une version 2.x (version 2.2.12 exactement). Ma clé secrète a été automatiquement migrée. J’ai, pendant un long moment, pensé que le problème était lié à cette migration mais je  pense qu’il n’en est rien.

L’erreur est en fait due au fait que gpg-agent, le démon lancé en arrière-plan par gpg pour gérer les clés secrètes, ne trouve pas de pinentry, ce petit utilitaire qui permet de taper le mot de passe associé à une clé secrète. Comme aucun mot de passe ne peut être saisi, le déchiffrement ne peut pas se faire.

Ma solution

J’ai d’abord installé un pinentry. Plusieurs sont disponibles mais j’ai choisi pinentry-gtk2 du projet GnuPG lui-même. La procédure dépend ici du système d’exploitation.

Ensuite, je me suis assuré que le pinentry installé soit bien trouvé par gpg-agent. Le chemin par défaut est indiqué dans la page de man de gpg-agent (man gpg-agent). Comme le chemin ne correspondait pas, j’ai configuré gpg-agent en créant un fichier ~/.gnupg/gpg-agent.conf avec le contenu suivant :

pinentry-program <chemin absolu du pinentry>

Enfin, j’ai tué le démon gpg-agent afin qu’il soit relancé avec la nouvelle configuration :

$ killall gpg-agent

J’ai relancé la commande pass ci-dessus et la boîte de dialogue du pinentry est bien apparue pour me demander mon mot de passe de clé secrète. Après saisie, le mot de passe désiré a bien été déchiffré.

« No public key »

Le problème

Cette fois, c’est lorsque j’ai essayé d’ajouter un mot de passe que j’ai obtenu une erreur :

$ pass insert <nom du mot de passe>
Enter password for <nom du mot de passe>: 
Retype password for <nom du mot de passe>: 
XXX <xxx@domain.tld>: skipped: No public key
gpg: [stdin]: encryption failed: No public key
Password encryption aborted.

Mon explication

GnuPG ne retrouve pas la clé publique dont la référence est fournie par password-store. Cette référence se trouve dans le fichier ~/.password-store/.gpg-id. Dans mon cas, c’est l’alias de la clé (XXX <xxx@domain.tld>) qui y est indiqué. Cet alias contient un caractère français accentué. Je suspecte donc un problème de décodage de caractères, peut-être lié à l’absence de locales dans le système.

Ma solution

J’ai indiqué l’identifiant de la clé à password-store, au lieu de l’alias, afin d’éviter tout problème lié au codage de caractères.

Pour cela, j’ai d’abord listé les clés :

$ gpg --list-keys
/home/julien/.gnupg/pubring.kbx
-------------------------------
pub   rsa2048 2013-08-23 [SC]
      704B4670E3A941D56A1C57829AB0A8F0A73DDA4C
uid          [ inconnue] XXX <xxx@domain.tld>
sub   rsa2048 2013-08-23 [E]

Puis j’ai remplacé le contenu du fichier ~/.password-store/.gpg-id par l’identifiant de la clé (704B4670E3A941D56A1C57829AB0A8F0A73DDA4C).

J’ai relancé la commande pass ci-dessous et tout a fonctionné.

Vus : 445
Publié par Julien L : 29