![如何根据特定公钥验证 gpg 签名的文件?](https://linux22.com/image/1612172/%E5%A6%82%E4%BD%95%E6%A0%B9%E6%8D%AE%E7%89%B9%E5%AE%9A%E5%85%AC%E9%92%A5%E9%AA%8C%E8%AF%81%20gpg%20%E7%AD%BE%E5%90%8D%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%9F.png)
背景信息:我有一个目录,里面装满了文件和分离的.asc
签名。我还有一个默认的密钥环,里面包含许多人的公钥(其中一些人我信任,另一些人我不信任)。
如果我验证目录中的所有文件,gpg 会输出类似以下内容每个文件:
Signature made XXX using RSA key ID XXXX
Good signature from SIGNER
我的问题源于需要检查每个文件的这些行以确保签名者是我期望的那个人。我想要做的是限制 gpg 可以使用哪些公钥来验证文件。
问题:是否可以将 gpg 配置为仅使用一个公钥来验证文件?
一个解决方案是每次我需要验证文件时使用一个新的临时密钥环(只有一个密钥)。但如果我需要多次验证,这个解决方案很快就会变得乏味。
答案1
使用通过“status-fd”提供的信息:
$ cat 消息.txt | gpg --verify --status-fd=1 [GNUPG:] 新闻人物 gpg: 签名于 2019-12-18T15:06:03 EET 完成 gpg:使用 RSA 密钥 2357E10CEF... [GNUPG:] KEY_CONSIDERED 2357Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2632 0 [GNUPG:] SIG_ID XZf34rp0ZuF0AqxbAkJhqrEV/Og 2019-12-18 1576674363 [GNUPG:] KEY_CONSIDERED 2357Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2632 0 [GNUPG:] GOODSIG xxxxxxxxxxxx2632 Fred Foobar <[电子邮件保护]> gpg: 来自“Fred Foobar <[电子邮件保护]>“[终极] [GNUPG:] VALIDSIG 2357Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx26322019-12-18 1576674363 0 4 0 1 10 00 2357Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2632 [GNUPG:] KEY_CONSIDERED 2357Exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx2632 0 [GNUPG:] TRUST_ULTIMATE 0 pgp [GNUPG:] 验证合规性模式 23
因此,如果您想确保它是由特定密钥签名的,您可以使用:
verify_with() {
local fingerprint=$1
local file=$2
local status
fingerprint=$(echo "$fingerprint" | tr a-z A-Z | tr -dc A-Z)
status=$(gpg --status-fd=4 --trust-model=always verify "$file" 4>&1 >/dev/null 2>&1)
if grep -qs "^\\[GNUPG:\\] VALIDSIG $fingerprint " <<< "$status"; then
return 0
else
return 1
fi
}