id: Гость   вход   регистрация
текущее время 17:02 21/11/2017
создать
просмотр
редакции
ссылки

Создание и использование ключа OpenPGP с подключами


Оглавление документа:

Основы


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


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


Позднее в стандарт была внесена концепция подключей (subkeys), и типичный ключ стал состоять из "главного" ключа подписи и сертификации (обычно DSA) и подключа шифрования (обычно Elgamal). В данном случае разглашение закрытого ключа шифрования влекло за собой отзыв и замену лишь данного подключа без утраты главного ключа сертификации и всех собранных подтверждающих подписей. С другой стороны, утрата секретности закрытой части главного ключа требовала его полной замены, при том, что ключ DSA достаточно уязвим к утечке при частом использовании из-за мелких, трудно обнаружимых ошибок реализации алгоритма подписи или из-за недобросовестной реализации алгоритма DSA, что тоже непросто обнаружить. Ограниченный размер модуля тоже снижает стойкость.


В этой статье предлагается конструкция ключа OpenPGP, использующая подключи как для шифрования, так и для подписи данных, и тем минимизирующая риск утраты главного сертифицирующего ключа. В приведенном примере для создания ключа используется программа GPG (она же GnuPG, или GNU Privacy Guard), но в других современных реализациях стандарта OpenPGP тоже есть возможность создания и использование такого ключа.

Создание ключа


В целях обеспечения повышенной безопасности чувствительного ключевого материала создавать ключ следует на отторгаемом носителе (например, на USB-брелоке), используя персональный компьютер, не подключенный к сети. Также убедитесь, что используете наиболее свежую стабильную версию GnuPG: ранние версии могут содержать уязвимости и ошибки и, кроме того, не иметь поддержки необходимых для нашей задачи инструментов управления ключами.


Сначала создадим новую папку на брелоке. Пример (UNIX, брелок монтирован на /mnt/pen):



Пример (DOS/Windows, брелок на E:):




Помимо этого, внесем небольшое временное дополнение в файл настроек GnuPG gpg.conf с тем, чтобы все дальнейшие действия с ключами производились в контексте сменного носителя, а не вашей основной связки (добавьте в конец файла):



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


Следующий шаг — генерирование мощного пароля. Этот пароль будет использоваться редко (только для сертификации и внесения изменений в состав ключа), и его следует записать на лист бумаги и хранить при себе или в сейфе. Ни в коем случае не сохраняйте его в файл.



Теперь генерируем главный ключ сертификации RSA:



Выбираем (5) RSA (sign only) и размер ключа как минимум 2048 бит. Выбор ключей с модулем более 2048 бит (предпочтительно 4096) безопаснее в долгосрочной перспективе (порядка десяти лет), но в редких случаях может создать проблемы с совместимостью. Главный ключ может быть бессрочным (выбор 0 = key does not expire). Указываем имя и фамилию без адреса электронной почты и записанный пароль. Через несколько минут или секунд, в зависимости от мощности процессора, ключ будет готов. Запишем его идентификатор (например, 1234ABCD).


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


Затем редактируем ключ:



Желательно командой adduid создать дополнительную запись сертификата с адресом электронной почты (или несколько записей, если у вас несколько адресов). Затем в получившемся списке UID выделить главную запись (без почтового адреса) и сделать ее первичной, введя команду primary.


Теперь с помощью команды addkey добавьте нужные подключи для шифрования и подписания данных. Важно, что шифровальный подключ должен быть только один, тогда как подключей подписи можно добавить несколько (но как минимум один), хотя обычно в этом нет существенной потребности. Эти ключи должны регулярно заменяться, и для них стоит заранее установить срок действия в один или два года. Ключей для подписи должно быть столько, на скольких системах вы ими желаете пользоваться (например, один домой, один на работу и т.д.). Типы и длины подключей можете выбрать самостоятельно, исходя из срока действия подключей и ваших специфических требований, однако лучше остановить выбор на типе 5 RSA (sign only) для подключей подписи и типе 6 RSA (encrypt only) для подключей шифрования.


Теперь схема вашего нового ключа будет иметь примерно такой вид:



Не забудьте сохранить произведенные изменения, введя команду save.

Отделение и импорт подключей


