web-dev-qa-db-ja.com

gpg署名が公開鍵ファイルと一致することを確認するにはどうすればよいですか?

私はこのようにgpg verifyを使用する方法を知っています:

$ 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

しかし、私が本当にやりたいのは、特定の公開鍵ファイルに対してファイルを検証することです。

動機は、Webサイトから大きなファイルをダウンロードし、それらが使用される前に改ざんされていないことを確認する必要があるプログラムの一部としてです。 Webサイトには、ファイルと署名が含まれます。プログラムは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ライブラリの仕組みです。

26
Rich

キーリングのような特定の公開鍵ファイルを使用する唯一の方法は、ファイルがGPG(OpenPGP)ファイル形式であり、ASCII装甲版ではない場合(例:pubkey.ascではなくpubkey.gpgではありません) )。

これにより、ファイルが検証されます。

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

18
Ben

次のスクリプトを思い付きました。

#!/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>
10
zbyszek