Работаем с цифровыми подписями GPG

Существует огромное количество статей и даже книг по работе с GnuPG, однако одну из самых полезных важных функций — работу с цифровыми подписями — в них обычно опускают. Устраним этот недостаток.

Введение

В данном HOWTO мы подробно рассмотрим как работать с GnuPG второй версии из терминала, а также графический интерфейс на примере утилиты Kleopatra, входящей в состав графической среды KDE, а также набор GnuPG for Windows.

Создание новой ключевой пары

Начнём мы конечно же с создания ключевой пары: связки из открытого и закрытого ключа, которые будут использоваться нами для для подписи и их проверки. Открытую часть вы должны распространять любыми возможными способами, а закрытую хранить в надёжном месте.

Консоль

Простой режим:

gpg2 --gen-key

Утилита gpg2 потребует указать полное имя, адрес электронной почты и затем пароль для защиты секретного ключа. Все остальные параметры будут заданы по умолчанию, включая его длину (по умолчанию 2048 бит).

Режим эксперта:

gpg2 --full-generate-key

В данном режиме уже можно настроить любые параметры: тип ключа (рекомендуется RSA/RSA), его длину (рекомендуется увеличить до 4096 бит), срок действия (по окончании срока действия ключ станет непригодным для шифрования и создания новых подписей, но может использоваться для расшифровки и проверки уже существующих цифровых подписей), полное имя, адрес электронной почты, описание и пароль.

Настоятельно рекомендуется указать как можно более сложный пароль для шифрования закрытой части ключевой пары, дабы в случае попадания в руки злоумышленников, им было сложнее ею воспользоваться.

Также рекомендуется во время создания ключевой пары ответить утвердительно на вопрос о желании создать сертификат отзыва ключа на случай его компрометации, распечатать его и сохранить в надёжном месте, например в сейфе. Если это не было сделано сразу, то его можно будет сгенерировать позднее.

GUI

Главное окно Kleopatra
Главное окно Kleopatra

Сначала запустим данную утилиту штатным для используемой операционной системы способом и увидим её главное окно, где отображаются все созданные или импортированные ключи. Полужирным шрифтом обозначаются те, для которых у нас есть закрытая часть, т.е. наши ключи.

Варианты создания ключевой пары
Варианты создания ключевой пары

Для того, чтобы создать новую ключевую пару, в меню Файл (File) выберем пункт Новая ключевая пара (New key pair), а затем Создать личную пару ключей OpenPGP (Create new OpenPGP key pair).

Диалог создания ключевой пары
Диалог создания ключевой пары

Далее в появившейся форме мастера создания ключей укажем наше имя и адрес электронной почты.

Дополнительные параметры ключевой пары
Дополнительные параметры ключевой пары

Нажатие кнопки Дополнительные параметры позволит задать различные необязательные настройки создания ключевой пары: тип, длину ключа, а также срок действия.

Резюме мастера создания ключевой пары
Резюме мастера создания ключевой пары

После указания всех необходимых данных и, опционально, параметров, жмём кнопку Далее (Next). Мастер ещё раз предложит убедиться, что всё указано верно и затем нажать кнопку Создать (Create).

Успешное завершение создания ключевой пары
Успешное завершение создания ключевой пары

Через несколько секунд начнётся процесс сбора энтропии для создания секретного ключа и будет предложено ввести пароль для его защиты, а по окончании будет доложено о результате, а также выведен на экран отпечаток созданной пары. Нажмём Завершить (Finish) для выхода.

Экспорт открытого ключа

Для того, чтобы нам могли шифровать файлы/сообщения, а также проверять наши подписи, мы должны экспортировать свой открытый ключ в файл, либо на ключевой сервер.

Консоль

Экспорт открытого ключа в текстовый файл:

gpg2 --export --armor 0xD45AB90A > mykey.asc

Экспорт открытого ключа на сервер ключей:

gpg2 --keyserver pgp.mit.edu --send-keys 0xD45AB90A

