Yderligere dekrypteringsundernøgler (ADSK) med GnuPG#

Additional Decryption Subkeys (ADSK) kan bruges til automatisk at tilføje modtagere, når man krypterer en besked med GnuPG. Typiske brugstilfælde omfatter

  • at have en enkelt krypteringsnøgle til en gruppe uden at skulle dele den private nøgle mellem gruppens medlemmer,

  • tilføje en backup-nøgle til en krypteringsnøgle, og

  • oprette en hovednøgle, der kan dekryptere meddelelser for andre nøgler.

Bemærk

For at konfigurere en ADSK skal du bruge GnuPG 2.4.1 eller nyere. For at kryptere en besked til en nøgle med en ADSK, skal du bruge GnuPG 2.2.42 eller nyere.

Oversigt#

Denne vejledning forklarer, hvordan man tilføjer en backup-nøgle (bruger-ID backup@example.com) som en ADSK til en hovednøgle (bruger-ID main@example.com). Begge nøgler er gemt på en Nitrokey. De samme trin kan bruges til at tilføje flere ADSK til en nøgle, eller til at tilføje den samme nøgle som en ADSK til flere andre nøgler.

Klargøring af nøglerne#

Følg en af disse vejledninger for at generere de to nøgler:

Sørg for, at du kan liste begge nøgler med gpg --list-keys, for eksempel:

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

Tilføjelse af en ADSK#

Find først fingeraftrykket af krypteringsundernøglen til backupnøglen:

$ 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

Kig efter den linje, der starter med sub, og som indeholder bogstavet E, der angiver en undernøgle med krypteringsfunktion. Fingeraftrykket for denne undernøgle er angivet i den næste linje. I dette tilfælde er fingeraftrykket C1735CB29890EEDEABCF1D0DC9310F81D77519BC.

Find derefter hovednøglens fingeraftryk:

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

Du kan finde den i den næste linje efter pub, i dette tilfælde 55BC284C1D30D97638DA4A2C7963A4CD00C947CE.

Nu kan du tilføje ADSK ved hjælp af --quick-add-adsk flag:

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

Det første argument er hovednøglens fingeraftryk. Det andet argument er fingeraftrykket af krypteringsundernøglen til backupnøglen.

Du kan kontrollere, at ADSK er blevet oprettet:

$ 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

Undernøglen med R (restricted) capability er ADSK. Den har det samme fingeraftryk som krypteringsundernøglen til backupnøglen.

Nu kan du distribuere den offentlige nøgle med ADSK.

Brug af en ADSK#

Når du krypterer en besked til hovednøglen, tilføjes backupnøglen nu automatisk som modtager. De eneste krav til dette er:

  • Afsenderen af meddelelsen har en opdateret offentlig nøgle, der indeholder ADSK.

  • Afsenderen af meddelelsen bruger GnuPG 2.2.42 eller nyere.

Hvis du tilføjer --verbose flag, kan du tjekke de nøgler, beskeden er krypteret til:

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

Du kan også bruge --list-packets optionen til at tjekke en krypteret besked:

$ 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

Hver pubkey enc packet linje repræsenterer en nøgle, der kan dekryptere beskeden.

Tilbagekaldelse af en ADSK#

Hvis du tilbagekalder en ADSK, vil den ikke længere blive tilføjet som modtager, når du krypterer en besked. For at udføre en tilbagekaldelse skal du åbne nøglen med 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>

Vælg den undernøgle, der skal tilbagekaldes, med key N. Den valgte undernøgle er markeret med en asterisk:

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>

Tilbagekald undernøglen med revkey og gem derefter ændringerne med 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

Distribuer nu den opdaterede offentlige nøgle.

Bemærk

Tilbagekaldelsen træder først i kraft, når afsenderen har opdateret den offentlige nøgle med den tilbagekaldte ADSK. Beskeder, der allerede er blevet krypteret, kan stadig dekrypteres med ADSK’en, selvom den er tilbagekaldt.