[英]How do I verify a gpg signature matches a public key file?
我知道如何使用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 <rjones@redhat.com>"
gpg: aka "Richard W.M. Jones <rich@annexia.org>"
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 <rjones@redhat.com>
[GNUPG:] VALIDSIG F7774FB1AD074A7E8C8767EA91738F73E1B768A0 2013-07-23 1374582002 0 4 0 1 2 00 F7774FB1AD074A7E8C8767EA91738F73E1B768A0
[GNUPG:] TRUST_UNDEFINED
這就是perl的GnuPG庫的工作原理。
使用特定公鑰文件(如密鑰環)的唯一方法是文件是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網站上針對類似問題詳細介紹了這個問題:
我想出了以下腳本:
#!/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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.