Здесь 0xD45AB90A — отпечаток ключа нашей ключевой пары, открытый ключ которой мы экспортируем, а mykey.asc — имя файла, в который будет сохранён результат.

GUI

В главном окне Kleopatra выбираем нашу ключевую пару, нажимаем по ней правой кнопкой мыши и в контекстном меню выбираем пункт Экспортировать на сервер (Export on Server).

Если требуется экспортировать в файл, тогда в контекстном меню выбираем пункт Экспортировать (Export) и сохраняем файл.

Создание цифровой подписи файла

GnuPG позволяет использовать несколько типов подписей:

  • встроенная в файл: содержимое файла изменяется так, чтобы в него была добавлена ЭЦП. Чаще всего применяется при отправке подписанных сообщений по электронной почте;
  • отсоединённая в текстовом формате: создаётся файл с расширением *.asc вида mydocument.pdf.asc (где mydocument.pdf — имя оригинального файла);
  • отсоединённая в двоичном формате: создаётся файл с расширением *.sig вида mydocument.pdf.sig в бинарном формате.

Для создания ЭЦП файла используется закрытый ключ из нашей ключевой пары, а для проверки — открытый.

Консоль

Создадим отсоединённую подпись в текстовом формате:

gpg2 --sign --detach-sign --default-key 0xD45AB90A --armor mydocument.pdf

Здесь 0xD45AB90A — отпечаток ключа нашей ключевой пары, а mydocument.pdf — имя файла, который мы будем подписывать ЭЦП.

Создадим отсоединённую подпись в двоичном формате:

gpg2 --sign --detach-sign --default-key 0xD45AB90A mydocument.pdf

Все параметры идентичны, но на выходе будет получен файл mydocument.pdf.sig.

Создадим встроенную в файл подпись в текстовом формате:

gpg2 --sign --default-key 0xD45AB90A --armor mydocument.pdf

Создадим встроенную в файл подпись в двоичном формате:

gpg2 --sign --default-key 0xD45AB90A mydocument.pdf

Внимание! При создании встроенных подписей содержимое файла-источника целиком включается внутрь, поэтому использовать данный формат не желательно из-за дублирования и значительного размера. Далее в статье мы будем рассматривать только отсоединённую ЭЦП, т.к. это самый популярный вариант подписи.

GUI

Выбор пункта на панели Kleopatra
Выбор пункта на панели Kleopatra

В главном окне Kleopatra нажмём кнопку на панели инструментов Подписать/Зашифровать (Sign/Encrypt).

Подпись файлов в Kleopatra
Подпись файлов в Kleopatra

В открывшемся окне сначала найдём на диске файл, который следует подписать, выберем его и увидим новое окно с настройками шифрования и подписи.

Выберем свой, который будет использоваться для подписи и, т.к. мы не хотим шифровать его, уберём флажки из всех чекбоксов блока Зашифровать (Encrypt).

Т.к. нам необходимо создать отсоединённую подпись, обязательно установим флажок в чекбокс Зашифровать / Подписать каждый файл отдельно (Encrypt / Sign each file separately).

Запрос ввода пароля закрытого ключа
Запрос ввода пароля закрытого ключа

После нажатия кнопки Подписать (Sign) будет предложено ввести пароль, указанный при создании ключевой пары.

Успешная подпись файла в Kleopatra
Успешная подпись файла в Kleopatra

Если пароль был введён верно, то процесс завершится успешно и будет создана действительная цифровая подпись. Нажмём Завершить (Finish) для выхода.

Импорт открытого ключа

Для проверки чужой цифровой подписи GnuPG, у нас должны быть:

  1. открытый ключ человека, который её создал;
  2. оригинальный файл и файл отсоединённой цифровой подписи.

Сначала мы должны импортировать ключ респондента, подписавшего файл (если это не было сделано ранее). Это можно сделать любым способом:

  • текстовый файл;
  • серверы-хранилища ключей;
  • буфер обмена (для GUI утилит).

Консоль

