Gpg

使用 gpg 驗證簽名信任?

  • June 24, 2013

我們想使用 gpg 簽名來驗證我們系統配置管理工具的某些方面。此外,我們希望使用“信任”模型,其中單個系統​​管理員密鑰使用主簽名密鑰進行簽名,然後我們的系統信任該主密鑰(並使用“信任網路”來驗證我們的系統管理員的簽名)。

這為我們提供了很大的靈活性,例如當有人離開時可以輕鬆撤銷對密鑰的信任,但我們遇到了問題。雖然該gpg命令會告訴您密鑰是否不受信任,但它似乎不會返回表明這一事實的退出程式碼。例如:

# gpg -v < foo.asc
Version: GnuPG v1.4.11 (GNU/Linux)
gpg: armor header: 
gpg: original file name=''
this is a test
gpg: Signature made Fri 22 Jul 2011 11:34:02 AM EDT using RSA key ID ABCD00B0
gpg: using PGP trust model
gpg: Good signature from "Testing Key <someone@example.com>"
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: ABCD 1234 0527 9D0C 3C4A  CAFE BABE DEAD BEEF 00B0
gpg: binary signature, digest algorithm SHA1

我們關心的部分是這樣的:

gpg: WARNING: This key is not certified with a trusted signature!
gpg:          There is no indication that the signature belongs to the owner.

儘管信任失敗,但 gpg 在這種情況下返回的退出程式碼為 0:

# echo $?
0

如果使用不受信任的簽名進行簽名,我們如何讓 gpg 失敗?

我已經看到一些建議,該gpgv命令將返回正確的退出程式碼,但不幸gpgv的是不知道如何從密鑰伺服器獲取密鑰。我想我們可以從 解析狀態輸出(使用–status-fd)gpg,但是有更好的方法嗎?

這就是最終的結果:

#!/bin/sh

tmpfile=$(mktemp gpgverifyXXXXXX)
trap "rm -f $tmpfile" EXIT

gpg --status-fd 3 --verify "$@" 3> $tmpfile || exit 1
egrep -q '^\[GNUPG:] TRUST_(ULTIMATE|FULLY)' $tmpfile

這將查找在 上gpg輸出的信任資訊--status-fd。在存在不受信任的簽名(或無效/無簽名)的情況下,腳本退出並出現錯誤:

$ sh checksig sample.sh.bad 
gpg: Signature made Mon 24 Jun 2013 11:42:58 AM EDT using RSA key ID DCD5C569
gpg: Good signature from "Test User <testuser@example.com>"
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: 6FCD 3CF0 8BBC AD50 662E  5070 E33E D53C DCD5 C569
$ echo $?
1

如果存在有效的、受信任的簽名,則腳本會退出且沒有錯誤:

$ sh checksig sample.sh.good
gpg: Signature made Mon 24 Jun 2013 11:38:49 AM EDT using RSA key ID 5C2864A8
gpg: Good signature from "Lars Kellogg-Stedman <...>"
$ echo $?
0

引用自:https://serverfault.com/questions/293101