Дополнительные субключи расшифровки (ADSK) в GnuPG#

Дополнительные субключи расшифровки (ADSK) можно использовать для автоматического добавления получателей при шифровании сообщения с помощью GnuPG. Типичные случаи использования включают

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

  • добавление резервного ключа к ключу шифрования, и

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

Примечание

Чтобы настроить ADSK, вам понадобится GnuPG 2.4.1 или новее. Чтобы зашифровать сообщение для ключа с ADSK, вам понадобится GnuPG 2.2.42 или более новая версия.

Обзор#

Это руководство объясняет, как добавить резервный ключ (ID пользователя backup@example.com) в качестве ADSK к основному ключу (ID пользователя main@example.com). Оба ключа хранятся на Nitrokey. Эти же шаги можно использовать для добавления нескольких ADSK к одному ключу или для добавления одного и того же ключа в качестве ADSK к нескольким другим ключам.

Подготовка ключей#

Следуйте одному из этих руководств, чтобы сгенерировать два ключа:

Убедитесь, что вы можете перечислить оба ключа с помощью gpg --list-keys, например:

$ gpg --list-keys main@example.com backup@example.com
pub   ed25519 2023-07-04 [SC]
      55BC284C1D30D97638DA4A2C7963A4CD00C947CE
uid           [ultimate] Main Key <main@example.com>
sub   ed25519 2023-07-04 [A]
sub   cv25519 2023-07-04 [E]

pub   ed25519 2023-07-04 [SC]
      5271152B531F7FFD8787818251FB75800E281241
uid           [ultimate] Backup Key <backup@example.com>
sub   ed25519 2023-07-04 [A]
sub   cv25519 2023-07-04 [E]

Добавление ADSK#

Сначала определите отпечаток подключа шифрования для резервного ключа:

$ gpg --list-keys --with-subkey-fingerprints backup@example.com
pub   ed25519 2023-07-04 [SC]
      5271152B531F7FFD8787818251FB75800E281241
uid           [ultimate] Backup Key <backup@example.com>
sub   ed25519 2023-07-04 [A]
      7AEA1A0EC7BD66FF03AFEFAC8F243D8EC7678FCC
sub   cv25519 2023-07-04 [E]
      C1735CB29890EEDEABCF1D0DC9310F81D77519BC

Найдите строку, начинающуюся с sub, которая содержит букву E, указывающую на подключ с возможностью шифрования. Отпечаток этого подключа указан в следующей строке. В данном случае это C1735CB29890EEDEABCF1D0DC9310F81D77519BC.

Затем определите отпечаток главного ключа:

$ gpg --list-keys main@example.com
pub   ed25519 2023-07-04 [SC]
      55BC284C1D30D97638DA4A2C7963A4CD00C947CE
uid           [ultimate] Main Key <main@example.com>
sub   ed25519 2023-07-04 [A]
sub   cv25519 2023-07-04 [E]

Вы можете найти его в следующей строке после pub, в данном случае 55BC284C1D30D97638DA4A2C7963A4CD00C947CE.

Теперь вы можете добавить ADSK, используя флаг --quick-add-adsk:

$ gpg --quick-add-adsk \
      55BC284C1D30D97638DA4A2C7963A4CD00C947CE \
      C1735CB29890EEDEABCF1D0DC9310F81D77519BC

Первый аргумент - отпечаток основного ключа. Второй аргумент - отпечаток подключа шифрования резервного ключа.

Вы можете проверить, что ADSK был создан:

$ gpg --list-keys --with-subkey-fingerprints main@example.com
pub   ed25519 2023-07-04 [SC]
      55BC284C1D30D97638DA4A2C7963A4CD00C947CE
uid           [ultimate] Main Key <main@example.com>
sub   ed25519 2023-07-04 [A]
      9DF42A789DA4E848295C529634E35A6897DFABFD
sub   cv25519 2023-07-04 [E]
      1DFD6EA8D8B88BEA063ADB4BD75708BAF0CD49C8
sub   cv25519 2023-07-04 [R]
      C1735CB29890EEDEABCF1D0DC9310F81D77519BC

Подключом с R (ограниченной) способностью является ADSK. Он имеет тот же отпечаток пальца, что и подключ шифрования резервного ключа.

Теперь вы можете распространять открытый ключ с помощью ADSK.

Использование ADSK#

