Использование PGP/GPG, руководство для нетерпеливых
23 ноября 2016
Данная статья представляет собой краткое руководство по использованию GnuPG (он же GPG). В ней вы найдете основные команды, примеры использования, а также инструкции по прикручиванию GPG к почтовым клиентам. Далее предполагается, что вы знакомы с принципом работы GPG и объяснять, например, что такое ассиметричная криптография, открытый и закрытый ключ, цифровая подпись и так далее, не требуется. За несколько десятилетий существования GPG никто особо не преуспел в его взломе, что как бы намекает нам, что это довольно надежное решение как для обмена зашифрованными сообщениями, так и просто шифрования файлов.
Терминология
Существует некоторая путаница в терминологии. Например, далеко не все могут внятно объяснить, чем PGP отличается от GPG. Давайте же во всем разберемся.
- OpenPGP — стандарт шифрования, описанный в RFC 4880 и RFC 6637. Не следует путать с конкретными реализациями, такими, как PGP и GPG;
- GnuPG или GPG — конкретная открытая (GPLv3) реализация OpenPGP, речь о которой пойдет в настоящей статье;
- PGP — сильно проприетарная реализация OpenPGP от компании PGP Corporation. В 2010-м году компанию купила Symantec, а ее продукты переименовала во что-то типа Symantec Desktop Email Encryption;
Часто, говоря «PGP», люди имеют в виду способ шифрования, описанный в OpenPGP, и соответственно любую из его реализаций.
Основные команды GnuPG
Генерируем ключи:
Хорошей идеей будет выбрать алгоритм RSA и длину ключей 4096 бит.
Важно! Не забудьте пароль от закрытого ключа.
Частая проблема — сообщение вроде такого:
the OS a chance to collect more entropy! (Need 204 more bytes)
Решается она установкой демона для сбора энтропии:
Просмотр списка ключей:
gpg --list-secret-keys
gpg --list-public-keys
Получение fingerprint ключа:
Пример вывода:
Fingerprint = DB5E AA39 0745 427D ED31 D189 3197 3F00 8640 D6B9
uid Aleksander Alekseev <afiskon@example.ru>
sub 4096R/5982B4BF 2016-09-27
Fingerprints используются в основном для проверки того, что с сервера ключей (см далее) был импортирован действительно правильный ключ. Для поиска их не используют.
Для отображения более безопасных длинных id используйте опцию keyid-format:
gpg --keyid-format 0xLONG -k 7EFE74E5
Короткие keyid удобны для манипуляции с ключами локально. Для поиска всегда следует использовать длинные id и проверять fingerprints. В последних версиях GPG длинные id используются по умолчанию.
Удалить ключ:
gpg --delete-keys 8640D6B9
Экспорт открытого ключа в текстовом виде (можно писать на всех заборах):
Экспорт закрытого ключа в текстовом виде (ключ все еще зашифрован мастер-паролем, можно использовать для бэкапа в Git):
Импорт открытого ключа:
Импорт закрытого ключа:
Если не указать --allow-secret-key-import
, импортируется только открытый ключ, и при попытке подписать что-то вы будете получать странные ошибки вроде:
gpg: msg.txt: sign+encrypt failed: secret key not available
Экспорт открытого ключа на keyserver:
Важно! После того, как вы залили ключ на keyserver, его будет невозможно удалить, только сделать revoke. Убедитесь, что вы сделали надежную резервную копию ключа. Если вы раньше никогда не работали с PGP/GPG, очень советую сначала потренироваться на почтовых адресах в зоне example.ru.
Не имеет большого значения, какой keyserver указать. Например, еще есть keys.gnupg.net, а также другие. Все они время от времени обмениваются друг с другом данными. Не лишено смысла сделать send-keys
сразу на несколько серверов, чтобы их быстрее увидели все пользователи PGP/GPG. Синхронизация серверов, по моим наблюдениям, занимает минут 10-15.
Hint: чтобы постоянно не указывать --keyserver
, просто допишите в ~/.bashrc:
Импорт открытого ключа с keyserver:
В мире PGP/GPG существуют так называемая сеть доверия (web of trust). В двух словах это означает, что GPG не доверяет ключу, если только он не подписан кем-то, кому вы доверяете. Кроме того, если вы доверяете Пете, а Петя доверяет Коле, то вы автоматически доверяете Коле. В частности, по умолчанию при проверке подписи и прочих действиях GPG будет ругаться так:
There is no indication that the signature belongs to
the owner.
Чтобы исправить это, говорим:
Затем в диалоге говорим trust
, жмем 5 («I trust ultimately»), говорим quit
. Другие ключи можно подписать командой tsign
. Кстати, там же можно сменить пароль от вашего ключа (команда passwd
), изменить дату экспирации ключа в любую сторону (команда expire
), добавить имя/email (команда adduid
), удалить имя/email (команда revuid
), посмотреть алгоритмы шифрования, используемые по умолчанию (showpref
) и делать другие интересные вещи.
Примечание: Что делать, когда ключ заэкспайрился? В этом случае можно изменить дату экспирации на более позднюю и перезалить ключ. Или же создать новый ключ, подписать его старым, и залить новый ключ на keyserver. Делать revoke не требуется.
Вы можете подписать чей угодно ключ и залить подписанный ключ на сервер, подтвердив тем самым, что ключ действительно принадлежит человеку, указанному в описании:
gpg --keyserver pgp.mit.edu --send-keys 7EFE74E5
На какой-нибудь другой машине можно скачать ключ заново и посмотреть, кем он подписан:
gpg --list-sigs eax@example.ru
gpg --check-sigs eax@example.ru
Время от времени стоит обновлять ключи, на случай, если у ключей появились новые подписи, или какие-то ключи отозвали:
Пример шифрования и подписи файла для заданного получателя (ключ -r можно указывать много раз):
Расшифровка файла и проверка подписи осуществляется командой:
Пример подписи и проверки подписи бинарного файла (например, ISO образа диска):
gpg --verify file.iso.sig
Симметричное шифрование/дешифрование файла (удобно, например, для хранения паролей):
gpg -o nonsense2.txt -d nonsense.gpg
Симметричное шифрование с сохранением в бинарном формате (удобно для шифрования бэкапов):
gpg --symmetric --cipher-algo AES256 --digest-algo SHA256 \
--compression-algo Uncompressed > backup.tgz.gpg
Расшифровка зашифрованного таким образом файла:
При этом по умолчанию GPG запрашивает пароль через GUI интерфейс, что я лично нахожу не очень-то удобным. Изменить данное поведение можно так:
~/.gnupg/gpg-agent.conf
killall gpg-agent
Может оказаться, что ваш закрытый ключ скомпрометирован, то есть, его украли и подобрали к нему пароль. Или же вы потеряли его. Или просто не можете вспомнить пароль от ключа. Для таких случаев предусмотрен отзыв ключа. Делается это так. Заранее, сразу после создания ключей, требуется создать сертификат отзыва:
Используя его, ключ можно отозвать так:
gpg --keyserver pgp.mit.edu --send-keys 7EFE74E5
Важно! Сертификат отзыва не шифруется и может быть использован кем угодно. Убедитесь, что храните его в надежном месте (лучше даже в нескольких таких местах) и непременно в зашифрованном виде!
Прикручиваем GnuPG к Claws Mail
В Ubuntu нам понадобятся следующие пакеты:
В Configuration → Plugins → Load загружаем pgpcore.so, pgpinline.so и pgpmime.so. Далее просто настраиваем плагины через настойки клиента. В настройках аккаунта можно указать, какие ключи использовать, а также сгенерировать новые ключи и отправить их на keyserver. При написании письма в Options станут доступны галочки Encrypt и Sign.
В свойствах аккаунта во вкладке Privacy можно настроить плагины так, чтобы сообщения всегда подписывались, шифровались при ответе на зашифрованные сообщения, и так далее. Использовать советую PGP/MIME, так как PGP/Inline может не слабо раздражать пользователей, не использующих PGP/GPG. То есть, почти всех.
Из косяков плагина я столкнулся только с тем, что в настройках нужно указать полный путь к исполняемому файлу gpg, после этого все заработало.
Прикручиваем GnuPG к Mutt
Чтобы GPG заработал в Mutt, в ~/.muttrc дописываем:
set crypt_use_gpgme=yes
# по дэфолту подписывать все сообщения
set crypt_autosign=yes
# шифровать ответы на зашифрованные сообщения
set crypt_replyencrypt=yes
При написании письма жмем p
, там выбираем опции — подписать, зашифровать, и так далее. Все опции crypt_*
и pgp_*
описаны в man muttrc
. Плюс к этому здесь есть длинная строчка, благодаря которой Mutt можно научить проверять подписи для inline сообщений.
Мой полный и поддерживаемый в актуальном состоянии вариант конфига для Mutt находится здесь.
Заключение
GPG прикручивается еще очень много к чему. Скажем, для Thunderbird есть плагин Enigmail. Существуют мобильные приложения с поддержкой GPG. Например, для iPhone есть oPenGP и iPGMail. Кроме того, существуют плагины и для IM-клиентов, в частности, для Psi. К сожалению, рассмотреть их все в рамках одной статьи не представляется возможным.
Дополнение: Также вас может заинтересовать статья Шифрование сообщений в Jabber при помощи OTR.
Метки: Безопасность, Криптография.
Вы можете прислать свой комментарий мне на почту, или воспользоваться комментариями в Telegram-группе.