Импортируем открытый ключ с ключевого сервера (наиболее популярный вариант):

gpg2 --keyserver pgp.mit.edu --recv-keys 0xD45AB90A

Здесь 0xD45AB90A — отпечаток открытого ключа, который мы импортируем.

Импортируем открытый ключ из файла:

gpg2 --import mykey.asc

Здесь mykey.asc — имя файла с открытым ключом.

Теперь мы должны установить доверие импортированному ключу, т.к. в противном случае не сможем проверить подпись. Войдём в интерактивный режим:

gpg2 --edit-key 0xD45AB90A

Установим доверие ключу:

trust

Проверим отпечаток респондента (например посредством телефонного звонка или любым другим способом), затем выберем пункт Я полностью доверяю (I trust fully). Выходим из интерактивного режима:

quit

Также мы можем подписать чужой ключ своей подписью после его проверки. Это можно сделать так:

gpg2 --sign-key 0xD45AB90A

Созданную подпись рекомендуется отправить назад на ключевой сервер:

 gpg2 --keyserver pgp.mit.edu --send-keys 0xD45AB90A

Здесь 0xD45AB90A — отпечаток открытого ключа респондента.

GUI

Поиск ключа на сервере в Kleopatra
Поиск ключа на сервере в Kleopatra

Для того, чтобы импортировать открытый ключ с сервера в Kleopatra, мы должны знать либо его отпечаток, либо адрес электронной почты, который был указан при его создании. Введём запрос в поле Искать (Search) и нажмём Поиск (Search). Как только будет найден необходимый, выберем его и нажмём Импорт (Import).

Если требуется загрузить открытый ключ из текстового файла достаточно просто нажать в главном окне Kleopatra кнопку Импорт (Import) и указать данный файл.

Настройка уровня доверия ключу в Kleopatra
Настройка уровня доверия ключу в Kleopatra

Проверим отпечаток импортированного ключа и, если всё верно, установим ему уровень доверия посредством выбора ключа в главном окне и пункта Изменить уровень доверия (Change Certification Trust) в контекстном меню.

Подпись ключей в Kleopatra
Подпись ключей в Kleopatra

Если необходимо, подпишем его (пункт Подписать (Certify)) контекстного меню). Проверим отпечаток ключа (контрольную сумму) и нажмём Далее (Next).

Выбор ключевой пары для подписи Kleopatra
Выбор ключевой пары для подписи Kleopatra

Поставим точку в пункт Сертифицировать для всех (Certify for all) и Отправить заверенный сертификат на сервер (Export signed certificate to server), затем нажмём кнопку Удостоверить (Certify).

Проверка цифровой подписи

Внимание! Файл отсоединённой ЭЦП должен лежать в том же каталоге, что и оригинальный файл, иначе выполнить проверку его подлинности будет невозможно.

Консоль

Проверка отсоединённой подписи файла:

gpg2 --verify mydocument.pdf.sig

GUI

Главное окно Kleopatra, пункт проверки подписей
Главное окно Kleopatra, пункт проверки подписей

В главном окне Kleopatra, на панели инструментов, выберем пункт Расшифровать и проверить (Decrypt and verify), затем найдём на диске файл отсоединённой подписи и откроем его.

Результат проверки ЭЦП Kleopatra
Результат проверки ЭЦП Kleopatra

Через несколько секунд программа произведёт проверку ЭЦП и выведет результат.

Литература

При написании статьи использовалась литература из следующих источников:

