Как проверить, соответствует ли подпись gpg файлу открытого ключа?
Я знаю, как использовать gpg, например:
$ gpg --verify somefile.sig
gpg: Signature made Tue 23 Jul 2013 13:20:02 BST using RSA key ID E1B768A0
gpg: Good signature from "Richard W.M. Jones <[email protected]>"
gpg: aka "Richard W.M. Jones <[email protected]>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: F777 4FB1 AD07 4A7E 8C87 67EA 9173 8F73 E1B7 68A0
Но то, что я действительно хочу сделать, - это проверить файл на конкретный файл открытого ключа.
Мотивация - это часть программы, которая загружает большие файлы с веб-сайта и должна убедиться, что они не были подделаны до того, как они их используют. На веб-сайте будут содержаться файлы и подписи. Программа будет поставляться с открытым ключом GPG. Когда я загружаю файлы на сайт, я буду подписывать их с соответствующим закрытым ключом (явно не распределенным). Похоже, что программа должна иметь возможность сделать что-то вроде:
gpg --no-default-keyring --verify file.sig \
--is-signed-with /usr/share/program/goodkey.asc
Но gpg
не имеет такого варианта. Похоже, что единственный способ сделать это - разобрать распечатанный вывод команды gpg
, который кажется очень опасным (он содержит текст, контролируемый злоумышленником).
Изменить: я не знаю, что здесь такое этикет для ответа на собственные вопросы, но ответ, который я нашел, это использовать флаг -status-fd. Этот флаг генерирует хорошо разборный вывод, который я могу проверить на желаемый отпечаток:
gpg --status-fd <N> --verify file.sig
производит на fd N:
[GNUPG:] SIG_ID rpG8ATxU8yZr9SHL+VC/WQbV9ac 2013-07-23 1374582002
[GNUPG:] GOODSIG 91738F73E1B768A0 Richard W.M. Jones <[email protected]>
[GNUPG:] VALIDSIG F7774FB1AD074A7E8C8767EA91738F73E1B768A0 2013-07-23 1374582002 0 4 0 1 2 00 F7774FB1AD074A7E8C8767EA91738F73E1B768A0
[GNUPG:] TRUST_UNDEFINED
Вот как работает, например, библиотека Perl GnuPG.
Ответы
Ответ 1
Единственный способ использования определенного файла открытого ключа, такого как keyring, - это если файл находится в формате файла GPG (OpenPGP), а не в виде бронированной версии ASCII (например, pubkey.gpg не pubkey.asc).
Итак, это проверит файл:
gpg --no-default-keyring --keyring /path/to/pubkey.gpg --verify /path/to/file.txt.gpg
И это не будет:
gpg --no-default-keyring --keyring /path/to/pubkey.asc --verify /path/to/file.txt.gpg
ИЗМЕНИТЬ: я подробно рассказал об этом для аналогичного вопроса на сайте SuperUser:
https://superuser.com/questions/639853/gpg-verifying-signatures-without-creating-trust-chain/650359#650359
Ответ 2
Я придумал следующий script:
#!/bin/bash
set -e
keyfile=$(mktemp --suffix=.gpg)
function cleanup {
rm "$keyfile"
}
trap cleanup EXIT
gpg2 --yes -o "$keyfile" --dearmor "$1"
gpg2 --status-fd 1 --no-default-keyring --keyring "$keyfile" --trust-model always --verify "$2" 2>/dev/null
использовать как:
$ check-sig.sh <ascii-armored-keyfile> <signature-document>