GnuPGでの追加復号サブキー(ADSK)

`Additional Decryption Subkeys (ADSK)<https://gnupg.org/blog/20230321-adsk.html>`__ GnuPGでメッセージを暗号化する際に、受信者を自動的に追加するために使用することができます。典型的な使用例

  • グループのメンバー間で秘密鍵を共有する必要がなく、グループ用に単一の暗号鍵を持つ、

  • 暗号化キーにバックアップ・キーを追加するステップと

  • 他の鍵のメッセージを解読できるマスター・キーを設定する。

注釈

ADSKを設定するには、GnuPG 2.4.1以降が必要である。ADSKで鍵のメッセージを暗号化するには、GnuPG 2.2.42以降が必要です。

概要

このガイドでは、メインキー(ユーザーID` 「main@example.com``」)にADSKとしてバックアップキー(ユーザーID` 「backup@example.com``」)を追加する方法を説明します。どちらの鍵もNitrokeyに保存されます。同じ手順で複数のADSKを1つの鍵に追加したり、同じ鍵をADSKとして他の複数の鍵に追加することができる。

キーの準備

以下のいずれかのガイドに従って、2つのキーを生成する:

  • doc:openpgp-keygen-backup

  • doc:openpgp-keygen-on-device

  • doc:openpgp-keygen-gpa

両方のキーを``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`` にあります。

これで、--quick-add-adsk フラグを使ってADSKを追加することができる:

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

最初の引数はメイン鍵のフィンガープリントである。第2引数はバックアップ鍵の暗号化サブキーのフィンガープリントである。

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 の各行は、メッセージを復号化できる1つの鍵を表す。

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が失効しても、そのADSKで復号化できる。