¿Cómo mostrar los detalles clave de gpg sin importarlo?

131

Tengo una copia de la clave gpg de repositorio apt postgresql y me gustaría ver los detalles de la clave gpg tal como viene en el archivo. ¿Es esto posible sin importarlo en un llavero?

Amos Shapira
fuente

Respuestas:

149

Hay varios niveles de detalle que puede obtener al mirar datos clave de OpenPGP: un resumen básico, una salida legible por máquina de este resumen o una lista detallada (y muy técnica) de los paquetes individuales de OpenPGP.

Información básica clave

Para un breve pico en un archivo de clave OpenPGP, simplemente puede pasar el nombre de archivo como parámetro o canalizar los datos clave a través de STDIN. Si no se pasa ningún comando, GnuPG intenta adivinar lo que desea hacer, y para los datos clave, se imprime un resumen en la clave:

$ 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]

Al configurar --keyid-format 0xlong, se imprimen las ID de clave larga en lugar de las ID de clave corta inseguras :

$ 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]

Proporcionar -vo -vvincluso agregará más información. Sin embargo, prefiero imprimir los detalles del paquete en este caso (ver más abajo).

Salida legible por máquina

GnuPG también tiene un formato de salida separado por dos puntos, que es fácilmente analizable y tiene un formato estable. El formato está documentado en el doc/DETAILSarchivo GnuPG . La opción para recibir este formato es --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 GnuPG 2.1.23, la gpg: WARNING: no command supplied. Trying to guess what you mean ...advertencia se puede omitir usando la --import-options show-onlyopción junto con el --importcomando (esto también funciona sin --with-colons, por supuesto):

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

Para versiones anteriores: el mensaje de advertencia se imprime en STDERR, por lo que puede leer STDIN para separar la información clave de la advertencia.

Detalles técnicos: Listado de paquetes OpenPGP

Sin instalar más paquetes, puede usar gpg --list-packets [file]para ver información sobre los paquetes OpenPGP contenidos en el archivo.

$ 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]

La pgpdump [file]herramienta funciona de manera similar gpg --list-packetsy proporciona una salida similar, pero resuelve todos esos identificadores de algoritmo en representaciones legibles. Está disponible para probablemente todas las distribuciones relevantes (en derivados de Debian, el paquete se llama pgpdumpcomo la herramienta en sí).

$ 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
fuente
1
Gracias. Acabo de usar "gpg --list-keys path-to-key-file" y obtuve lo que quería ver: ... hash subpkt 2 len 4 (sig creado 2013-02-24) hashed subpkt 9 len 4 (key caduca después de 4y134d23h24m) ... y pgpdump hace que la salida sea un poco más legible.
Amos Shapira
@AmosShapira ¿Estás seguro? Ese comando no funciona para mí en absoluto. Quizás quisiste decir --list-packets?
Jonathan Cross
1
@JonathanCross De hecho, la salida descrita suena como --list-packets.
Jens Erat
1
¿Cómo deshacerse de este feo WARNING: no command suppliedpara stderr? (Esto impide usar gpgcorrectamente los scripts. Cuando se trata de criptografía, la única forma segura es tratar cualquier salida a stderr como un error fatal. Solo así estará preparado cuando se descubran nuevas debilidades importantes que solo imprimen en stderr).
Tino
1
No sé que hay una manera fácil de evitarlo. Sin embargo, todavía puede usar el archivo de clave como llavero y luego ejecutar --list-keys, algo así gpg --no-default-keyring --keyring=/tmp/<keyfile> --list-keys. O simplemente descarte el mensaje de advertencia, hay un montón de opciones para filtrar stderr en scripts (ba) sh .
Jens Erat
31

Parece que me llevo bien simplemente:

$gpg <path_to_file>

Que salidas como esta:

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

La operación no especificó en particular qué información clave es relevante. Esta salida es todo lo que me importa.

Therealstubot
fuente
30

Para verificar y enumerar la huella digital de la clave (sin importarla primero al llavero), escriba

gpg --with-fingerprint <filename>

Editar: en Ubuntu 18.04 (gpg 2.2.4) la huella digital no se muestra con el comando anterior. Use la --with-subkey-fingerprintopción en su lugar

gpg --with-subkey-fingerprint <filename>
Ronny Andersson
fuente
44
Esta debería ser la respuesta aceptada de la OMI. Estoy de acuerdo con el comentario publicado como respuesta por @Skyr.
gertvdijk
2
ACK, esto es muy bueno, no requiere un llavero personal local, etc. muestra el nombre de la clave ... funciona mejor.
Florian Heigl
1
Por alguna razón desconocida / indocumentada gpg --with-fingerprintsuprime la impresión de huellas digitales a mi lado. Ubuntu 18.04gpg (GnuPG) 2.1.18
Tino
Lo mismo me está sucediendo a mí también @Tino, ¿encontraste información adicional sobre por qué?
kjones
@Tino y @kjones actualizaron la respuesta con --with-subkey-fingerprintinformación que debería funcionar en Ubuntu 18.04
Ronny Andersson
9

La opción --list-packetsanaliza los datos pgp de un archivo y genera su estructura, aunque de una manera muy técnica. Al analizar una clave pública, puede extraer fácilmente los identificadores de usuario y los identificadores de clave de las firmas.

Tenga cuidado de que este comando solo analiza el formato de datos, no valida las firmas o cosas similares.

Skyr
fuente
2

Cuando me topé con esta respuesta, estaba buscando una manera de obtener una salida que sea fácil de analizar. Para mí, la opción --with-colonshizo el truco:

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

La documentación se puede encontrar aquí .

Heye
fuente
¿Cómo se obtiene esa buena salida AAAA-MM-DD? No puedo reproducir eso con gpg2.x y --with-colons.
MKesper
1

También puede usar el --keyid-formatinterruptor para mostrar ID de clave corta o larga:

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

que sale así (ejemplo de la clave de repositorio Centgre de PostgreSQL)

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ł
fuente
0

pgpdump( https://www.lirnberger.com/tools/pgpdump/ ) es una herramienta que puede usar para inspeccionar bloques pgp.

Sin embargo, no es fácil de usar y bastante técnico.

  • analiza las claves públicas o privadas (sin previo aviso)
  • no modifica ningún llavero (en mi experiencia, a veces no está tan claro qué hace gpg detrás del capó)
  • imprime todos los paquetes, específicamente los paquetes de ID de usuario que muestran los diversos datos de texto sobre las claves.
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

desafortunadamente no lee stdin: /

mh-cbon
fuente
Mi pgpdumplee stdin. Por ejemplo, curl -s https://www.theguardian.com/pgp/PublicKeys/Guardian%20Application-Security.pub.txt | pgpdumpfunciona bien.
rickhg12hs
0

Para obtener las ID de clave (8 bytes, 16 dígitos hexadecimales), este es el comando que funcionó para mí en GPG 1.4.16, 2.1.18 y 2.2.19:

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

Para obtener más información (además de la ID de clave):

gpg --list-packets <key.asc

Para obtener aún más información:

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

El comando

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

también funciona en las 3 versiones, pero en GPG 1.4.16 solo imprime una ID de clave corta (4 bytes, 8 dígitos hexadecimales), por lo que es menos seguro identificar las claves.

Algunos comandos en otras respuestas (por ejemplo gpg --show-keys, gpg --with-fingerprint, gpg --import --import-options show-only) no funcionan en algunas de las versiones 3 GPG anteriores, por lo que no son portátiles cuando la orientación de múltiples versiones de GPG.

pts
fuente