Como exibir os principais detalhes do gpg sem importá-lo?

131

Eu tenho uma cópia da chave gpg do repositório apt do postgresql e gostaria de ver os detalhes da chave gpg conforme ela aparece no arquivo. Isso é possível sem importá-lo para um conjunto de chaves?

Amos Shapira
fonte

Respostas:

149

Existem vários níveis de detalhes que você pode obter ao analisar os principais dados do OpenPGP: um resumo básico, uma saída legível por máquina deste resumo ou uma lista detalhada (e muito técnica) dos pacotes individuais do OpenPGP.

Informações-chave básicas

Para um breve pico em um arquivo de chave do OpenPGP, você pode simplesmente passar o nome do arquivo como parâmetro ou canalizar os dados da chave através do STDIN. Se nenhum comando for passado, o GnuPG tentará adivinhar o que você deseja fazer - e, para os dados principais, isso está imprimindo um resumo na chave:

$ gpg a4ff2279.asc
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
pub   rsa8192 2012-12-25 [SC]
      0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
uid           Jens Erat (born 1988-01-19 in Stuttgart, Germany)
uid           Jens Erat <[email protected]>
uid           Jens Erat <[email protected]>
uid           Jens Erat <[email protected]>
uid           Jens Erat <[email protected]>
uid           [jpeg image of size 12899]
sub   rsa4096 2012-12-26 [E] [revoked: 2014-03-26]
sub   rsa4096 2012-12-26 [S] [revoked: 2014-03-26]
sub   rsa2048 2013-01-23 [S] [expires: 2023-01-21]
sub   rsa2048 2013-01-23 [E] [expires: 2023-01-21]
sub   rsa4096 2014-03-26 [S] [expires: 2020-09-03]
sub   rsa4096 2014-03-26 [E] [expires: 2020-09-03]
sub   rsa4096 2014-11-22 [A] [revoked: 2016-03-01]
sub   rsa4096 2016-02-24 [A] [expires: 2020-02-23]

Por definição --keyid-format 0xlong, os IDs de chave longa são impressos em vez dos IDs de chave curta e inseguros :

$ gpg a4ff2279.asc                                                                 
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
pub   rsa8192/0x4E1F799AA4FF2279 2012-12-25 [SC]
      0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
uid                             Jens Erat (born 1988-01-19 in Stuttgart, Germany)
uid                             Jens Erat <[email protected]>
uid                             Jens Erat <[email protected]>
uid                             Jens Erat <[email protected]>
uid                             Jens Erat <[email protected]>
uid                             [jpeg image of size 12899]
sub   rsa4096/0x0F3ED8E6759A536E 2012-12-26 [E] [revoked: 2014-03-26]
sub   rsa4096/0x2D6761A7CC85941A 2012-12-26 [S] [revoked: 2014-03-26]
sub   rsa2048/0x9FF7E53ACB4BD3EE 2013-01-23 [S] [expires: 2023-01-21]
sub   rsa2048/0x5C88F5D83E2554DF 2013-01-23 [E] [expires: 2023-01-21]
sub   rsa4096/0x8E78E44DFB1B55E9 2014-03-26 [S] [expires: 2020-09-03]
sub   rsa4096/0xCC73B287A4388025 2014-03-26 [E] [expires: 2020-09-03]
sub   rsa4096/0x382D23D4C9773A5C 2014-11-22 [A] [revoked: 2016-03-01]
sub   rsa4096/0xFF37A70EDCBB4926 2016-02-24 [A] [expires: 2020-02-23]
pub   rsa1024/0x7F60B22EA4FF2279 2014-06-16 [SCEA] [revoked: 2016-08-16]

Fornecendo -vou -vvmesmo adicionando mais algumas informações. Porém, prefiro imprimir os detalhes do pacote neste caso (veja abaixo).

Saída legível por máquina

