gnupg - para - ¿Cómo verifico que una firma gpg coincida con un archivo de clave pública?
gpg para linux (2)
La única forma de usar un archivo de clave pública específico como un anillo de claves es si el archivo está en el formato de archivo GPG (OpenPGP) y no es una versión blindada ASCII (por ejemplo, pubkey.gpg no pubkey.asc).
Así que esto verificará el archivo:
gpg --no-default-keyring --keyring /path/to/pubkey.gpg --verify /path/to/file.txt.gpg
Y esto no va a
gpg --no-default-keyring --keyring /path/to/pubkey.asc --verify /path/to/file.txt.gpg
EDITAR: He profundizado un poco más en esto para una pregunta similar en el sitio del Superusuario:
Sé cómo usar gpg verificar de esta manera:
$ gpg --verify somefile.sig
gpg: Signature made Tue 23 Jul 2013 13:20:02 BST using RSA key ID E1B768A0
gpg: Good signature from "Richard W.M. Jones <[email protected]>"
gpg: aka "Richard W.M. Jones <[email protected]>"
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: F777 4FB1 AD07 4A7E 8C87 67EA 9173 8F73 E1B7 68A0
Pero lo que realmente quiero hacer es verificar el archivo contra un archivo de clave pública específico.
La motivación es como parte de un programa que descarga archivos grandes de un sitio web y necesita verificar que no hayan sido manipulados antes de usarlos. El sitio web contendrá los archivos y las firmas. El programa se enviará con la clave pública GPG. Cuando suba los archivos al sitio web, los firmaré con la clave privada correspondiente (no distribuida obviamente). Parece que el programa debería poder hacer algo como:
gpg --no-default-keyring --verify file.sig /
--is-signed-with /usr/share/program/goodkey.asc
Pero gpg
no tiene una opción como esta. Parece que la única forma de hacerlo sería analizar la salida impresa del comando gpg
que parece muy insegura (contiene texto controlado por el atacante).
Edit: No sé cuál es la etiqueta por aquí para responder las propias preguntas, pero la respuesta que encontré fue usar la bandera --status-fd. Este indicador genera una salida muy analizable que puedo comprobar para la huella digital deseada:
gpg --status-fd <N> --verify file.sig
produce en fd N:
[GNUPG:] SIG_ID rpG8ATxU8yZr9SHL+VC/WQbV9ac 2013-07-23 1374582002
[GNUPG:] GOODSIG 91738F73E1B768A0 Richard W.M. Jones <[email protected]>
[GNUPG:] VALIDSIG F7774FB1AD074A7E8C8767EA91738F73E1B768A0 2013-07-23 1374582002 0 4 0 1 2 00 F7774FB1AD074A7E8C8767EA91738F73E1B768A0
[GNUPG:] TRUST_UNDEFINED
Así es como, por ejemplo, funciona la biblioteca GnuPG de Perl.
Se me ocurrió el siguiente script:
#!/bin/bash
set -e
keyfile=$(mktemp --suffix=.gpg)
function cleanup {
rm "$keyfile"
}
trap cleanup EXIT
gpg2 --yes -o "$keyfile" --dearmor "$1"
gpg2 --status-fd 1 --no-default-keyring --keyring "$keyfile" --trust-model always --verify "$2" 2>/dev/null
usar como:
$ check-sig.sh <ascii-armored-keyfile> <signature-document>