GPG: ¿verificar las firmas sin crear una cadena de confianza?

19

¿Es posible pedirle a gpg (o gpg4win) que verifique si un archivo fue firmado por un archivo de clave pública en particular, sin tener que importar, firmar y confiar en esa clave?

es decir, algo como

gpg --using-key pubkey.txt --verify message.txt

en lugar de tener que crear su propia clave privada y luego hacer

gpg --import pubkey.txt 
gpg --lsign-key [name within pubkey.txt]
# ... something to do with choosing trust levels
gpg --verify message.txt
OJW
fuente
1
Intente ver si el comando gpg --status-fd 1 --verify (thefile)da en su salida como primera cadena la huella digital de la clave que hizo la firma.
harrymc
Algún contexto aquí: tenemos un sistema que firma cosas. Damos su clave pública a las personas que pueden recibir mensajes de este sistema, para que puedan verificar que los mensajes no fueron alterados. Sin embargo, no queremos decirle a los destinatarios que "confíen en cualquier cosa firmada por esta clave" porque entonces podría usarse para autenticar mensajes de otros sistemas (por ejemplo, correos electrónicos de sus amigos).
OJW
Entonces, queremos darle a alguien un comando / archivo por lotes que verifique "¿gpg dice que esta clave envió este mensaje?" sin interferir con su uso diario de gpg para comunicarse con otras personas. Solo se debe confiar en la clave porque la línea de comandos lo solicita, no porque se le haya dicho a GPG que siempre confíe en ella.
OJW

Respuestas:

14

Debe tener la clave pública para verificar una firma realizada con la clave privada correspondiente, pero no tiene que firmar o incluso firmar localmente la clave. En este caso, recibirá una advertencia de GPG de que la clave no es de confianza.

Aquí hay una prueba que hice con un archivo firmado por mi propia clave, pero en un sistema donde la clave no se había importado:

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ 

Desafortunadamente, la sugerencia de Harry no funciona, extrae un poco más de información, pero no lo suficiente como para ser útil.

Como puede ver, la mayoría de la información obtenida es la ID de clave de la subclave utilizada para hacer la firma y la hora en que se hizo la firma. Esto coincide con los datos disponibles para pgpdump (o --list-packets):

bash-3.2$ pgpdump thing.txt.gpg 
Old: Compressed Data Packet(tag 8)
    Comp alg - ZLIB <RFC1950>(comp 2)
Old: One-Pass Signature Packet(tag 4)(13 bytes)
    New version(3)
    Sig type - Signature of a binary document(0x00).
    Hash alg - SHA512(hash 10)
    Pub alg - RSA Encrypt or Sign(pub 1)
    Key ID - 0x7FF2D37135C7553C
    Next packet - other than one pass signature
Old: Literal Data Packet(tag 11)(24 bytes)
    Format - binary
    Filename - thing.txt
    File modified time - Thu Sep 26 06:51:39 EST 2013
    Literal - ...
Old: Signature Packet(tag 2)(412 bytes)
    Ver 4 - new
    Sig type - Signature of a binary document(0x00).
    Pub alg - RSA Encrypt or Sign(pub 1)
    Hash alg - SHA512(hash 10)
    Hashed Sub: signature creation time(sub 2)(4 bytes)
        Time - Thu Sep 26 06:51:39 EST 2013
    Sub: issuer key ID(sub 16)(8 bytes)
        Key ID - 0x7FF2D37135C7553C
    Hash left 2 bytes - f0 97 
    RSA m^d mod n(3066 bits) - ...
        -> PKCS-1
bash-3.2$ 