O GnuPG também possui um formato de saída separado por dois pontos, que é facilmente analisável e possui um formato estável. O formato está documentado no doc/DETAILSarquivo GnuPG . A opção para receber este formato é --with-colons.

$ gpg --with-colons a4ff2279.asc
gpg: WARNING: no command supplied.  Trying to guess what you mean ...
pub:-:8192:1:4E1F799AA4FF2279:1356475387:::-:
uid:::::::::Jens Erat (born 1988-01-19 in Stuttgart, Germany):
uid:::::::::Jens Erat <[email protected]>:
uid:::::::::Jens Erat <[email protected]>:
uid:::::::::Jens Erat <[email protected]>:
uid:::::::::Jens Erat <[email protected]>:
uat:::::::::1 12921:
sub:-:4096:1:0F3ED8E6759A536E:1356517233:1482747633:::
sub:-:4096:1:2D6761A7CC85941A:1356517456:1482747856:::
sub:-:2048:1:9FF7E53ACB4BD3EE:1358985314:1674345314:::
sub:-:2048:1:5C88F5D83E2554DF:1358985467:1674345467:::
sub:-:4096:1:8E78E44DFB1B55E9:1395870592:1599164118:::
sub:-:4096:1:CC73B287A4388025:1395870720:1599164118:::
sub:-:4096:1:382D23D4C9773A5C:1416680427:1479752427:::
sub:-:4096:1:FF37A70EDCBB4926:1456322829:1582466829:::

Desde o GnuPG 2.1.23, o gpg: WARNING: no command supplied. Trying to guess what you mean ...aviso pode ser omitido usando a --import-options show-onlyopção junto com o --importcomando (isso também funciona sem --with-colons, é claro):

$ gpg --with-colons --import-options show-only --import a4ff2279
[snip]

Para versões mais antigas: a mensagem de aviso é impressa no STDERR, para que você possa ler STDIN para separar as principais informações do aviso.

Detalhes técnicos: Listando pacotes OpenPGP

Sem instalar nenhum pacote adicional, você pode usar gpg --list-packets [file]para visualizar informações sobre os pacotes OpenPGP contidos no arquivo.

$ gpg --list-packets a4ff2279.asc
:public key packet:
    version 4, algo 1, created 1356475387, expires 0
    pkey[0]: [8192 bits]
    pkey[1]: [17 bits]
    keyid: 4E1F799AA4FF2279
:user ID packet: "Jens Erat (born 1988-01-19 in Stuttgart, Germany)"
:signature packet: algo 1, keyid 4E1F799AA4FF2279
    version 4, created 1356516623, md5len 0, sigclass 0x13
    digest algo 2, begin of digest 18 46
    hashed subpkt 27 len 1 (key flags: 03)
[snip]

A pgpdump [file]ferramenta funciona de maneira semelhante gpg --list-packetse fornece uma saída semelhante, mas resolve todos esses identificadores de algoritmo para representações legíveis. Está disponível para provavelmente todas as distribuições relevantes (nos derivativos Debian, o pacote é chamado pgpdumpcomo a própria ferramenta).

$ pgpdump a4ff2279.asc
Old: Public Key Packet(tag 6)(1037 bytes)
    Ver 4 - new
    Public key creation time - Tue Dec 25 23:43:07 CET 2012
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA n(8192 bits) - ...
    RSA e(17 bits) - ...
Old: User ID Packet(tag 13)(49 bytes)
    User ID - Jens Erat (born 1988-01-19 in Stuttgart, Germany)
Old: Signature Packet(tag 2)(1083 bytes)
    Ver 4 - new
    Sig type - Positive certification of a User ID and Public Key packet(0x13).
    Pub alg - RSA Encrypt or Sign(pub 1)
    Hash alg - SHA1(hash 2)
    Hashed Sub: key flags(sub 27)(1 bytes)
