您可以向 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 将把计算机可读的状态文本输出到给定的文件描述符(1
用于 stdout)。例如:
$ 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
。