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?
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?
Respostas:
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.
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 <jens.erat@fsfe.org>
uid Jens Erat <jens.erat@uni-konstanz.de>
uid Jens Erat <jabber@jenserat.de>
uid Jens Erat <email@jenserat.de>
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 <jens.erat@fsfe.org>
uid Jens Erat <jens.erat@uni-konstanz.de>
uid Jens Erat <jabber@jenserat.de>
uid Jens Erat <email@jenserat.de>
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 -v
ou -vv
mesmo adicionando mais algumas informações. Porém, prefiro imprimir os detalhes do pacote neste caso (veja abaixo).
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/DETAILS
arquivo 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 <jens.erat@fsfe.org>:
uid:::::::::Jens Erat <jens.erat@uni-konstanz.de>:
uid:::::::::Jens Erat <jabber@jenserat.de>:
uid:::::::::Jens Erat <email@jenserat.de>:
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-only
opção junto com o --import
comando (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.
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-packets
e 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 pgpdump
como 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]
--list-packets
?
--list-packets
.
WARNING: no command supplied
para stderr? (Isso impede que os gpg
scripts 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).
--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 .
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 <something@none.org>
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.
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-fingerprint
opção
gpg --with-subkey-fingerprint <filename>
gpg --with-fingerprint
suprime a impressão digital ao meu lado. Ubuntu 18.04gpg (GnuPG) 2.1.18
--with-subkey-fingerprint
informações que devem funcionar no Ubuntu 18.04 #
A opção --list-packets
analisa 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.
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-colons
fez 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 .
Você também pode usar a --keyid-format
opçã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 <pgsqlrpms-hackers@pgfoundry.org> │ When using --refresh-keys, if the key in question has a preferred keyserver URL, then use that
sub elg2048/D43F1AF8 2008-01-08 [E]
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,
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: /
pgpdump
leituras stdin
. Por exemplo, curl -s https://www.theguardian.com/pgp/PublicKeys/Guardian%20Application-Security.pub.txt | pgpdump
funciona bem.
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.