Script para verificar uma assinatura com GPG

4

Você pode enviar ao GPG um arquivo que tenha sido assinado e ele emitirá uma mensagem de "assinatura é boa" e salvará o texto sem formatação:

[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@***********>"

e eu posso olhar para sua saída e verificar se sim, gh403 assinou isso e que sim, a assinatura é boa.

O que eu gostaria de poder fazer é rotular esse comportamento. Especificamente, eu preciso de um script que verifique se a assinatura é boa e que a chave com a qual ele foi assinado tem um certo ID.

Existe uma chamada GPG simples para fazer isso? Ou eu precisaria de um roteiro mais elaborado? Obrigado por qualquer pensamento!

    
por thirtythreeforty 01.11.2012 / 20:34

1 resposta

5

Se você adicionar --status-fd <fd> , o gpg produzirá um texto de status legível pelo computador para o descritor de arquivo fornecido ( 1 para stdout). Por exemplo:

$ 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

Em seguida, descarte a saída padrão (redirecionando 2> /dev/null ) e verifique se há VALIDSIG fingerprint .

Eu uso o seguinte:

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

Você provavelmente precisará remover a TRUST_ULTIMATE check, mas manter VALIDSIG .

    
por 01.11.2012 / 21:08