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)выводит ли команда в качестве первой строки отпечаток ключа, который сделал подпись.
harrymc

Некоторый контекст здесь: у нас есть система, которая подписывает вещи. Мы даем его открытый ключ людям, которые могут получать сообщения из этой системы, чтобы они могли проверить, что сообщения не были подделаны. Однако мы не хотим говорить получателям «доверять чему-либо, подписанному этим ключом», потому что тогда его можно использовать для аутентификации сообщений из других систем (например, писем от их друзей).
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]$ 

К сожалению, предложение Гарри не работает, оно извлекает немного больше информации, но недостаточно, чтобы быть полезным.

Как видите, большая часть полученной информации - это идентификатор ключа подключа, использованного для создания подписи, и время создания подписи. Это соответствует данным, доступным для pgpdump (или --list-packages):

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-подраздел и идентификатор ключа этого подраздела, но идентифицировать главный ключ нечем. Это только информация раскрывается, когда у вас есть открытый ключ и проверка подписи.

Затем я импортировал свой открытый ключ в эту систему и повторил попытку:

[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, но каждый, кто получит этот ключ, увидит, кто он на самом деле. В противном случае на выходе получается прямое копирование и вставка.

РЕДАКТИРОВАТЬ: Вы можете вызвать файл открытого ключа напрямую, как брелок, если он у вас в не-ASCII-формате (т. Е. Файл .gpg вместо файла .asc). Тем не менее, вам все еще нужен открытый ключ. Для этого команда выглядит так:

[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 ~]$ 

Глядя на ваш вывод, я пришел к совершенно противоположному выводу. Я использовал ваш вывод в своем ответе, но дал вам кредит.
Harrymc

Часть, на которую вы ссылаетесь, является длинной формой идентификатора ключа подраздела (технически полный идентификатор ключа - это отпечаток пальца) является единственной идентифицируемой частью. Однако, не имея открытого ключа, вы не сможете идентифицировать главный ключ или проверить подпись. Детали этого приведены в разделе 5.2 RFC 4880 (немного в разделе 2.2, но в разделе 5.2 есть полезные сведения). Если я ошибаюсь, докажите проверку без копии ключа (подсказка: вы не можете сделать это с моими примерами).
Бен

Кроме того, по вашему заключению относительно --verify, он работает только тогда, когда ключ доступен, в противном случае вернитесь к первому примеру в моем ответе, где проверяются идентификатор ключа и время подписи, но ключ не найден.
Бен

Да, полная идентификация, конечно, невозможна только по ключевому идентификатору. Я изменил свой ответ, чтобы четко заявить, что это только эвристика. Вы пришли к выводу, что то, что просит автор плаката, невозможно, но, вероятно, потому, что на плакате использовалось слово «проверить», которое слишком сильно.
Harrymc

1
Это правда, ОП, вероятно, не использует термины должным образом, и я, возможно, выдумал их в нескольких местах (я много чихал прошлой ночью). Если его вопрос был только о проверке подписи без импорта ключа, то пример в моем редакторе показывает, как это можно сделать, но только если этот ключ в формате 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, а также значение «ID ключа RSA», которое частично содержится в них обоих, а именно:

[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» идентична в обоих выходных данных и также находится в качестве последней части отпечатка пальца, поэтому вполне возможно, что этого достаточно для идентификации подписи. В этом случае 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 недостаточно для полной проверки этого метода, поэтому вы должны попробовать его на других файлах примеров. Если это работает, вы можете отсортировать файлы по их сигнатурам, но вам нужно будет импортировать ключ, чтобы найти личность получателя.

Чтобы четко заявить еще раз: этот метод не может полностью идентифицировать подпись. Это только способ эвристической сортировки подписанных документов.


Подпись содержит достаточно данных для идентификации ключа, использованного для его создания, и в сочетании с серверами ключей ее можно использовать для определения местоположения главного ключа (при условии, что подписной подраздел использовался, как в моих примерах). Без копии открытого ключа в формате OpenPGP (либо в связке ключей, либо в моем последнем примере) проверка подписи невозможна, потому что для идентификации этого не хватает данных отпечатка пальца / ключа.
Бен

@Ben: Я повторяю, что это всего лишь эвристика, и это лучшее, что можно сделать в ответе на вопрос автора «проверить, подписан ли файл конкретным файлом открытого ключа, без необходимости импортировать, подписывать и доверять этому ключу». ».
Harrymc

сделает вопрос яснее, если я скажу, что мы доверяем любым ключам в файле .pub (для проверки этого конкретного файла данных), и что причины, по которым мы решили доверять этому файлу .pub, выходят за рамки какая-либо деятельность GPG?
OJW

Будет ли полезна эвристика перечисления ключей в файле .pub и сравнения их идентификатора ключа RSA? У меня нет gpg здесь, чтобы попробовать, но может быть что-то вроде "gpg --no-default-keyring --keyring <pub-file> --list-keys".
harrymc
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.