А теперь самое главное. Поскольку мы не хотим подвергать главный ключ новой ключевой пары риску компрометации, то должны хранить и применять его особо безопасным образом, в отличие от подключей подписи и шифрования, операционные условия которых могут быть значительно шире. Таким образом, нам необходимо "отделить" подключи от главного ключа, экспортировав их в отдельный файл. Этой цели служит специальная команда --export-secret-subkeys, реализованная в GnuPG 1.4.2.


Выполним (в DOS/Windows не забудьте скорректировать путь к каталогу на брелоке):



Эта команда заставит GnuPG экспортировать закрытые подключи созданного ключа (и только их) в файл subkeys.gpg. Прежде чем импортировать этот файл в основную связку ключей, вернем настройки программы в изначальное состояние — удалите из gpg.conf внесенные ранее строчки. Затем произведите импорт секретных частей подключей подписи и шифрования, а также весь открытый ключ целиком (заметьте, мы не трогаем секретную часть главного ключа):



Проверим результат:




Обратите внимание на второй листинг. В первой строке после обозначения закрытой части главного ключа стоит знак решетки: sec#. Это означает, что секретный материал данного ключа недоступен на связке (ведь мы импортировали только отделенные подключи), а есть лишь его сертификат. Если же вы не видите значка решетки, то что-то прошло не так, и закрытая часть главного ключа тоже как-то попала на связку (возможные причины: вы по ошибке импортировали файл seckey.gpg или забыли восстановить настройки в gpg.conf). В этом случае удалите ключ со связки и начните всё с самого начала, включая генерацию нового ключевого материала.


Если полученный результат верен, можете спокойно удалить только что импортированные файлы pubkey.gpg и subkeys.gpg с USB-брелока или иного носителя, где производили все действия. Файл seckey.gpg, содержащий закрытую часть главного ключа, обязательно сохраните и не резервируйте на основной системе, иначе вы потеряете все преимущества подобной схемы разделения ключа.

Использование ключа


Для передачи вам конфиденциальной информации корреспонденты могут использовать этот ключ, как и любой другой. Точно так же, и при получении от вас подписанного сообщения их программа скорее всего сообщит, что оно заверено подключом 0x12121212, относящимся к главному ключу 0x1234ABCD (исключение составляют только старые версии OpenPGP-совместимого ПО и некоторые почтовые клиенты с ограниченной поддержкой OpenPGP, которые могут не определить связь подключа подписи с главным ключом). При шифровании данных этим ключом вы тоже не обнаружите отличий от работы с обычным ключом. Нюансы появляются при подписании данных, заверении ключей и внесении изменений в сам сертификат ключа.


Во-первых, для выполнения двух последниx действий необходим доступ к закрытой части главного ключа, размещенной на отторгаемом носителе. Чтобы GnuPG знал, где искать материал ключа, используйте в своих командах параметр --secret-keyring [путь к файлу seckey.gpg] либо внесите его в gpg.conf, чтобы не указывать постоянно (не забывайте, что в файле настроек параметры указываются без предваряющих дефисов, т.е. в виде secret-keyring [путь к файлу seckey.gpg]).


Во-вторых, при подписании таким ключом файлов и текста используемая программа может столкнуться с неоднозначностью выбора: использовать для подписания главный ключ (не забывайте, это тоже ключ подписи) или подключ, предназначенный для подписи (а если их несколько, то который из них)? Поэтому, подписывая данные, предпочтительно задавать подключ подписи явно: -u 0x12121212 (это ID подключа подписи из нашего примера). Однако, заверяя другие ключи или редактируя собственный, такое принуждение не требуется: программе в любом случае понадобится секретная часть главного ключа 0x1234ABCD. Также ID не надо указывать, если вы создали только один подключ подписи и не указывали параметр secret-keyring [путь к файлу seckey.gpg] в файле настроек GnuPG: в этом случае программа не столкнется с неоднозначностью выбора, поскольку ID 0x1234ABCD будет связан только с одним ключом подписи — 0x12121212.


 
На страницу: 1, 2, 3, 4, 5, 6, 7 След.
Комментарии [скрыть комментарии/форму]
— monomah (29/07/2015 12:02)   профиль/связь   <#>
комментариев: 5   документов: 0   редакций: 0
https://gnupg.org/faq/whats-new-in-2.1.html#nosecring на "modern"-версии теперь нет secring.gpg.
— pgprubot (29/07/2015 17:08, исправлен 29/07/2015 17:14)   профиль/связь   <#>
комментариев: 511   документов: 2   редакций: 70

