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-пакети):

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 - корисні речі). Якщо я помиляюся, доведіть перевірку без копії ключа (підказка: ви не можете зробити це з моїми прикладами).
Бен

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

Так, повна ідентифікація, звичайно, неможлива лише з ідентифікатора ключа. Я змінив свою відповідь, щоб чітко сказати, що це лише евристика. Ваш висновок полягає в тому, що те, що запитують плакати, неможливо, але це, мабуть, тому, що плакат використав занадто сильне слово "перевірити".
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, а також значення "ідентифікатор ключа 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.