Script para verificar una firma con GPG

Script para verificar una firma con GPG

Puede enviar a GPG un archivo que haya sido firmado y mostrará un mensaje de "la firma es buena" y guardará el texto sin formato:

[gh403@shillig-arch ~]$ gpg test.gpg 
gpg: Signature made Thu Nov  1 14:19:08 2012 CDT using RSA key ID D1FEC5F4
gpg: Good signature from "gh403 <gh403@***********>"

y puedo mirar su salida y verificar que sí, gh403 firmó esto y que sí, la firma es buena.

Lo que me gustaría poder hacer es programar este comportamiento. Específicamente, necesito un script que verifique que la firma sea buena.yque la clave con la que se ha firmado tiene un ID determinado.

¿Existe una llamada GPG sencilla para hacer esto? ¿O necesitaría un guión más elaborado? ¡Gracias por cualquier idea!

Respuesta1

Si agrega --status-fd <fd>, gpg generará un texto de estado legible por computadora al descriptor de archivo dado ( 1para stdout). Por ejemplo:

$ gpg --status-fd 1 --verify authorized_keys.txt 
gpg: Signature made 2012-08-18T19:25:12 EEST
gpg:                using RSA key D24F6CB2C1B52632
[GNUPG:] SIG_ID BOn6PNVb1ya/KuUc2F9sfG9HeRE 2012-08-18 1345307112
[GNUPG:] GOODSIG D24F6CB2C1B52632 Mantas Mikulėnas <[email protected]>
gpg: Good signature from "Mantas Mikulėnas <[email protected]>"
gpg:                 aka "Mantas Mikulėnas <[email protected]>"
[GNUPG:] VALIDSIG 2357E10CEF4F7ED27E233AD5D24F6CB2C1B52632 2012-08-18 1345307112 0 4 0 1 2 00 2357E10CEF4F7ED27E233AD5D24F6CB2C1B52632
[GNUPG:] TRUST_ULTIMATE

Luego simplemente descarte la salida predeterminada (redireccionando 2> /dev/null) y verifique .VALIDSIG fingerprint

Yo uso lo siguiente:

fprint="2357E10CEF4F7ED27E233AD5D24F6CB2C1B52632"

verify_signature() {
    local file=$1 out=
    if out=$(gpg --status-fd 1 --verify "$file" 2>/dev/null) &&
       echo "$out" | grep -qs "^\[GNUPG:\] VALIDSIG $fprint " &&
       echo "$out" | grep -qs "^\[GNUPG:\] TRUST_ULTIMATE\$"; then
        return 0
    else
        echo "$out" >&2
        return 1
    fi
}

if verify_signature foo.txt; then
    ...
fi

Probablemente necesitarás quitar el TRUST_ULTIMATEcheque, pero mantenlo VALIDSIG.

información relacionada