20 commentaries to post

  1. Если я изменю свой ключ, который уже был подписан другими людьми, подписи слетят?

    1. Конечно слетят. Изменённые GPG ключи будут считаться новыми и их необходимо подписывать заново. Именно поэтому рекомендуется не редактировать, а создавать новые, а затем подписывать старым ключом. В таком случае если пользователь доверял ключу, то автоматически будут доверять и тем, которые им подписаны.

  2. Допустим, «слетела» система; её восстановил, установил вновь Kleopanr»y.
    Вопрос, каким образом импортировать заранее сохранённый «Закрытый ключ»?
    Есть ли такая возможность?
    Да, «Публичный ключ» также был заранее сохранен одновременно с «Закрытым…».

    1. Если вы ранее экспортировали закрытый ключ в файл, то просто нажмите кнопку Импорт в главном окне Kleopatra и найдите его на диске.

      1. Благодарю, так и поступил. Только загрузил сразу оба ключа.
        Только пришлось дополнительно провести вновь их регистрацию.
        Мне попалась информация о т.н. «связке ключей»; использую LinuxМINT и openSUSE, может есть ещё какой-то файлик(и) в /home/kroman/.gnupg где записана полная информация характеризующую эту пару ключей и после копирование которого(ых) отпадает необходимость в их регистрации?
        С уважением, Роман.

        1. Только пришлось дополнительно провести вновь их регистрацию.

          Что вы подразумеваете под регистрацией? GPG ключи не требуют ничего такого. Их можно выгружать на ключевые серверы вместе с подписями для удобства, но это опциональная функция.

          Мне попалась информация о т.н. «связке ключей»

          Ключевая пара — это связка из открытого и закрытого ключа в терминологии GnuPG.

          /home/kroman/.gnupg где записана полная информация характеризующую эту пару ключей и после копирование которого(ых) отпадает необходимость в их регистрации?

          В каталоге ~/.gnupg хранится вся база данных GnuPG: база открытых ключей (файл pubring.gpg), а также отдельно приватные ключи (начиная с версии GnuPG 2.x) в зашифрованном виде в каталоге ~/.gnupg/private-keys-v1.d. Если наряду с gpg2 используется ещё и устаревшая версия gpg1, то приватные ключи могут дублироваться и в устаревшей базе secring.gpg.

          1. Благодарю за подробный и исчерпывающий ответ.
            «Клеопатру» обнаружил в меню после установки openSUSE уже как предустановленную программу. Никогда раннее не пользовался такого рода программ, вот и заинтересовался; тем и вызвана т.с. терминологическая «корявость» моих вопросов. Надо просто-напросто более внимательно прочесть соответствующие разделы Мануала и подумать…
            Ещё раз благодарю. С уважением и пожеланиями всего самого доброго,
            Роман.

          2. «Клеопатру» обнаружил в меню после установки openSUSE уже как предустановленную программу

            Да, Kleopatra сейчас применяется в качестве замены KGpg в KDE.

            Надо просто-напросто более внимательно прочесть соответствующие разделы Мануала и подумать

            Если возникнут какие-то вопросы по работе с GPG, можете смело задавать их здесь. Мы постараемся помочь.

  3. подскажите пожалуйста эти моменты, не могу разобраться:

    1.в чем разница между 0xD45AB90A и контрольной суммой, вы пишите что первое это отпечаток открытого ключа, а мне казалось что наоборот контрольная сумма более длинная и является подтверждением подлинности открытого ключа

    2. в чем разница между сертификатом и открытым ключемм или это одно и тоже?

    3. перед проверкой на подпись нужно в меню программы выбрать октрытый ключ или она подберет сама?

    4. в последнем этапе проверки подлинности, выбирается только файл с цифровой подписью, а какой файл как узнает программа нужно расшифровать? или нужно отдельная папка с двумя файлами

    1. в чем разница между 0xD45AB90A и контрольной суммой

      См. здесь.

      в чем разница между сертификатом и открытым ключом или это одно и тоже?

      В терминологии утилиты Kleopatra под сертификатом следует понимать открытый ключ GnuPG. Более подробно здесь.

      перед проверкой на подпись нужно в меню программы выбрать октрытый ключ или она подберет сама?

      Для проверки ключ выбирать не нужно ибо он уже указан внутри GnuPG-подписи. Необходимо лишь, чтобы соответствующий открытый ключ был импортирован.

      в последнем этапе проверки подлинности, выбирается только файл с цифровой подписью, а какой файл как узнает программа нужно расшифровать? или нужно отдельная папка с двумя файлами

      Для проверки подписи необходимо, чтобы в одном каталоге находились оба файла: оригинальный файл и соответствующая ему отсоединённая подпись (например file.pdf и file.pdf.sig).

  4. Добрый день! Чуть больше года назад сделал все по инструкции и успешно пользовался.

    На днях я переустановил Windows 7 на Windows 10. Удалилась программа kleopatra, установил ее вновь, но открылась без сохраненных ключей. Увидел ваше сообщение на форуме: от 21.07.2018 в 16:02
    Затем порылся в компе по разделам, которые у Вас указаны. Нашел ключи, но у не получается их импортировать обратно в программу, видимо я что-то не так делаю. Подскажите, пожалуйста, как мне вернуть все на свои места? Только, пожалуйста, понятным языком, потому что я нулевой в этой теме и не владею терминологией.

    1. Старые ключи остались в пользовательском профиле предыдущей установки Windows, в каталоге C:\Users\ЛОГИН\AppData\Roaming\gnupg, где C: — буква диска старой ОС. Для доступа возможно потребуется получить права владельца.

      Для восстановления необходимо просто скопировать всё содержимое в %APPDATA%\gnupg новой установки и перезапустить утилиту Kleopatra. Ключи появятся.

      1. Все получилось, Вы спец в своем деле, большое спасибо! Теперь думаю сохранить ключи в отдельную папку и скинуть ее на флешку. Мне необходимо нажать Экспорт или Экспорт закрытых ключей? И достаточно ли этого будет, чтобы потом, например, открыть эту папку на другом компьютере, импортировать их в Kleopatra и воспользоваться ключами?

        1. Лучше экспортировать ключи штатным средством Kleopatra.

          Нажмите по ключевой паре правой кнопкой мыши, затем выберите сначала пункт Экспорт для сохранения публичного ключа пары, а затем Экспорт закрытого ключа, чтобы сохранить и секретный.

          Экспортированные ключевые файлы могут быть импортированы в любой момент и поэтому их следует надёжно хранить.

  5. Сразу напишу в дополнение к комментарию, когда ввожу в поиск gnupg, находит очень много разных файлов. Как я понимаю, мне нужна папка F:\Users\User\AppData\Roaming\gnupg\private-keys-v1.d
    В ней два файла KEY, но импортировать их у меня не получается.

    1. Эти ключи хранятся в бинарном формате, в зашифрованном виде. Их нужно импортировать прямым копированием всего содержимого каталога.

  6. Здравствуйте. Возник такой вопрос, по технической части. При «импорте ключа», я в поиске прописываю ключ. В первый раз на сервере ключ нашёлся,нажал импорт, но.. он не отобразился в поле. По сути ничего не произошло. Во второй и последующие разы сервер попросту не находит ключ. В веб версии находит, а в клеопатре нет. Я даже не знаю как сформулировать вопрос.. что я сделал не так? Почему сервер больше не обнаруживает искомый ключ?

    1. Ключевые серверы могут просто периодически быть недоступными из-за высокой нагрузки, DDoS-атак, либо прочим причинам.

      Если вы не можете импортировать ключ с одного ключевого сервера, выберите в настройках другой (большинство из них обмениваются публичными ключами между собой, либо даже состоят в общем пуле).

      Также вы можете попросить собеседника передать вам свой публичный ключ любым доступным способом: электронная почта, мессенджеры и т.д. Далее просто импортируйте полученный файл в Kleopatra.

  7. При проверке отдельной подписи пишет — «Произошла ошибка: Kleopatra: Невозможно открыть файл «C:/Users/User/Downloads/OpenPGP_signa» для чтения: Input/output error (218136625)»

      1. Проверьте права доступа к обоим файлам.
      2. Убедитесь, что имя файла отсоединённой подписи соответствует имени проверяемого файла и то, что они находятся в одном каталоге. Т.е. например для foo-bar.pdf файл отсоединённой подписи должен именоваться foo-bar.pdf.sig.

Обсуждение закрыто.