ssh-add -l
muestra todas las teclas ssh que se han agregado con ssh-add ~/.ssh/id_yourkey
. ¿Cómo hago lo análogo con gpg y gpg-agent, en otras palabras, pedirle que muestre una lista de claves en caché?
Es posible que no pueda hacer esto, al menos no todavía, o al menos no en el caso general. Sin embargo, compartiré lo que he aprendido y espero actualizar esta respuesta a su debido tiempo.
En primer lugar, a diferencia de la ssh-agent
capacidad, que realmente almacena en caché las claves privadas, gpg-agent
puede almacenar en caché las claves o las frases de contraseña. Depende de cada cliente qué almacenar en caché, y gpg
solo se utiliza gpg-agent
para almacenar en caché la frase de contraseña.
Puede interactuar con el gpg-agent
uso de la gpg-connect-agent
utilidad. En el ejemplo que sigue, paso comandos uno por uno a través de 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
Al invocar gpg-connect-agent
y pasar este comando, el pinentry
comando configurado en mi sistema utiliza las cadenas de error, solicitud y descripción para solicitar una frase de contraseña. En este caso, ingresé "MyPassPhrase", que es lo que se devuelve en la salida estructurada (ver imagen a continuación) . Si envío GET_PASSPHRASE
de gpg-agent
nuevo con lo mismo $CACHEID
, devuelve la frase de contraseña en caché en lugar de usar pinentry
.
GET_PASSPHRASE
También acepta una --no-ask
opción que devolverá un error en un error de caché. Aquí uso "NotCachedID" como ID de caché, y uso cadenas ficticias para los argumentos requeridos que gpg-agent
no se usarán.
$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>
En principio, entonces, podría pedirle al agente por cada frase de contraseña almacenada en caché a su vez, y verificar OK
o ERR
en la salida. La pregunta es, ¿cómo genero la ID de caché? Como vemos en el ejemplo anterior, gpg-agent
es liberal en lo que acepta como ID de caché. Resulta que gpg
calcula una huella digital en la clave pública y utiliza una representación de cadena codificada en hexadecimal como ID de caché, pero el problema es que esta huella digital no es la misma que la huella digital que puede aprender a través degpg --fingerprint --list-secret-keys
. Este resumen se denomina keygrip (porque se calcula sobre el material de la clave sin procesar solo mientras que la huella digital se calcula sobre el material de la clave y la marca de tiempo de creación). Si realmente desea continuar por este camino, tendrá que descubrir cómo generar la huella digital correcta para cada una de las teclas que desea verificar (esto será fácil con la próxima generación de GnuPG, 2.1, con la opción --with-keygrip
).
Advertencia: La salida de GET_PASSPHRASE
realmente contiene la frase de contraseña en claro . Incluso si deja de lado la --data
opción, la frase de contraseña es claramente visible como una cadena codificada en hexadecimal. Probablemente sea una muy mala idea (tm) jugar con esto a menos que sepa lo que está haciendo y tome las precauciones adecuadas.
gpg-agent
, ¿verdad?gpg-agent
invoca cualquier sabor delpinentry
programa que está configurado para usar. Véase, por ejemplo Cómo forzar GPG para el modo de utilización de la consola pinentry ... .gpg-2.1.11
compilado de la fuente en Ubuntu 14.04, no puedo entender cuál es lagpg-agent
identificación de la memoria caché: probé tanto las teclas de agarre (tecla principal y la subclave) como la huella digital de la llave, como se muestra engpg --fingerprint --with-keygrip <user>
. Ninguno de ellos funciona, ygpg-connect-agent
siempre informaERR 67108922 No data <GPG Agent>
. Verifiqué dos veces que el agente todavía tiene la frase de contraseña ejecutándose con éxitoGPG_TTY= gpg --decrypt <file>
después de probar varios identificadores de caché. (En caso de que no esté claro, al desarmarGPG_TTY
, el descifrado tiene éxito solo si la frase de contraseña ya está almacenada en cachégpg-agent
.)En versiones posteriores de gnupg (probado con 2.1.18) use:
gpg --fingerprint --with-keygrip <email>
para obtener la llave, entonces
echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent
para ver si está en caché o no.
fuente
En versiones posteriores de GnuPG (probado con 2.2.9), también es posible enumerar los keygrips que el agente almacena actualmente en caché utilizando el comando
keyinfo --list
withgpg-connect-agent
.El
1
en la séptima columna indica que el keygrip está en caché. La asociación entre un keygrip y la clave que representa se puede recuperar congpg --list-secret-keys --with-keygrip
.Fuente: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/
fuente
Para obtener el cacheid, debe mencionar
--fingerprint
dos veces, por ejemplo:El cacheid en este caso sería
E8514C2510C602910D47A0087C8B4360E50A8F2A
.fuente
--fingerprint
contra dos--fingerprint --fingerprint
devuelven exactamente la misma salida. Como escribe @BenCreasy, la respuesta anterior utilizando el keygrip funciona.http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html
El cacheid es la huella digital completa de la clave.
fuente