ssh-add -l
mostra todas as teclas ssh que foram adicionadas ssh-add ~/.ssh/id_yourkey
. Como faço a coisa análoga com gpg e gpg-agent, em outras palavras, solicitamos que ele mostre uma lista de chaves em cache?
Você pode não conseguir fazer isso, pelo menos ainda não, ou pelo menos não no caso geral. No entanto, compartilharei o que aprendi e espero atualizar esta resposta no devido tempo.
Primeiro, ao contrário da ssh-agent
capacidade, que realmente armazena em cache chaves privadas, gpg-agent
pode armazenar em cache chaves ou senhas. Cabe a cada cliente armazenar em cache e gpg
apenas usa gpg-agent
para armazenar em cache a senha.
Você pode interagir com o gpg-agent
uso do gpg-connect-agent
utilitário. No exemplo a seguir, estou passando comandos um de cada vez 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
Ao chamar gpg-connect-agent
e transmitir esse comando, o pinentry
comando configurado no meu sistema usa as seqüências de erro, prompt e descrição para solicitar uma senha. Nesse caso, digitei "MyPassPhrase", que é o que é retornado na saída estruturada (veja a imagem abaixo) . Se eu enviar GET_PASSPHRASE
para gpg-agent
novamente com o mesmo $CACHEID
, ele retornará a senha em cache em vez de usar pinentry
.
GET_PASSPHRASE
também aceita uma --no-ask
opção que retornará um erro em uma falta de cache. Aqui eu uso "NotCachedID" como o ID do cache e uso sequências simuladas para os argumentos necessários que gpg-agent
não serão utilizados.
$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>
Em princípio, você pode solicitar ao agente cada senha secreta talvez armazenada em cache por vez e verificar a saída OK
ou ERR
a saída. A pergunta então é: como faço para gerar o ID do cache? Como podemos ver no exemplo acima, gpg-agent
é liberal no que aceita como o ID do cache. Acontece que gpg
calcula uma impressão digital na chave pública e usa uma representação de cadeia codificada em hexadecimal como o ID do cache, mas o problema é que essa impressão digital não é a mesma que a impressão digital que você pode aprender viagpg --fingerprint --list-secret-keys
. Esse resumo é chamado keygrip (porque é calculado apenas sobre o material-chave bruto, enquanto a impressão digital é calculada sobre o material-chave e o carimbo de data / hora da criação). Se você realmente deseja continuar por esse caminho, precisará descobrir como gerar a impressão digital correta para cada uma das chaves que deseja verificar (isso será fácil usando a próxima geração do GnuPG, 2.1, com a opção --with-keygrip
).
Aviso: A saída de, GET_PASSPHRASE
na verdade, contém a senha em claro . Mesmo se você deixar de lado a --data
opção, a senha será claramente visível como uma sequência de código hexadecimal. Provavelmente, é uma péssima idéia (tm) mexer com isso, a menos que você saiba o que está fazendo e tome as precauções apropriadas.
gpg-agent
, é?gpg-agent
chama qualquer sabor dopinentry
programa que está configurado para usar. Ver, por exemplo Como forçar o GPG para o modo de uso do console pinentry ... .gpg-2.1.11
compilado da fonte no Ubuntu 14.04, não consigo descobrir qual é ogpg-agent
ID do cache: experimentei as teclas (chave principal e subchave) e a impressão digital da chave, conforme mostrado porgpg --fingerprint --with-keygrip <user>
. Nenhum deles funciona egpg-connect-agent
sempre informaERR 67108922 No data <GPG Agent>
. Verifiquei duas vezes se o agente ainda tem a senha executando com êxitoGPG_TTY= gpg --decrypt <file>
depois de experimentar vários IDs de cache. (No caso de não está claro, por desactivaçãoGPG_TTY
, descriptografia tiver êxito somente se a senha já está em cache pelogpg-agent
.)Nas versões posteriores do gnupg (testado com 2.1.18), use:
gpg --fingerprint --with-keygrip <email>
para obter o aperto de tecla,
echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent
para ver se está em cache ou não.
fonte
Nas versões posteriores do GnuPG (testadas com o 2.2.9), também é possível listar os toques de teclas atualmente armazenados em cache pelo agente usando o comando
keyinfo --list
withgpg-connect-agent
.A
1
na sétima coluna indica que o keygrip está armazenado em cache. A associação entre um aperto de tecla e a chave que ele representa pode ser recuperadagpg --list-secret-keys --with-keygrip
.Fonte: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/
fonte
Para obter o cacheid, você precisa mencionar
--fingerprint
duas vezes, por exemplo:O cacheid nesse caso seria
E8514C2510C602910D47A0087C8B4360E50A8F2A
.fonte
--fingerprint
contra dois--fingerprint --fingerprint
retornam exatamente a mesma saída. Como o @BenCreasy escreve, a resposta acima usando o keygrip funciona.http://lists.gnupg.org/pipermail/gnupg-users/2010-January/037876.html
O cacheid é a impressão digital completa da chave.
fonte