BASHスクリプトでPGP署名を確認する正しい方法(正確な長い指紋の修正)

BASHスクリプトでPGP署名を確認する正しい方法(正確な長い指紋の修正)

私は持っています:

  1. 1つの文書
  2. ASCII armor形式のファイルに対する独立したPGP署名と
  3. 有効な署名が必要なキーを識別する40文字(長い形式)フィンガープリント

gpg指定された署名が指定されたファイルに対して有効であることを確認するために、* nixでコマンドを使用してBASHスクリプトを作成する正しい方法は何ですか(指定された指紋のみ)。

注:理想的には、ソリューションはgpgSTDOUTを-から解析しないため、提供されたソリューションのBASHスクリプトは後で出力の単語や形式がわずかに変更されても中断されません。

そして特に重要なのは、別々の署名が複数の鍵で署名されることです。したがって、たとえば、攻撃者がファイルとその分離署名を取得し、分離署名に自分の署名を追加しながらファイルを編集すると、このソリューションは失敗します。この攻撃では、スクリプトに固定された指紋のキーは間違った署名で表示されますが、攻撃者のキーは良い署名で表示されるため、これは関係ありません。この場合、解決策は失敗するしかありません。

たとえば、次の状況を考えてみましょう。

  1. https://files.pythonhosted.org/packages/cb/85/8a1588a04172e0853352ecfe214264c65a62ab35374d9ad9c569cf94c2a3/python_gnupg-0.4.6-py
  2. https://files.pythonhosted.org/packages/cb/85/8a1588a04172e0853352ecfe214264c65a62ab35374d9ad9c569cf94c2a3/python_gnupg-0.4.6.py
  3. CA749061914EAC138E66EADB9147B477339A9B86

現在、BASHスクリプトには次のものがあります。

#!/bin/bash

ONLY_TRUST_THIS_FINGERPRINT='CA749061914EAC138E66EADB9147B477339A9B86'

tmpDir="`mktemp -d`" || exit 1
pushd "${tmpDir}"

wget https://files.pythonhosted.org/packages/cb/85/8a1588a04172e0853352ecfe214264c65a62ab35374d9ad9c569cf94c2a3/python_gnupg-0.4.6-py2.py3-none-any.whl
wget https://files.pythonhosted.org/packages/cb/85/8a1588a04172e0853352ecfe214264c65a62ab35374d9ad9c569cf94c2a3/python_gnupg-0.4.6-py2.py3-none-any.whl.asc
wget https://keys.openpgp.org/vks/v1/by-fingerprint/CA749061914EAC138E66EADB9147B477339A9B86

mkdir gnupg
gpg --homedir "${tmpDir}/gnupg" --import CA749061914EAC138E66EADB9147B477339A9B86

ファイルに固定された指紋と一致する秘密鍵の有効な署名があることを安全に確認するには、上記のスクリプトでどのコマンドを実行する必要がありますか?

gpg --verify ...編集:以下は、攻撃者の良い署名と実際の開発者の間違った署名を含む単純な出力例です。

user@disp2952:/tmp/tmp.nUmxfwbwfK$ gpg --homedir gnupg/ --verify python_gnupg-0.4.6-py2.py3-none-any.whl.asc
gpg: WARNING: unsafe permissions on homedir '/tmp/tmp.nUmxfwbwfK/gnupg'
gpg: assuming signed data in 'python_gnupg-0.4.6-py2.py3-none-any.whl'
gpg: Signature made Sat 29 Aug 2020 10:04:03 PM +0545
gpg:                using RSA key 2DA3BAD0DB41087CA7E5E4C1F93C17B957F73F5A
gpg: Good signature from "Mallory <[email protected]>" [unknown]
gpg: Signature made Fri 17 Apr 2020 07:54:23 PM +0545
gpg:                using RSA key 9147B477339A9B86
gpg: BAD signature from "Vinay Sajip (CODE SIGNING KEY) <[email protected]>" [unknown]
user@disp2952:/tmp/tmp.nUmxfwbwfK$ echo $?
1
user@disp2952:/tmp/tmp.nUmxfwbwfK$ 

答え1

使用gpgv:

gpgv --homedir "${tmpDir}/gnupg" --keyring "${tmpDir}/gnupg/pubring.kbx" python_gnupg-0.4.6-py2.py3-none-any.whl.asc python_gnupg-0.4.6-py2.py3-none-any.whl

指定されたキーリングのキーを使用して、すべての署名が検証された場合にのみ成功(終了コード0)を表示します。

インポートされたキーが要求された指紋と一致することを確認するには、指紋gpgと一致するキーリングのキーリストを要求できます。

gpg --homedir "${tmpDir}/gnupg" --no-default-keyring --keyring "${tmpDir}/gnupg/pubring.kbx" --list-keys "${ONLY_TRUST_THIS_FINGERPRINT}"

キーリングにキーがあれば成功し、そうでなければ失敗します。

信頼確認を改善するには、実際にダウンロードしたキーを保存して毎回キーを再ダウンロードするのではなく、保存したキーを使用してダウンロードを認証する必要があります。これは、いくつかのディストリビューション(特にDebian)で新しいアップストリームバージョンをチェックするために使用される方法です。既知の良いキーはパッケージソース(アップストリームではなくDebianにあります)に保存され、新しいバージョンはKnow aによってインストールされている場合にのみ利用可能です。良い鍵。

関連情報