web-dev-qa-db-ja.com

GnuPGを使用してすべての受信者OpenPGPキーを照会するにはどうすればよいですか?

特定のファイルの暗号化に使用される(公開)鍵のリストをgpgに尋ねる信頼できる方法が見つかりません。 1つ もっともらしい解決策 私には機能しません-myキーをリストすることはありません:

_gpg --list-only --no-default-keyring --secret-keyring /dev/null $testfile
_

私が派生した別の解決策 このスレッド はマルチステップであり、間違いなく、その脆弱性を示すいくつかのコーナーケースがあります:

_(gpg -vv --list-only $testfile  2>&1 | grep 'gpg: public key' | awk '{print $NF}' | xargs -L1 gpg --list-keys --with-colons) | egrep '^pub' | awk -F: '{print $5}'
_

さらに掘り下げた後、時間の経過とともに間違いなく壊れやすい方法でgpgをだますことを含む別の潜在的なオプションがあります。

_gpg --dry-run --pinentry-mode cancel --output /dev/null "$testfile" 2>&1
_

誰もがそれらのどれよりも優れた解決策を持っていますか?
誰もが知っているなぜ明らかな_--list-only_オプションが「正しい」ことをしないのですか?

重要な場合は、Mac OSXではgpg (GnuPG) 2.1.10を使用し、Debian(Jessie)ではgpgv (GnuPG) 2.0.26を使用します。

1
crimson-egret

おそらく最も安全な方法は、OpenPGPパケットを一覧表示することです。 GnuPGの--list-packetsコマンド、または別のツールpgpdumpのいずれかを使用できます。サブキーのみを取得します。暗号化されたメッセージでは、主キーは参照されません。主キーを照会する場合は、ローカルキーリング(または、欠落している場合はキーサーバー)を使用して個別に解決する必要があります。

私の2つのサブキーに暗号化されたドキュメントの場合、出力は次のようになります(--list-onlyが追加されたため、GnuPGはパスフレーズを照会しません)。

$ gpg2 --list-only --list-packets < encrypted.gpg
# off=0 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid CC73B287A4388025
    data: [4090 bits]
# off=527 ctb=85 tag=1 hlen=3 plen=268
:pubkey enc packet: version 3, algo 1, keyid 5C88F5D83E2554DF
    data: [2048 bits]
# off=798 ctb=d2 tag=18 hlen=2 plen=63 new-ctb
:encrypted data packet:
    length: 63
    mdc_method: 2

これにより、すべての(既知の)受信者が一覧表示されます。非表示の受信者が使用されている場合、明らかにこれは不可能です。

# off=0 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid 0000000000000000
    data: [4093 bits]

pgpdumpの同様の出力:

Old: Public-Key Encrypted Session Key Packet(tag 1)(524 bytes)
    New version(3)
    Key ID - 0x0000000000000000
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA m^e mod n(4096 bits) - ...
        -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
Old: Public-Key Encrypted Session Key Packet(tag 1)(268 bytes)
    New version(3)
    Key ID - 0x5C88F5D83E2554DF
    Pub alg - RSA Encrypt or Sign(pub 1)
    RSA m^e mod n(2047 bits) - ...
        -> m = sym alg(1 byte) + checksum(2 bytes) + PKCS-1 block type 02
New: Symmetrically Encrypted and MDC Packet(tag 18)(63 bytes)
    Ver 1
    Encrypted data [sym alg is specified in pub-key encrypted session key]
        (plain text + MDC SHA1(20 bytes))

残念ながら、どちらも明確で安定した出力を持っていません。 GnuPGの--with-colonオプションは、パケットのダンプには使用できません。


GnuPGは他のキーのみを出力し、自分のキーは出力しません(--list-onlyがないと、代わりにキーを使用しようとします)。これが意図されたものであり、望ましい動作が議論の対象となる可能性があるかどうかは、単一の-v/--verboseを渡すだけで、独自のキーを一覧表示するのに十分なようです。

秘密鍵を「非表示」にしようとする最初の試みの問題は、--no-default-keyringステートメントの問題です。 man gpg2から:

--no-default-keyring

キーリングのリストにデフォルトのキーリングを追加しないでください。 GnuPGはキーリングなしでは動作しないため、このオプションを使用し、--keyringまたは--secret-keyringを介して代替キーリングを提供しない場合でも、GnuPGはデフォルトのパブリックキーリングまたはシークレットキーリングを使用します。

GnuPGalwaysは公開鍵リングを読み取ります。読み取り不能/空のシークレットキーリングを渡すだけでは不十分であり、代わりにパブリックキーリングを渡すだけで問題ありません。

gpg2 --no-default-keyring --keyring /dev/null --list-only
2
Jens Erat