Подтвердить что ты не робот

Как проверить, соответствует ли подпись 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.

4b9b3361

Ответ 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>