[snip]
Jens Erat
fonte
1
Obrigado. Eu apenas usei "gpg --list-keys path-to-key-file" e consegui o que queria ver: ... hashed subpkt 2 len 4 (sig created 2013-02-24) hashed subpkt 9 len 4 (key expira após 4y134d23h24m) ... e o pgpdump torna a saída um pouco mais legível.
Amos Shapira
@AmosShapira Você tem certeza? Esse comando não funciona para mim. Talvez você quis dizer --list-packets?
Jonathan Cruz
1
@ JonathanCross De fato, a saída descrita parece --list-packets.
Jens Erat #
1
Como se livrar desse feio WARNING: no command suppliedpara stderr? (Isso impede que os gpgscripts sejam usados corretamente. Quando se trata de criptografia, a única maneira segura é tratar qualquer saída para stderr como erro fatal. Somente dessa maneira você estará preparado quando novas fraquezas importantes forem descobertas, que só serão impressas em stderr).
Tino
1
Não sei que há uma maneira fácil de contornar. Você ainda pode usar o arquivo de chave como chaveiro e, em seguida --list-keys, executar algo parecido gpg --no-default-keyring --keyring=/tmp/<keyfile> --list-keys. Ou simplesmente descarte a mensagem de aviso, há várias opções para filtrar o stderr nos scripts (ba) sh .
Jens Erat #:
31

Parece que sou capaz de me dar bem com simplesmente:

$gpg <path_to_file>

Que saídas como esta:

$ gpg /tmp/keys/something.asc 
  pub  1024D/560C6C26 2014-11-26 Something <[email protected]>
  sub  2048g/0C1ACCA6 2014-11-26

A operação não especificou em particular quais informações importantes são relevantes. Esta saída é tudo que me interessa.

Therealstubot
fonte
30

Para verificar e listar a impressão digital da chave (sem importá-la primeiro no chaveiro), digite

gpg --with-fingerprint <filename>

Edit: no Ubuntu 18.04 (gpg 2.2.4) a impressão digital não é exibida com o comando acima. Use a --with-subkey-fingerprintopção

gpg --with-subkey-fingerprint <filename>
Ronny Andersson
fonte
4
Essa deve ser a resposta aceita na versão imo. Eu concordo com o comentário postado como resposta por @Skyr.
Gtvdijk
2
ACK, isso é muito bom, não requer chaveiro pessoal local etc. exibe o nome da chave ... funciona melhor.
Florian Heigl
1
Por alguma razão desconhecida / não documentada, gpg --with-fingerprintsuprime a impressão digital ao meu lado. Ubuntu 18.04gpg (GnuPG) 2.1.18
Tino
O mesmo está acontecendo comigo também, @Tino, encontrou alguma informação adicional sobre o porquê?
Kjones 12/04/19
@Tino e @kjones Atualizada a resposta com --with-subkey-fingerprintinformações que devem funcionar no Ubuntu 18.04 #
Ronny Andersson
9

A opção --list-packetsanalisa dados pgp de um arquivo e gera sua estrutura - de uma maneira muito técnica. Ao analisar uma chave pública, é possível extrair facilmente os IDs de usuário e os IDs de chave das assinaturas.

Cuidado para que esse comando analise apenas o formato dos dados, não faz validação de assinaturas ou coisas semelhantes.

Skyr
fonte
2

Quando me deparei com essa resposta, estava procurando uma maneira de obter uma saída fácil de analisar. Para mim, a opção --with-colonsfez o truque:

$ gpg --with-colons file
sec::4096:1:AAAAAAAAAAAAAAAA:YYYY-MM-DD::::Name (comment) email
ssb::4096:1:BBBBBBBBBBBBBBBB:YYYY-MM-DD::::

A documentação pode ser encontrada aqui .

Heye
fonte
Como você consegue essa boa saída AAAA-MM-DD? Não consigo reproduzir isso com gpg2.xe --with-colons.
MKesper 02/04/19
1

