GPG で署名を検証するスクリプト

GPG で署名を検証するスクリプト

署名されたファイルを GPG に渡すと、「署名は有効です」というメッセージが表示され、プレーンテキストが保存されます。

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

そして、その出力を見て、gh403 がこれに署名したこと、そして署名が適切であることを確認できます。

私がやりたいのは、この動作をスクリプト化することです。具体的には、署名が正しいかどうかを確認するスクリプトが必要です。そして署名に使用されたキーには特定の ID があることを確認します。

これを行うための単純な GPG 呼び出しはありますか? それとも、もっと複雑なスクリプトが必要ですか? ご意見をいただければ幸いです。

答え1

を追加すると--status-fd <fd>、gpg は指定されたファイル記述子 ( 1stdout の場合) にコンピュータが読み取り可能なステータス テキストを出力します。例:

$ 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

次に、デフォルトの出力を破棄し ( をリダイレクトして2> /dev/null)、 をチェックします。VALIDSIG fingerprint

私は以下を使用します:

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

おそらくTRUST_ULTIMATEチェックを外す必要がありますが、 は残しておいてくださいVALIDSIG

関連情報