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?
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?
Respostas:
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 do pinentry
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 é o gpg-agent
ID do cache: experimentei as teclas (chave principal e subchave) e a impressão digital da chave, conforme mostrado por gpg --fingerprint --with-keygrip <user>
. Nenhum deles funciona e gpg-connect-agent
sempre informa ERR 67108922 No data <GPG Agent>
. Verifiquei duas vezes se o agente ainda tem a senha executando com êxito GPG_TTY= gpg --decrypt <file>
depois de experimentar vários IDs de cache. (No caso de não está claro, por desactivação GPG_TTY
, descriptografia tiver êxito somente se a senha já está em cache pelo gpg-agent
.)
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
with gpg-connect-agent
.
$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK
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 recuperada gpg --list-secret-keys --with-keygrip
.
Fonte: https://demu.red/blog/2016/06/how-to-check-if-your-gpg-key-is-in-cache/
Para obter o cacheid, você precisa mencionar --fingerprint
duas vezes, por exemplo:
$ 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
O cacheid nesse caso seria E8514C2510C602910D47A0087C8B4360E50A8F2A
.
--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.
gpg --fingerprint user@foo.bar