Você também pode usar a --keyid-formatopção para mostrar o ID da chave curta ou longa:

$ gpg2 -n --with-fingerprint --keyid-format=short --show-keys <filename>

que gera resultados como este (exemplo da chave de repo PostgreSQL CentOS):

pub   dsa1024/442DF0F8 2008-01-08 [SCA]                                                                       │
      Key fingerprint = 68C9 E2B9 1A37 D136 FE74  D176 1F16 D2E1 442D F0F8                                    │              honor-keyserver-url
uid                    PostgreSQL RPM Building Project <[email protected]>                      │                     When  using --refresh-keys, if the key in question has a preferred keyserver URL, then use that
sub   elg2048/D43F1AF8 2008-01-08 [E]
Paweł
fonte
0

pgpdump( https://www.lirnberger.com/tools/pgpdump/ ) é uma ferramenta que você pode usar para inspecionar blocos pgp.

Não é fácil de usar e bastante técnico, no entanto,

  • analisa chaves públicas ou privadas (sem aviso)
  • ele não modifica nenhum chaveiro (às vezes não é tão claro o que o gpg faz por trás do capô, na minha experiência)
  • imprime todos os pacotes, especificamente os pacotes da identificação do usuário que mostram os vários dados de texto sobre as chaves.
pgpdump -p test.asc 
New: Secret Key Packet(tag 5)(920 bytes)
    Ver 4 - new
    Public key creation time - Fri May 24 00:33:48 CEST 2019
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA n(2048 bits) - ...
    RSA e(17 bits) - ...
    RSA d(2048 bits) - ...
    RSA p(1024 bits) - ...
    RSA q(1024 bits) - ...
    RSA u(1020 bits) - ...
    Checksum - 49 2f 
New: User ID Packet(tag 13)(18 bytes)
    User ID - test (test) <tset>                        
New: Signature Packet(tag 2)(287 bytes)
    Ver 4 - new
    Sig type - Positive certification of a User ID and Public Key packet(0x13).
    Pub alg - RSA Encrypt or Sign(pub 1)
    Hash alg - SHA256(hash 8)
    Hashed Sub: signature creation time(sub 2)(4 bytes)
        Time - Fri May 24 00:33:49 CEST 2019
    Hashed Sub: issuer key ID(sub 16)(8 bytes)
        Key ID - 0x396D5E4A2E92865F
    Hashed Sub: key flags(sub 27)(1 bytes)
        Flag - This key may be used to certify other keys
        Flag - This key may be used to sign data
    Hash left 2 bytes - 74 7a 
    RSA m^d mod n(2048 bits) - ...
        -> PKCS-1

infelizmente não lê stdin: /

mh-cbon
fonte
Minhas pgpdumpleituras stdin. Por exemplo, curl -s https://www.theguardian.com/pgp/PublicKeys/Guardian%20Application-Security.pub.txt | pgpdumpfunciona bem.
rickhg12hs 7/03
0

Para obter os IDs de chave (8 bytes, 16 dígitos hexadecimais), este é o comando que funcionou para mim no GPG 1.4.16, 2.1.18 e 2.2.19:

gpg --list-packets <key.asc | awk '$1=="keyid:"{print$2}'

Para obter mais informações (além do ID da chave):

gpg --list-packets <key.asc

Para obter ainda mais informações:

gpg --list-packets -vvv --debug 0x2 <key.asc

O comando

gpg --dry-run --import <key.asc

também funciona nas 3 versões, mas no GPG 1.4.16 ele imprime apenas um ID de chave curto (4 bytes, 8 dígitos hexadecimais), portanto, é menos seguro identificar as chaves.

Alguns comandos em outras respostas (por exemplo gpg --show-keys, gpg --with-fingerprint, gpg --import --import-options show-only) não funcionam em algumas das 3 versões GPG acima, portanto, eles não são portáteis ao alvejar múltiplas versões de GPG.

pts
fonte