web-dev-qa-db-ja.com

GPG-信頼チェーンを作成せずに署名を検証しますか?

Gpg(またはgpg4win)に、ファイルが特定の公開鍵ファイルによって署名されているかどうかを確認するように依頼することはできますか?その鍵をインポートして署名し、信頼する必要はありませんか?

つまり、次のようなもの

gpg --using-key pubkey.txt --verify message.txt

独自の秘密鍵を作成してから行う必要があるのとは対照的に

gpg --import pubkey.txt 
gpg --lsign-key [name within pubkey.txt]
# ... something to do with choosing trust levels
gpg --verify message.txt
19
OJW

対応する秘密鍵で作成された署名を検証するには公開鍵が必要ですが、鍵に署名したり、ローカルで署名したりする必要はありません。この場合、キーが信頼できないというGPGからの警告が表示されます。

これは、自分の鍵で署名されたファイルを使用して作成したテストですが、鍵がインポートされていないシステムでのテストです。

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found
[ben@seditious tmp]$ 

残念ながら、ハリーの提案は機能しません。それはもう少し情報を抽出しますが、使用するには十分ではありません。

ご覧のとおり、取得されるほとんどの情報は、署名の作成に使用されたサブキーのキーIDと署名が作成された時間です。これは、pgpdump(または--list-packets)で利用可能なデータと一致します。

bash-3.2$ pgpdump thing.txt.gpg 
Old: Compressed Data Packet(tag 8)
    Comp alg - ZLIB <RFC1950>(comp 2)
Old: One-Pass Signature Packet(tag 4)(13 bytes)
    New version(3)
    Sig type - Signature of a binary document(0x00).
    Hash alg - SHA512(hash 10)
    Pub alg - RSA Encrypt or Sign(pub 1)
    Key ID - 0x7FF2D37135C7553C
    Next packet - other than one pass signature
Old: Literal Data Packet(tag 11)(24 bytes)
    Format - binary
    Filename - thing.txt
    File modified time - Thu Sep 26 06:51:39 EST 2013
    Literal - ...
Old: Signature Packet(tag 2)(412 bytes)
    Ver 4 - new
    Sig type - Signature of a binary document(0x00).
    Pub alg - RSA Encrypt or Sign(pub 1)
    Hash alg - SHA512(hash 10)
    Hashed Sub: signature creation time(sub 2)(4 bytes)
        Time - Thu Sep 26 06:51:39 EST 2013
    Sub: issuer key ID(sub 16)(8 bytes)
        Key ID - 0x7FF2D37135C7553C
    Hash left 2 bytes - f0 97 
    RSA m^d mod n(3066 bits) - ...
        -> PKCS-1
bash-3.2$ 

ご覧のとおり、ハッシュアルゴリズム、キーのタイプの詳細(署名キーは3072ビットのRSAサブキーとサブキーのキーIDですが、マスターキーを識別するものは何もありません。その情報は公開鍵を入手し、署名を検証すると公開されます。

次に、そのシステムに公開鍵をインポートして、再試行しました。

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
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: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

これで、キーを識別して主キーと照合することができます。ただし、これらの警告の性質を次のように減らすことができます。

[ben@seditious tmp]$ gpg -v --verify --trust-model always thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
gpg: binary signature, digest algorithm SHA512
[ben@seditious tmp]$ 

それは信頼できないキーであるという警告がまだありますが、それほど大きくはありません。冗長性を削除すると、次のようになります。

[ben@seditious tmp]$ gpg --verify --trust-model always thing.txt.gpg 
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg: WARNING: Using untrusted key!
[ben@seditious tmp]$ 

公開鍵は、署名者が生成したデータを秘密鍵と照合するために使用されるため、検証段階で必要です。これは、簡単に言えば、公開鍵に暗号化されたデータを暗号化解除するために秘密鍵が必要な暗号化の補足と考えることができます。

注:この例ではUIDを少し調整しましたが、そのキーを取得したすべての人が実際のUIDを確認できます。それ以外の場合、出力は単純なコピーと貼り付けです。

編集:非ASCII装甲フォーマット(.ascファイルの代わりに.gpgファイル)がある場合は、公開鍵ファイルをキーリングのように直接呼び出すことができます。それでも、公開鍵が必要です。これを行うには、コマンドは次のようになります。

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
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: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512
[ben@seditious ~]$ 
14
Ben

公開鍵ファイルではなく鍵リングを出荷することに問題がない場合は、gpgvではなくgpgを使用することをお勧めします。

gpgv --keyring key.ring somefile.txt
2
womble

質問の「確認」という単語が「完全に確認」を意味する場合は、もちろん公開鍵をインポートして、署名されたドキュメントを完全に確認する必要があります。ただし、これが「識別する」ことを意味する場合は、ドキュメントのグループがすべて同じ署名で署名されているかどうかを判断できるヒューリスティックを以下で説明します。

@ Benによって実行されたテスト によると私のコメントを確認するために、次のコマンドを使用して署名鍵を発見的に示すことができる可能性があります。

gpg --status-fd 1 --verify thefile.gpg

ベンのテストは以下の結果を与えました。次のように、ERRSIGとNO_PUBKEYの値、および両方に部分的に含まれている「RSAキーID」の値も注目に値します。

[ben@seditious tmp]$ gpg -v --status-fd 1 --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
[GNUPG:] ERRSIG 7FF2D37135C7553C 1 10 00 1380142299 9
[GNUPG:] NO_PUBKEY 7FF2D37135C7553C
gpg: Can't check signature: public key not found

文字列7FF2D37135C7553Cの上に注意してください。この同じ文字列は、キーがインポートされると報告されるキーフィンガープリント内にあります。

[ben@seditious ~]$ gpg -v --no-default-keyring --keyring /tmp/mykey.gpg --verify /tmp/thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: using subkey 35C7553C instead of primary key 73590E5D
gpg: using PGP trust model
gpg: Good signature from "Ben M <ben@REDACTED>"
gpg:                 aka "Ben M (backup email address) <benm@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
gpg:                 aka "Ben M <ben.m@REDACTED>"
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: DB47 24E6 FA42 86C9 2B4E  55C4 321E 4E23 7359 0E5D
     Subkey fingerprint: B7F0 FE75 9387 430D D0C5  8BDB 7FF2 D371 35C7 553C
gpg: binary signature, digest algorithm SHA512

この文字列は指紋(上記のサブキー)の下部として検出されるため、キーの識別に使用される可能性があります。サブキーに加えて、「主キーのフィンガープリント」もおそらく確認する必要があります。

「RSAキーID」文字列は両方の出力で同一であり、フィンガープリントの最後の部分としても検出されるため、署名を識別するだけで十分な場合もあります。その場合、gpg --verifyの出力のみを使用することで、署名をより簡単な方法で識別できます。

[ben@seditious tmp]$ gpg -v --verify thing.txt.gpg 
gpg: original file name='thing.txt'
gpg: Signature made Thu 26 Sep 2013 06:51:39 AM EST using RSA key ID 35C7553C
gpg: Can't check signature: public key not found

GPGに関する私の知識は、この方法を完全に検証するのに十分ではないので、より多くのサンプルファイルで試してみてください。動作する場合は、署名に従ってファイルを並べ替えることができますが、署名者のIDを見つけるためにキーをインポートする必要があります。

もう一度明確に述べると、この方法では署名を完全に特定することはできません。これは、署名されたドキュメントをヒューリスティックにソートする唯一の方法です。

0
harrymc