При шифровании сообщения для основного ключа резервный ключ теперь автоматически добавляется в качестве получателя. Единственными требованиями для этого являются:

  • Отправитель сообщения имеет актуальный открытый ключ, включающий ADSK.

  • Отправитель сообщения использует GnuPG 2.2.42 или новее.

Если вы добавите флаг --verbose, вы можете проверить ключи, которыми зашифровано сообщение:

$ echo message | gpg --verbose --encrypt --armor --recipient main@example.com > /tmp/msg.asc
gpg: using pgp trust model
gpg: using subkey D75708BAF0CD49C8 instead of primary key 7963A4CD00C947CE
gpg: automatically retrieved 'main@example.com' via Local
gpg: This key belongs to us
gpg: reading from '[stdin]'
gpg: writing to stdout
gpg: ECDH/AES256 encrypted for: "D75708BAF0CD49C8 Main Key <main@example.com>"
gpg: ECDH/AES256 encrypted for: "C9310F81D77519BC Main Key <main@example.com>"

Вы также можете использовать опцию --list-packets для проверки зашифрованного сообщения:

$ gpg --pinentry-mode cancel --list-packets /tmp/msg.asc | grep "pubkey enc packet"
:pubkey enc packet: version 3, algo 18, keyid D75708BAF0CD49C8
:pubkey enc packet: version 3, algo 18, keyid C9310F81D77519BC

Каждая pubkey enc packet строка представляет собой один ключ, который может расшифровать сообщение.

Аннулирование ADSK#

Если вы отозвали ADSK, он больше не будет добавлен в качестве получателя при шифровании сообщения. Чтобы выполнить отзыв, откройте ключ с помощью команды gpg --edit-key:

$ gpg --edit-key main@example.com

sec  ed25519/7963A4CD00C947CE
     created: 2023-07-04  expires: never       usage: SC
     card-no: FFFE 5E0E868D
     trust: ultimate      validity: ultimate
ssb  ed25519/34E35A6897DFABFD
     created: 2023-07-04  expires: never       usage: A
     card-no: FFFE 5E0E868D
ssb  cv25519/D75708BAF0CD49C8
     created: 2023-07-04  expires: never       usage: E
     card-no: FFFE 5E0E868D
ssb  cv25519/C9310F81D77519BC
     created: 2023-07-04  expires: never       usage: R
[ultimate] (1). Main Key <main@example.com>

Выберите подключ для отзыва с помощью key N. Выбранный подключ помечается звездочкой:

gpg> key 2

sec  ed25519/7963A4CD00C947CE
     created: 2023-07-04  expires: never       usage: SC
     card-no: FFFE 5E0E868D
     trust: ultimate      validity: ultimate
ssb  ed25519/34E35A6897DFABFD
     created: 2023-07-04  expires: never       usage: A
     card-no: FFFE 5E0E868D
ssb  cv25519/D75708BAF0CD49C8
     created: 2023-07-04  expires: never       usage: E
     card-no: FFFE 5E0E868D
ssb* cv25519/C9310F81D77519BC
     created: 2023-07-04  expires: never       usage: R
[ultimate] (1). Main Key <main@example.com>

Отозвать подключ с помощью revkey, а затем сохранить изменения с помощью save:

gpg> revkey
Do you really want to revoke this subkey? (y/N) y
Please select the reason for the revocation:
  0 = No reason specified
  1 = Key has been compromised
  2 = Key is superseded
  3 = Key is no longer used
  Q = Cancel
Your decision? 0
Enter an optional description; end it with an empty line:
>
Reason for revocation: No reason specified
(No description given)
Is this okay? (y/N) y


sec  ed25519/7963A4CD00C947CE
     created: 2023-07-04  expires: never       usage: SC
     card-no: FFFE 5E0E868D
     trust: ultimate      validity: ultimate
ssb  ed25519/34E35A6897DFABFD
     created: 2023-07-04  expires: never       usage: A
     card-no: FFFE 5E0E868D
ssb  cv25519/D75708BAF0CD49C8
     created: 2023-07-04  expires: never       usage: E
     card-no: FFFE 5E0E868D
ssb  cv25519/C9310F81D77519BC
     created: 2023-07-04  revoked: 2023-07-04  usage: R
[ultimate] (1). Main Key <main@example.com>

gpg> save

Теперь распространите обновленный открытый ключ.

Примечание

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