Dodatkowe podklucze deszyfrujące (ADSK) z GnuPG#

Dodatkowe podklucze deszyfrujące (ADSK) mogą być używane do automatycznego dodawania odbiorców podczas szyfrowania wiadomości za pomocą GnuPG. Typowe przypadki użycia obejmują

  • posiadanie pojedynczego klucza szyfrowania dla grupy bez konieczności współdzielenia klucza prywatnego między członkami grupy,

  • dodanie klucza zapasowego do klucza szyfrowania, oraz

  • ustawienie klucza głównego, który może odszyfrowywać wiadomości dla innych kluczy.

Informacja

Aby skonfigurować ADSK, potrzebny jest GnuPG 2.4.1 lub nowszy. Aby zaszyfrować wiadomość dla klucza z ADSK, potrzebujesz GnuPG 2.2.42 lub nowszego.

Przegląd#

Ten przewodnik wyjaśnia, jak dodać klucz zapasowy (ID użytkownika backup@example.com) jako ADSK do klucza głównego (ID użytkownika main@example.com). Oba klucze są przechowywane na Nitrokey. Te same kroki mogą być użyte do dodania wielu ADSK do klucza lub do dodania tego samego klucza jako ADSK do wielu innych kluczy.

Przygotowanie kluczy#

Postępuj zgodnie z jednym z tych przewodników, aby wygenerować dwa klucze:

  • doc:openpgp-keygen-backup

  • doc:openpgp-keygen-on-device

  • doc:openpgp-keygen-gpa

Upewnij się, że możesz wymienić oba klucze za pomocą gpg --list-keys, na przykład:

$ 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]

Dodawanie ADSK#

Najpierw określ odcisk palca podklucza szyfrowania dla klucza zapasowego:

$ 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

Poszukaj linii zaczynającej się od sub, która zawiera literę E, wskazując podklucz z możliwością szyfrowania. Odcisk palca tego podklucza jest wymieniony w następnej linii. W tym przypadku odcisk palca to C1735CB29890EEDEABCF1D0DC9310F81D77519BC.

Następnie określ odcisk palca klucza głównego:

$ 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]

Można go znaleźć w następnej linii po pub, w tym przypadku 55BC284C1D30D97638DA4A2C7963A4CD00C947CE.

Teraz można dodać ADSK za pomocą flagi --quick-add-adsk:

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

Pierwszy argument to odcisk palca klucza głównego. Drugi argument to odcisk palca podklucza szyfrowania klucza zapasowego.

Możesz sprawdzić, czy ADSK został utworzony:

$ 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

Podklucz z możliwością R (ograniczoną) to ADSK. Ma taki sam odcisk palca jak podklucz szyfrowania klucza zapasowego.

Teraz można rozpowszechniać klucz publiczny za pomocą ADSK.

Korzystanie z ADSK#

Podczas szyfrowania wiadomości dla klucza głównego, klucz zapasowy jest teraz automatycznie dodawany jako odbiorca. Jedynymi wymaganiami są:

  • Nadawca wiadomości posiada aktualny klucz publiczny, który zawiera ADSK.

  • Nadawca wiadomości używa GnuPG w wersji 2.2.42 lub nowszej.

Jeśli dodasz flagę --verbose, możesz sprawdzić klucze, którymi zaszyfrowana jest wiadomość:

$ 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>"

Można również użyć opcji --list-packets, aby sprawdzić zaszyfrowaną wiadomość:

$ 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

Każda linia pubkey enc packet reprezentuje jeden klucz, który może odszyfrować wiadomość.

Cofnięcie ADSK#

Po odwołaniu klucza ADSK nie będzie on już dodawany jako odbiorca podczas szyfrowania wiadomości. Aby odwołać klucz, otwórz go za pomocą 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>

Wybierz podklucz do odwołania za pomocą key N. Wybrany podklucz jest oznaczony gwiazdką:

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>

Wycofaj podklucz za pomocą revkey, a następnie zapisz zmiany za pomocą 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

Teraz rozpowszechnij zaktualizowany klucz publiczny.

Informacja

Odwołanie stanie się skuteczne dopiero po zaktualizowaniu przez nadawcę klucza publicznego o odwołany ADSK. Wiadomości, które zostały już zaszyfrowane, mogą być nadal odszyfrowywane za pomocą ADSK, nawet jeśli został on odwołany.