Gpg
使用 gpg 驗證簽名信任?
我們想使用 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