Como puede ver, proporciona el algoritmo hash, los detalles del tipo de clave (mi clave de firma es una subclave RSA de 3072 bits y la ID de clave de la subclave, pero no hay nada que identifique la clave maestra. Esa información es solo se revela cuando tiene la clave pública y verifica la firma.

Luego importé mi clave pública en ese sistema e intenté nuevamente:

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

Ahora puede identificar la clave y relacionarla con la clave principal. Sin embargo, es posible reducir la naturaleza de esas advertencias como esta:

[ben@seditious tmp]$ gpg -v --verify --trust-model always thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

Todavía hay una advertencia de que es una clave no confiable, pero no de manera masiva y eliminar la verbosidad solo lo reduce a esto:

[ben@seditious tmp]$ gpg --verify --trust-model always thing.txt.gpg 
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
[ben@seditious tmp]$ 

La clave pública es necesaria para la etapa de verificación porque se usa para unir los datos generados por el firmante con su clave privada. Puede considerarse, en términos simples, como el complemento del cifrado donde se necesita la clave privada para descifrar los datos cifrados en la clave pública.

Nota: He modificado un poco los UID en este ejemplo, pero todos los que obtengan esa clave verán lo que realmente son. De lo contrario, el resultado es copiar y pegar directamente.

EDITAR: puede llamar al archivo de clave pública directamente como un llavero si lo tiene en el formato blindado no ASCII (es decir, un archivo .gpg en lugar de un archivo .asc). Aun así, todavía necesita la clave pública. Para hacer esto, el comando es así:

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious ~]$ 
Ben
fuente
Mirando su producción, he llegado a la conclusión exactamente opuesta. He utilizado su salida en mi respuesta, pero le he dado crédito por ello.
harrymc
La parte a la que se refiere, que es la forma larga de la ID de clave de la subclave (técnicamente, la ID de clave completa es la huella digital) es la única parte identificable. Sin embargo, sin la posesión de la clave pública, no puede identificar la clave maestra ni verificar la firma. Los detalles de esto se encuentran en la sección 5.2 de RFC 4880 (con un poco en la sección 2.2, pero 5.2 es donde están las cosas útiles). Si me equivoco, pruebo la verificación sin una copia de la clave (pista: no puedes hacerlo con mis ejemplos).
Ben
Además, en su conclusión con respecto a --verify, solo funciona cuando la clave está disponible; de ​​lo contrario, regrese al primer ejemplo en mi respuesta donde se verifica la identificación de la clave y la hora de la firma, pero no se encuentra la clave.
Ben
Sí, por supuesto, la identificación completa no es posible solo con la ID de la clave. He modificado mi respuesta para indicar claramente que esto es solo una heurística. Su conclusión es que lo que pide el afiche es imposible, pero probablemente se deba a que el afiche usó la palabra "verificar", que es demasiado fuerte.
harrymc
1
Es cierto, el OP probablemente no esté usando los términos correctamente y es posible que los haya falsificado también en un par de lugares ( anoche estornudaba mucho ). Si su pregunta era solo para validar una firma sin importar una clave, entonces el ejemplo en mi edición muestra cómo se puede hacer, pero solo si esa clave está en formato OpenPGP (pubkey.gpg). No funciona si la clave exportada está en formato blindado ASCII (pubkey.asc).
Ben
2

Si está de acuerdo con el envío de un llavero, en lugar de un archivo de clave pública, probablemente desee usar en gpgvlugar de gpg:

gpgv --keyring key.ring somefile.txt
womble
fuente
0

Si su palabra "verificar" en la pregunta significa "verificar absolutamente", entonces, por supuesto, se debe importar una clave pública para verificar completamente un documento firmado. Sin embargo, si esto significa "identificar", entonces describo a continuación una heurística que puede decir si un grupo de documentos fueron firmados por la misma firma.

Según las pruebas realizadas por @Ben para verificar mi comentario, existe la posibilidad de que el siguiente comando se pueda utilizar para indicar heurísticamente la clave de firma:

gpg --status-fd 1 --verify thefile.gpg

La prueba de Ben dio el resultado a continuación. Son notables los valores de ERRSIG y NO_PUBKEY, y también el valor de "ID de clave RSA" que está parcialmente contenido en ambos, de la siguiente manera:

[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found

Nota arriba de la cadena 7FF2D37135C7553C. Esta misma cadena se encuentra dentro de la huella digital de la clave que se informa una vez que se importa la clave:

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.
Primary key fingerprint: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512

Esta cadena se encuentra como la parte inferior de la huella digital (subclave arriba), por lo que posiblemente podría usarse para identificar la clave. La "huella digital de la clave principal" probablemente también debería verificarse, además de la subclave.

La cadena "ID de clave RSA" es idéntica en ambas salidas y también se encuentra como la última parte de la huella digital, por lo que es posible que sea suficiente por sí sola para identificar la firma. Si ese es el caso, usar solo la salida de gpg --verifypodría ser suficiente para identificar la firma de una manera más simple.

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found

Mi conocimiento de GPG no es suficiente para validar completamente este método, por lo que debería probarlo en más archivos de ejemplo. Si funciona, puede ordenar los archivos de acuerdo con sus firmas, pero deberá importar la clave para encontrar la identidad del firmante.

Para establecer claramente de nuevo: Este método no puede identificar completamente una firma. Es solo una forma de ordenar heurísticamente los documentos firmados.

harrymc
fuente
Una firma contiene suficientes datos para identificar la clave utilizada para crearla y, junto con los servidores de claves, puede utilizarse para localizar la clave maestra (suponiendo que se utilizó una subclave de firma como en mis ejemplos). Sin una copia de la clave pública en formato OpenPGP (ya sea en un llavero o como en mi ejemplo final), la validación de la firma no es posible porque la huella digital / ID de la clave no son datos suficientes para calcular eso.
Ben
@Ben: Repito que esto es solo una heurística, que es lo mejor que se puede hacer para responder la pregunta del afiche de "verificar si un archivo fue firmado por un archivo de clave pública en particular, sin tener que importar, firmar y confiar en esa clave ".
harrymc
¿aclararía la pregunta si dijera que confiamos en cualquier clave en el archivo .pub (con el propósito de verificar este archivo de datos específico), y que las razones por las que elegimos confiar en este archivo .pub están fuera del alcance de alguna actividad GPG?
OJW
¿Será útil la heurística de enumerar las claves en el archivo .pub y comparar su ID de clave RSA? No tengo gpg aquí para probar, pero tal vez algo así como "gpg --no-default-keyring --keyring <pub-file> --list-keys".
harrymc