Como posso descobrir quais chaves o gpg-agent armazenou em cache? (como como o ssh-add -l mostra as chaves ssh em cache)

40

ssh-add -lmostra 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?

user3243135
fonte

Respostas:

32

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-agentcapacidade, que realmente armazena em cache chaves privadas, gpg-agentpode armazenar em cache chaves ou senhas. Cabe a cada cliente armazenar em cache e gpgapenas usa gpg-agentpara armazenar em cache a senha.

Você pode interagir com o gpg-agentuso do gpg-connect-agentutilitá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-agente transmitir esse comando, o pinentrycomando 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_PASSPHRASEpara gpg-agentnovamente com o mesmo $CACHEID, ele retornará a senha em cache em vez de usar pinentry.

                                 ss da caixa de diálogo

GET_PASSPHRASEtambém aceita uma --no-askopçã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-agentnã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 OKou ERRa 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 gpgcalcula 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_PASSPHRASEna verdade, contém a senha em claro . Mesmo se você deixar de lado a --dataopçã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.

neirbowj
fonte
Ótima resposta! Estou procurando há dias e não consegui encontrar muita coisa sobre isso. Maneira de juntar tudo e explicar em termos claros e concisos!
Slm
A captura de tela não é pinentry, mas algum programa do GNOME interceptando gpg-agent, é?
Hauke ​​Laging
gpg-agentchama qualquer sabor do pinentryprograma que está configurado para usar. Ver, por exemplo Como forçar o GPG para o modo de uso do console pinentry ... .
Neirbowj
Usando o gpg-2.1.11compilado da fonte no Ubuntu 14.04, não consigo descobrir qual é o gpg-agentID 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-agentsempre 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.)
Matei David
2.0.14 poderia ser corrigido? Usando a técnica acima, o gpg-agent realmente possui a senha desejada para a chave especificada (identificada pelo aperto de tecla), mas quando tento assinar com esse aperto de chave, ainda assim sou solicitada uma senha. Por quê?
Otheus 19/09/16
8

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.

gimmesudo
fonte
5

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 --listwith gpg-connect-agent.

$ gpg-connect-agent 'keyinfo --list' /bye
S KEYINFO 866C3DE249CF81E31A3691845DBADE2809487FF5 D - - 1 P - - -
S KEYINFO 04278155E72CAE8FF1548FE161F1B8F7673824F4 D - - - P - - -
OK

A 1na 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/

GeoffreyFrogeye
fonte
3

Para obter o cacheid, você precisa mencionar --fingerprintduas vezes, por exemplo:

$ gpg --fingerprint --fingerprint [email protected]
pub   1024D/517D0F0E 2000-10-10
      Key fingerprint = C75D C40A 11D7 AF88 9981  ED5B C86B A06A 517D 0F0E
uid                  Linux Kernel Archives Verification Key <[email protected]>
sub   4096g/E50A8F2A 2000-10-10
      Key fingerprint = E851 4C25 10C6 0291 0D47  A008 7C8B 4360 E50A 8F2A

O cacheid nesse caso seria E8514C2510C602910D47A0087C8B4360E50A8F2A.

Ed Neville
fonte
Isso funcionou para mim
Matthew Hannigan
A resposta em unix.stackexchange.com/a/342461/108198 parece melhor.
Ben Creasy
Isso não funciona para mim ... um --fingerprintcontra dois --fingerprint --fingerprintretornam exatamente a mesma saída. Como o @BenCreasy escreve, a resposta acima usando o keygrip funciona.
Trey