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?
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 depinentry
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é pargpg --fingerprint --with-keygrip <user>
. Aucun d’entre eux ne fonctionne et faitgpg-connect-agent
toujours rapportERR 67108922 No data <GPG Agent>
. J'ai vérifié à nouveau que l'agent a toujours le mot de passe composé en s'exécutant correctementGPG_TTY= gpg --decrypt <file>
après avoir essayé divers identifiants de cache. (En cas de doute, en déconfigurantGPG_TTY
, le déchiffrement ne réussit que si la phrase secrète est déjà mise en cache pargpg-agent
.)Sur les versions ultérieures de gnupg (testé avec 2.1.18), utilisez:
gpg --fingerprint --with-keygrip <email>
pour obtenir la clé, puis
echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent
pour voir si c'est mis en cache ou pas.
la source
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
withgpg-connect-agent
.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éegpg --list-secret-keys --with-keygrip
.Source: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/
la source
Pour obtenir le cache, vous devez mentionner
--fingerprint
deux fois, par exemple:Le cacheid dans ce cas serait
E8514C2510C602910D47A0087C8B4360E50A8F2A
.la source
--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é.
la source