Вы здесь

Ключи OpenPGP

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

Первичные ключи и подключи

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

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

0x01    “C” Key Certification
0x02    “S” Sign Data
0x04    “E” Encrypt Communications
0x08    “E” Encrypt Storage
0x20    “A” Authentication

Мастер-ключ автоматически помечается флагами ключа подписи и ключа выпуска сертификатов (CS), поскольку он используется для подписывания подключей и для создания сертификатов отзыва. Отличие ключа шифрования от ключа подписи в том, что ключ подписи действует в будущем. Если его украдут, то злоумышленники смогут в будущем подписывать документы от вашего имени. Поэтому ключ подписи должен иметь ограниченный срок действия и (в случае компрометации) должен быть отозван до окончания срока, чтобы предупредить его использование злоумышленниками. Ключ шифрования действует в прошлом. Его компрометация ведёт к тому, что злоумышленники смогут расшифровать переписку, которая велась с его использованием и никакие отзывы здесь не помогут.

В GnuPG версии 2.1 и старше команда --gen-key создаёт мастер-ключ с функцией подписи и дополнительный подключ с функцией шифрования.

При создании нового подключа задаётся вопрос о его назначении:

$> gpg --edit-key jd@example.com
...
gpg> addkey
Выберите тип ключа:
   (3) DSA (только для подписи)
   (4) RSA (только для подписи)
   (5) Elgamal (только для шифрования)
   (6) RSA (только для шифрования)
  (14) Existing key from card
Ваш выбор?

Для создания ключа аутентификации необходимо запускать gpg с опцией --expert

Публичные и приватные ключи

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

Идентификаторы ключа

Для идентификации ключей используется два типа идентификации:

  • человекочитаемый, но не уникальный идентификатор пользователя (user ID, UID)
  • уникальный, но неудобный для ввода цифровой отпечаток ключа (fingerprint, key ID)

Идентификатор пользователя имеет формат: "Полное имя <адрес e-mail>". Этот идентификатор связывает ключ с определенным человеком. Очевидно, что человек, создающий много ключей, скорее всего, будет использовать для них одинаковые UIDы. К одному ключу можно привязать несколько идентификаторов пользователя, например UIDы для различных почтовых ящиков. Поиск ключа можно вести по полному тексту UID, по e-mail, по полному имени или по его подстроке.

Отпечаток ключа - это хэш SHA-1 длиной 160 бит, вычисляемый на основе открытого ключа и метки времени создания ключа. Для ввода/вывода отпечатка в интерфейсе пользователя используется шестнадцатеричная запись. Длина отпечатка - 40 шестнадцатеричных цифр, которые для удобства разбивают на 10 групп по 4 цифры.

$> gpg --fingerprint  -k
...
-----------------------
pub   rsa2048 2020-04-17 [SC] [   годен до: 2022-04-17]
      DA3C E9CE 6DF2 C458 43AB  2392 D556 0606 D3C9 EE9B
uid         [  абсолютно ] John Dow <jd@example.com>
sub   rsa2048 2020-04-17 [E] [   годен до: 2022-04-17]

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

$> gpg --with-keygrip -k
...
pub   rsa2048 2020-04-17 [SC] [   годен до: 2022-04-17]
      DA3CE9CE6DF2C45843AB2392D5560606D3C9EE9B
      Keygrip = 5D3F2A0BA1DCC59210761397A5CEC5E3393FB111
uid         [  абсолютно ] John Dow <jd@example.com>
sub   rsa2048 2020-04-17 [E] [   годен до: 2022-04-17]
      Keygrip = 0AF602B0376E373F4158E230D0E5E3E9F32F4619

Для экономии времени на ввод идентификатора (или его диктовку по телефону) могут использоваться младшие байты цифрового отпечатка. 16 последних шестнадцатеричных цифр отпечатка называются длинным идентификатором (long ID), а последние 8 символов - коротким идентификатором (short ID). Использование длинного и короткого идентификатора считается плохой практикой, поскольку для них легко сгенерировать коллизии - т.е. различные ключи с совпадающими укороченными ID (но с несовпадающими отпечатками).

В некоторых случаях в начале идентификатора нужно добавлять символы 0x, чтобы подчеркнуть, что это число в шестнадцатеричном виде.

Для того, чтобы не пересчитывать символы руками, команда просмотра публичных ключей --list-keys (-k) позволяет указать опцию --keyid-format, которая может принимать значения 0xLONG, LONG, 0xSHORT, SHORT.

$> gpg --keyid-format 0xSHORT --list-keys
/home/user/.gpg/pubring.kbx
-----------------------
pub   rsa2048/0xD3C9EE9B 2020-04-17 [SC] [   годен до: 2022-04-17]
      DA3CE9CE6DF2C45843AB2392D5560606D3C9EE9B
uid         [  абсолютно ] John Dow <jd@example.com>
sub   rsa2048/0x08A972CD 2020-04-17 [E] [   годен до: 2022-04-17]

Смысл создания подключей

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

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

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

  • когда вы подписываете чужой ключ или отзываете существующую подпись
  • когда вы создаете новый подключ
  • когда вы добавляете новый UID или помечаете существующий UID как основной
  • когда вы меняете настройки (например, с помощью setpref) для UID
  • когда вы меняете дату истечения срока действия вашего мастер-ключа или любого его подключа
  • когда вы отзываете существующий UID или подключ
  • когда вы отзываете или генерируете сертификат отзыва для ключа со всеми подключами

Время жизни ключа

Можно использовать различные стратегии устаревания:

  1. Мастер-ключ подписи с бесконечным временем жизни. В случае утери или похищения придётся оповещать всех корреспондентов об отзыве старого ключа и каким-то способом оповещать о появлении нового;
  2. Мастер-ключ с бесконечным временем и временные ключи с небольшим сроком жизни, подписанные мастер-ключом. Мастер-ключ хранится отдельно в сейфе. В случае утери временного ключа генерируется и подписывается новый, плюс рассылается сертификат отзыва. Небольшой срок действия ограничит время на взлом пароля для доступа к ключу;
  3. Одноразовые ключи со временем жизни в несколько часов или дней - по обстоятельствам.
Яндекс.Метрика