使用 GPG 驗證簽署的腳本

使用 GPG 驗證簽署的腳本

你可以向 GPG 提供一個已簽署的文件,它會輸出一條「簽名良好」的訊息,並保存明文:

[gh403@shillig-arch ~]$ gpg test.gpg 
gpg: Signature made Thu Nov  1 14:19:08 2012 CDT using RSA key ID D1FEC5F4
gpg: Good signature from "gh403 <gh403@***********>"

我可以查看它的輸出並驗證,是的,gh403 簽署了這個,是的,簽名是好的。

我希望能夠做的是編寫此行為的腳本。具體來說,我需要一個腳本來檢查簽名是否良好已簽署的金鑰具有特定的 ID。

是否有一個簡單的 GPG 呼叫可以做到這一點?或者我需要一個更複雜的腳本嗎?感謝您的任何想法!

答案1

如果新增--status-fd <fd>,gpg 會將電腦可讀的狀態文字輸出到給定的檔案描述符(1對於 stdout)。例如:

$ gpg --status-fd 1 --verify authorized_keys.txt 
gpg: Signature made 2012-08-18T19:25:12 EEST
gpg:                using RSA key D24F6CB2C1B52632
[GNUPG:] SIG_ID BOn6PNVb1ya/KuUc2F9sfG9HeRE 2012-08-18 1345307112
[GNUPG:] GOODSIG D24F6CB2C1B52632 Mantas Mikulėnas <[email protected]>
gpg: Good signature from "Mantas Mikulėnas <[email protected]>"
gpg:                 aka "Mantas Mikulėnas <[email protected]>"
[GNUPG:] VALIDSIG 2357E10CEF4F7ED27E233AD5D24F6CB2C1B52632 2012-08-18 1345307112 0 4 0 1 2 00 2357E10CEF4F7ED27E233AD5D24F6CB2C1B52632
[GNUPG:] TRUST_ULTIMATE

然後只需丟棄預設輸出(透過重定向2> /dev/null)並檢查.VALIDSIG fingerprint

我使用以下內容:

fprint="2357E10CEF4F7ED27E233AD5D24F6CB2C1B52632"

verify_signature() {
    local file=$1 out=
    if out=$(gpg --status-fd 1 --verify "$file" 2>/dev/null) &&
       echo "$out" | grep -qs "^\[GNUPG:\] VALIDSIG $fprint " &&
       echo "$out" | grep -qs "^\[GNUPG:\] TRUST_ULTIMATE\$"; then
        return 0
    else
        echo "$out" >&2
        return 1
    fi
}

if verify_signature foo.txt; then
    ...
fi

您可能需要刪除該TRUST_ULTIMATE支票,但保留VALIDSIG.

相關內容