Sottochiavi di decrittazione aggiuntive (ADSK) con GnuPG#

Additional Decryption Subkeys (ADSK) può essere usato per aggiungere automaticamente dei destinatari quando si cripta un messaggio con GnuPG. I casi d’uso tipici includono

  • avere un’unica chiave di crittografia per un gruppo senza la necessità di condividere la chiave privata tra i membri del gruppo,

  • aggiungere una chiave di backup a una chiave di crittografia e

  • impostare una chiave principale in grado di decifrare i messaggi di altre chiavi.

Nota

Per configurare un ADSK, è necessario GnuPG 2.4.1 o più recente. Per crittografare un messaggio per una chiave con un ADSK, è necessario GnuPG 2.2.42 o più recente.

Panoramica#

Questa guida spiega come aggiungere una chiave di backup (ID utente backup@example.com) come ADSK a una chiave principale (ID utente main@example.com). Entrambe le chiavi sono memorizzate su una Nitrokey. Gli stessi passaggi possono essere utilizzati per aggiungere più ADSK a una chiave o per aggiungere la stessa chiave come ADSK a più chiavi.

Preparazione delle chiavi#

Seguite una di queste guide per generare le due chiavi:

Assicurarsi di poter elencare entrambe le chiavi con gpg --list-keys, ad esempio:

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

Aggiunta di un ADSK#

Determinare innanzitutto l’impronta digitale della sottochiave di crittografia per la chiave di backup:

$ 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

Cercare la riga che inizia con sub e che contiene la lettera E, che indica una sottochiave con capacità di crittografia. L’impronta digitale di questa sottochiave è elencata nella riga successiva. In questo caso, l’impronta digitale è C1735CB29890EEDEABCF1D0DC9310F81D77519BC.

Quindi determinare l’impronta digitale della chiave principale:

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

Si trova nella riga successiva a pub, in questo caso 55BC284C1D30D97638DA4A2C7963A4CD00C947CE.

Ora si può aggiungere l’ADSK usando il flag --quick-add-adsk:

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

Il primo argomento è l’impronta digitale della chiave principale. Il secondo argomento è l’impronta digitale della sottochiave di crittografia della chiave di backup.

È possibile verificare che l’ADSK sia stato creato:

$ 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

La sottochiave con la funzionalità R (limitata) è l’ADSK. Ha la stessa impronta digitale della sottochiave di crittografia della chiave di backup.

Ora è possibile distribuire la chiave pubblica con l’ADSK.

Utilizzo di un ADSK#

Quando si cripta un messaggio per la chiave principale, la chiave di backup viene ora aggiunta automaticamente come destinatario. Gli unici requisiti sono:

  • Il mittente del messaggio ha una chiave pubblica aggiornata che include l’ADSK.

  • Il mittente del messaggio utilizza GnuPG 2.2.42 o più recente.

Se si aggiunge il flag --verbose, è possibile controllare le chiavi con cui il messaggio è stato crittografato:

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

Si può anche usare l’opzione --list-packets per controllare un messaggio criptato:

$ 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

Ogni riga di pubkey enc packet rappresenta una chiave in grado di decifrare il messaggio.

Revoca di un ADSK#

Se si revoca un ADSK, questo non verrà più aggiunto come destinatario durante la crittografia di un messaggio. Per eseguire una revoca, aprire la chiave con 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>

Selezionare la sottochiave da revocare con key N. La sottochiave selezionata è contrassegnata da un asterisco:

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>

Revocare la sottochiave con revkey e quindi salvare le modifiche con 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

Ora distribuite la chiave pubblica aggiornata.

Nota

La revoca diventerà effettiva solo quando il mittente avrà aggiornato la chiave pubblica con l’ADSK revocato. I messaggi già crittografati possono essere decifrati con l’ADSK anche se questo viene revocato.