Интересней другое:


En passant this allows the long time requested “merging of secret keys” and several other advanced key management techniques.

This allows co-existence of older GnuPG versions with GnuPG 2.1. However, any change to the private keys using the new gpg will not show up when using pre-2.1 versions of GnuPG and vice versa.

With GnuPG 2.1 the need of GPG_AGENT_INFO has been completely removed and the variable is ignored. Instead a fixed Unix domain socket named S.gpg-agent in the GnuPG home directory (by default ~/.gnupg) is used.

Короче, один баг исправят, а несколько новых добавят и опять всё сломают.


Note that the command --export-secret-keys still creates an OpenPGP compliant file with the secret keys. This is achieved by asking gpg-agent to convert a key and return it in the OpenPGP protected format.

Без агента теперь не будет работать даже экспорт секретных ключей. ☹

— pgprubot (28/09/2015 05:50, исправлен 28/09/2015 06:17)   профиль/связь   <#>
комментариев: 511   документов: 2   редакций: 70

Проблема где-то ещё глубже лежит, чем секретные подключи, т.к. с публичными подключами тоже происходят глюки.


Есть связка с секретными подключами, где нет «главного» секретного ключа, и есть полная связка, где есть всё. На второй связке отызываем старый uid и добавляем новый. Экспортируем публичный ключ и секретные подключи в файлы. В первой связке импортируем только публичный ключ (казалось бы, этого должно быть достаточно). После этого gpg -k показывает нормальный листинг, где показан новый uid, но gpg -K показывает листинг с отозванным uid'ом, что странновато. Если полностью удалить ключ со связки (публичный и секретный) и импортировать снова (публичный и секретные подключи), то gpg -K начинает показывать оба uid'а: и отозванный и вновь добавленный.


Возможно, если пометить новый uid как primary (перед экспортом публичного ключа), то проблемы не будет. Этот вариант не проверял. Впрочем, в любом случае, если неотозванный uid только один, то primary ни на что поидее влиять не должно.




В одной GnuPG-директории обнаружился мусорный файл вида ~/.gnupg/.#lkXXXXXXXX.HOSTNAME.NNNNN. lkXXXXXXXX — альфанумерики, NNNNN — число типа PID'а процесса. Содержимое файла состоит из 16-ти и заканчивается на NNNNN.HOSTNAME. Никогда такого мусора раньше не встречал. Кое-что по теме гуглится:


A temporary file ".#lk.<hostname>.pid[.threadid] is used.

И ещё:

CLEANFILES = prepared.stamp x y yy z out err  $(DATA_FILES) \
         plain-1 plain-2 plain-3 trustdb.gpg *.lock .\#lk* \
         *.test.log gpg_dearmor gpg.conf \
         pubring.gpg secring.gpg pubring.pkr secring.skr

Видимо, процесс очистки временных lock-файлов какой-то раз не сработал.

— NNS (14/09/2017 19:26, исправлен 15/09/2017 16:02)   профиль/связь   <#>
комментариев: 1   документов: 0   редакций: 0

Не осилил. 2.1.11 уже во дворе, много чего, видимо, поменялось. Я запутался в ключах: они по умолчанию генерируется 4 штуки: главный приватный, для подписи (pub)[SC], главный публичный, для проверки подписи (sec) [SC], приватный подключ для расшифрования (ssb) [E] и публичный подключ для шифрования (sub) [E]? Что означают буквы в квадратных скобках? Какие из этих 4 ключей нужно отделить и куда их потом? Поправьте, если что-то не так написал
UPD: Немного разобрался: приватные ключи теперь лежат отдельно друг от друга в каталоге ./private-keys-v1.d/, причём если какой нибудь убрать, то появляется эта заветная решёточка
UPD2: Прописал в конфиге путь к двум связкам, в итоге абсолютное доверие может иметь только одна. Как только меняю доверие на первой – на второй слетает и т.д. Фича?

На страницу: 1, 2, 3, 4, 5, 6, 7 След.
Ваша оценка документа [показать результаты]
-3-2-1 0+1+2+3