Вы можете передать 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 подписал это и что да, подпись верна.
Что я хотел бы сделать, так это написать скрипт этого поведения. В частности, мне нужен скрипт, который будет проверять, что подпись хорошаичто ключ, которым он был подписан, имеет определенный идентификатор.
Есть ли простой вызов 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
.