ssh-add -l
vous montre toutes les clés ssh qui ont été ajoutées avec ssh-add ~/.ssh/id_yourkey
. Comment puis-je faire la même chose avec gpg et gpg-agent, autrement dit, lui demander d'afficher une liste de clés en cache?
ssh-add -l
vous montre toutes les clés ssh qui ont été ajoutées avec ssh-add ~/.ssh/id_yourkey
. Comment puis-je faire la même chose avec gpg et gpg-agent, autrement dit, lui demander d'afficher une liste de clés en cache?
Réponses:
Vous ne pourrez peut-être pas le faire, du moins pas encore, ou du moins pas dans le cas général. Cependant, je partagerai ce que j'ai appris et j'espère pouvoir mettre à jour cette réponse le moment venu.
Tout d’abord, contrairement à la ssh-agent
capacité, qui cache en fait les clés privées, gpg-agent
peut mettre en cache des clés ou des phrases secrètes. Il appartient à chaque client de mettre en cache et gpg
utilise uniquement gpg-agent
pour mettre en cache la phrase secrète.
Vous pouvez interagir avec gpg-agent
à l'aide de l' gpg-connect-agent
utilitaire. Dans l'exemple qui suit, je passe des commandes une à une via STDIN.
$ CACHEID="ThisIsTheTrickyPart"
$ ERRSTR="Error+string+goes+here"
$ PMTSTR="Prompt"
$ DESSTR="Description+string+goes+here"
$ echo "GET_PASSPHRASE --data $CACHEID $ERRSTR $PMTSTR $DESSTR" | gpg-connect-agent
D MyPassPhrase
OK
Lors de l'appel gpg-connect-agent
et du passage de cette commande, la pinentry
commande configurée sur mon système utilise les chaînes d'erreur, d'invite et de description pour demander une phrase secrète. Dans ce cas, j'ai entré "MyPassPhrase", qui est renvoyé dans la sortie structurée (voir l'image ci-dessous) . Si j'envoie GET_PASSPHRASE
à gpg-agent
nouveau avec le même message $CACHEID
, il retourne la phrase secrète en cache au lieu de l'utiliser pinentry
.
GET_PASSPHRASE
accepte également une --no-ask
option qui renverra une erreur sur un cache manquant. Ici, j'utilise "NotCachedID" comme ID de cache et j'utilise des chaînes factices pour les arguments requis qui gpg-agent
ne seront pas utilisés.
$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>
En principe, vous pouvez demander à l'agent chaque phrase secrète éventuellement mise en cache, puis rechercher OK
ou ERR
dans le résultat. La question devient alors, comment générer l'identifiant de cache? Comme nous le voyons dans l'exemple ci-dessus, gpg-agent
son acceptation comme identifiant de cache est libérale. Il s'avère que gpg
calcule une empreinte digitale sur la clé publique et utilise une représentation sous forme de chaîne codée hexadécimale en tant qu'ID de cache, mais le problème est que cette empreinte digitale n'est pas la même que l'empreinte digitale que vous pouvez apprendre viagpg --fingerprint --list-secret-keys
. Ce résumé est appelé keygrip (car il est calculé sur le matériau de clé brut uniquement, tandis que l'empreinte digitale est calculée sur le matériau de clé et l'horodatage de création). Si vous voulez vraiment continuer dans cette voie, vous devrez trouver comment générer la bonne empreinte digitale pour chacune des clés que vous souhaitez vérifier (ce sera facile avec la prochaine génération de GnuPG, 2.1, avec l'option --with-keygrip
).
Avertissement: La sortie de GET_PASSPHRASE
contient réellement la phrase secrète en clair . Même si vous laissez cette --data
option désactivée , la phrase secrète est clairement visible sous forme de chaîne codée en hexadécimal. C’est probablement une très mauvaise idée (tm) de se moquer de tout cela à moins de savoir ce que vous faites et de prendre les précautions appropriées.
gpg-agent
, n'est-ce pas?
gpg-agent
invoque le type de pinentry
programme qu’il est configuré pour utiliser. Voir par exemple Comment forcer le mode console GPG à usage pinentry ... .
gpg-2.1.11
compilé à partir de la source sur Ubuntu 14.04, je ne peux pas comprendre l’ gpg-agent
identifiant du cache: j’ai essayé les deux poignées de clé (clé principale et sous-clé) et l’empreinte digitale de la clé, comme indiqué par gpg --fingerprint --with-keygrip <user>
. Aucun d’entre eux ne fonctionne et fait gpg-connect-agent
toujours rapport ERR 67108922 No data <GPG Agent>
. J'ai vérifié à nouveau que l'agent a toujours le mot de passe composé en s'exécutant correctement GPG_TTY= gpg --decrypt <file>
après avoir essayé divers identifiants de cache. (En cas de doute, en déconfigurant GPG_TTY
, le déchiffrement ne réussit que si la phrase secrète est déjà mise en cache par gpg-agent
.)
Sur les versions ultérieures de GnuPG (testé avec la version 2.2.9), il est également possible de répertorier les poignées de clé actuellement mises en cache par l'agent à l'aide de la commande keyinfo --list
with gpg-connect-agent
.
$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK
La 1
septième colonne indique que la clé est mise en cache. L'association entre une poignée et la clé qu'elle représente peut être récupérée gpg --list-secret-keys --with-keygrip
.
Source: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/
Pour obtenir le cache, vous devez mentionner --fingerprint
deux fois, par exemple:
$ gpg --fingerprint --fingerprint ftpadmin@kernel.org
pub 1024D/517D0F0E 2000-10-10
Key fingerprint = C75D C40A 11D7 AF88 9981 ED5B C86B A06A 517D 0F0E
uid Linux Kernel Archives Verification Key <ftpadmin@kernel.org>
sub 4096g/E50A8F2A 2000-10-10
Key fingerprint = E851 4C25 10C6 0291 0D47 A008 7C8B 4360 E50A 8F2A
Le cacheid dans ce cas serait E8514C2510C602910D47A0087C8B4360E50A8F2A
.
--fingerprint
contre deux --fingerprint --fingerprint
renvoie exactement le même résultat. Comme @BenCreasy écrit, la réponse ci-dessus en utilisant le keygrip fonctionne.
http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html
Le cacheid est l'empreinte complète de la clé.
gpg --fingerprint user@foo.bar