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

32

ssh-add -l mostra todas as chaves ssh que foram adicionadas com ssh-add ~/.ssh/id_yourkey . Como faço a coisa análoga com gpg e gpg-agent, em outras palavras, peço para mostrar uma lista de chaves em cache?

    
por user3243135 04.04.2013 / 10:25

5 respostas

30

Você pode não conseguir fazer isso, pelo menos não ainda, ou pelo menos não no caso geral. No entanto, compartilharei o que aprendi e espero atualizar essa resposta no devido tempo.

Primeiro, ao contrário do recurso ssh-agent , que na verdade armazena em cache as chaves privadas, gpg-agent pode armazenar em cache as chaves ou senhas. Cabe a cada cliente que armazenar em cache e gpg usa apenas gpg-agent para armazenar em cache a frase secreta.

Você pode interagir com gpg-agent usando o utilitário gpg-connect-agent . No exemplo a seguir, eu 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 invocar gpg-connect-agent e passar este comando, o comando pinentry configurado no meu sistema usa as strings de erro, prompt e descrição para solicitar uma frase secreta. Neste caso eu entrei em "MyPassPhrase" que é o que é retornado na saída estruturada (veja imagem abaixo) . Se eu enviar GET_PASSPHRASE para gpg-agent novamente com o mesmo $CACHEID , ele retornará a frase secreta em cache em vez de usar pinentry .

GET_PASSPHRASEtambémaceitaaopção--no-ask,queretornaráumerroemumafalhadecache.Aquieuuso"NotCachedID" como o ID do cache e uso strings fictícias para os argumentos necessários que o gpg-agent não usará.

$ echo "GET_PASSPHRASE --no-ask NotCachedID Err Pmt Des" | gpg-connect-agent
ERR 67108922 No data <GPG Agent>

Em princípio, então, você poderia perguntar ao agente por cada frase-chave armazenada em cache e verificar se há OK ou ERR na saída. A questão então se torna, como eu gero 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 hexadecimal como o ID do cache, mas o problema é que essa impressão digital não é igual à impressão digital que você pode aprender via gpg --fingerprint --list-secret-keys . Esse resumo é chamado de keygrip (porque é calculado somente sobre o material-chave bruto, enquanto a impressão digital é calculada sobre o material-chave e o timestamp de criação). Se você realmente quiser continuar nesse caminho, você terá que 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 frase-senha in clear . Mesmo se você deixar de fora a opção --data , a senha é claramente visível como uma string codificada em hexadecimal. É provavelmente uma Idéia Muito Ruim (tm) para se meter com isso a menos que você saiba o que está fazendo, e tome as devidas precauções.

    
por 14.06.2013 / 17:53
4

Em versões posteriores do gnupg (testado com 2.1.18) use:

gpg --fingerprint --with-keygrip <email>

para obter o keygrip e, em seguida,

echo "KEYINFO --no-ask <keygrip> Err Pmt Des" | gpg-connect-agent

para ver se está em cache ou não.

    
por 04.02.2017 / 11:16
3

Para obter o cacheid, você precisa mencionar --fingerprint duas 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, neste caso, seria E8514C2510C602910D47A0087C8B4360E50A8F2A .

    
por 29.05.2016 / 10:30
2

link

O cacheid é a impressão digital completa da chave.

gpg --fingerprint [email protected]
    
por 29.03.2015 / 00:35
1

Em versões posteriores do GnuPG (testado com 2.2.9) também é possível listar os keygrips 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

O 1 na sétima coluna indica que o keygrip está em cache. A associação entre um keygrip e a chave que ele representa pode ser recuperada com gpg --list-secret-keys --with-keygrip .

Fonte: link

    
por 05.09.2018 / 17:51

Tags