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


19

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

1
コマンドのgpg --status-fd 1 --verify (thefile)出力で、署名を作成したキーのフィンガープリントを最初の文字列として提供するかどうかを確認してください。
ハリーマック

ここでのコンテキスト:物事に署名するシステムがあります。このシステムからメッセージを受信する可能性のある人々に公開鍵を提供し、メッセージが改ざんされていないことを確認できるようにします。ただし、他のシステムからのメッセージ(友人からのメールなど)の認証に使用される可能性があるため、受信者に「このキーで署名されたものを信頼する」ようにしたくありません。
OJW

したがって、「gpgはこのメッセージがこのキーによって送信されたと言っているのですか?」をチェックするコマンド/バッチファイルを誰かに渡したいと思います。他の人とのコミュニケーションにgpgを日常的に使用することを妨げることなく。キーは、GPGが常にそれを信頼するように指示されているためではなく、コマンドラインがそれを要求するためにのみ信頼されるべきです。
OJW

回答:


14

対応する秘密鍵で作成された署名を検証するには公開鍵が必要ですが、鍵に署名したり、ローカルで署名する必要はありません。この場合、キーが信頼できないという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]$ 

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

ご覧のとおり、取得される情報のほとんどは、署名の作成に使用されたサブキーのキー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 ~]$ 

あなたのアウトプットを見ると、正反対の結論に達しました。私は回答であなたの出力を使用しましたが、あなたにそれを称賛しました。
ハリーマック

参照する部分は、サブキーのキーIDの長い形式(技術的には完全なキーID 指紋です)のみが識別可能な部分です。ただし、公開キーを所有していないと、マスターキーを識別したり、署名を検証したりできません。これの詳細は、RFC 4880のセクション5.2にあります(セクション2.2には少しありますが、5.2には有用なものがあります)。私が間違っている場合は、キーのコピーなしで検証を証明します(ヒント:私の例ではできません)。
ベン

また、-verifyに関する結論では、キーが利用可能な場合にのみ機能します。そうでない場合、私の答えの最初の例に戻り、キーIDと署名の時刻は検証されますが、キーが見つかりません
ベン

はい、もちろんキーIDだけでは完全な識別はできません。これは単なる発見的方法であると明確に述べるために、回答を修正しました。あなたの結論は、ポスターが求めていることは不可能であるということですが、それはおそらくポスターがあまりにも強い「検証」という言葉を使用したためでしょう。
harrymc

1
それは本当です、OPはおそらく用語を適切に使用していないので、私はいくつかの場所でもそれらをかじっていたかもしれません(私は昨夜たくさんくしゃみをしていました)。彼の質問がキーをインポートせずにsigを検証することだけである場合、私の編集の例は、そのキーがOpenPGP(pubkey.gpg)形式である場合にのみ、それを行う方法を示しています。エクスポートされたキーがASCII装甲(pubkey.asc)形式の場合は機能しません。
ベン

2

公開鍵ファイルではなく、鍵リングを出荷しても問題ない場合は、次のように使用するのgpgvではなく、おそらく使用することをお勧めしますgpg

gpgv --keyring key.ring somefile.txt

0

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

コメントを検証するために@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を見つけるためにキーをインポートする必要があります。

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


署名には、作成に使用したキーを識別するのに十分なデータが含まれており、キーサーバーと組み合わせて、マスターキーを見つけるために使用できます(私の例のように署名サブキーが使用された場合)。OpenPGP形式の公開キーのコピーがない場合(キーリングまたは最後の例のように)、指紋/キーIDはそれを計算するのに十分なデータではないため、署名の検証は不可能です。
ベン

@Ben:これはヒューリスティックであり、ポスターの質問「特定の公開キーファイルによってファイルが署名されているかどうかを確認し、そのキーをインポートして署名および信頼する必要はありません」「。
harrymc

(この特定のデータファイルをチェックする目的で).pubファイルのキーを信頼し、この.pubファイルを信頼することを選択した理由が範囲外であると言った場合、質問はより明確になりますかGPGアクティビティはありますか?
OJW

.pubファイル内のキーをリストし、RSAキーIDを比較するヒューリスティックは役に立ちますか?ここに試してみるためのgpgはありませんが、「gpg --no-default-keyring --keyring <pub-file> --list-keys」のようなものかもしれません。
harrymc
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.