🗝

新しい YubiKey に GPG 副鍵を転送しました

2022/04/22に公開

はじめに

2 年くらい前から YubiKey 5C と言う物理セキュリティキーを使用しています。主に自宅や会社の Mac に挿して FIDO と OpenPGP に使用しており、とてもとても快適です。

https://www.yubico.com/products/yubikey-5-overview/

しばらく YubiKey 5C という USB-C 接続のキー 1 本で過ごしてきたのですが、

  • 最近 iPhone から FIDO したいケースが増えてきている
  • たまにリアル出社する際に YubiKey を忘れることがある
  • そもそもスペアキーがないのも不安かも

ということで、YubiKey 5 NFC というモデルを買い足しました。まぁ最も汎用的であろう USB-A 接続に加えて、NFC からの利用が可能なモデルです。iPhone から NFC で FIDO するのは、なかなか良いです。

さて、FIDO 利用に関しては特に(キー自体の)セットアップは要らないので簡単なのですが、OpenPGP については少し設定が必要です。今回は、すでに作成済みの副鍵(秘密鍵)を新しい YubiKey に転送しましたので、その備忘録です。

以下、macOS 上で GnuPG を利用している前提となります。

KDF の有効化と PIN の設定

YubiKey に秘密鍵を転送する前に、まずは保存した秘密鍵にアクセスする際に使用する PIN の設定を行っていきます。

KDF の有効化

ファームウェアバージョン 5.2.3 から Key Derived Format と言うものに対応しているので、まずはそれの有効化を行います。

ファームウェアバージョンの確認方法

ykman と言うコマンドラインツール(Homebrew でインストール可能)で確認します。

$ ykman info
Device type: YubiKey 5 NFC
Serial number: XXXXXXXX
Firmware version: 5.4.3
Form factor: Keychain (USB-A)
Enabled USB interfaces: OTP, FIDO, CCID
NFC transport is enabled.

Applications	USB    	NFC
FIDO2       	Enabled	Enabled
OTP         	Enabled	Enabled
FIDO U2F    	Enabled	Enabled
OATH        	Enabled	Enabled
YubiHSM Auth	Enabled	Enabled
OpenPGP     	Enabled	Enabled
PIV         	Enabled	Enabled

Key Derived Format を有効化すると、YubiKey 内に保存される PIN の値 および GnuPG と YubiKey との間でやり取りされる PIN の値が、ハッシュ化される様[1]です。いちおう設定しておいた方がよさそうですね。

設定は gpg コマンド内で行います。

$ gpg --edit-card
gpg/card> admin
gpg/card> kdf-setup

デフォルトの PIN の値は、以下の様になっていますので、必要に応じて入力しましょう。

PIN: 123456
Admin PIN: 12345678

PIN の設定

KDF の有効化ができたら、続けて PIN の変更をしていきます。

gpg/card> passwd
gpg: OpenPGP card no. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX detected

1 - change PIN
2 - unblock PIN
3 - change Admin PIN
4 - set the Reset Code
Q - quit

Your selection?

こんな感じで対話型で聞かれますので、PIN と Admin PIN をそれぞれ設定していきます。

その他の情報の設定

ここは任意ですが、ついでなのでいくつかの情報も設定してしまいましょう。こんな感じ。

gpg/card> name
Cardholder's surname: FGHIJ
Cardholder's given name: Abcde

gpg/card> lang
Language preferences: en

gpg/card> login
Login data (account name): abc@example.com

副鍵秘密鍵の転送

YubiKey 側の準備が出来たので、秘密鍵の転送をしていきます。万が一でも漏れると面倒なので、秘密鍵を扱う際は全てのネットワーク接続を OFF にしておきます。インターネットに繋がっていないなんて、逆にドキドキしますね。

マスターキー環境の構築

まずは、通常使っている GnuPG の環境とは別のテンポラリーな環境に、主鍵・副鍵の秘密鍵を取り込んだマスターキー環境を構築します。私の場合は、最初に主鍵・副鍵を作成した時の内容を SD カードの様なものに保存しているので、そこから鍵を取り込みます。伏字。

$ export GNUPGHOME=$(mktemp -d)

$ gpg --import /Volumes/GPGKEYS/xxxx.mas.key
gpg: keybox '/var/folders/xx/_xxxx/T/tmp.xxxxxxxx/pubring.kbx' created
gpg: /var/folders/xx/_xxxx/T/tmp.xxxxxxxx/trustdb.gpg: trustdb created
gpg: key CCCCCCCCCCCCCCCC: public key "Abcde FGHIJ <abc@example.com>" imported
gpg: key CCCCCCCCCCCCCCCC: secret key imported
gpg: Total number processed: 1
gpg:               imported: 1
gpg:       secret keys read: 1
gpg:   secret keys imported: 1

$ gpg -K
/var/folders/xx/_xxxx/T/tmp.xxxxxxxx/pubring.kbx
-------------------------------------------------------------------------
sec   rsa4096/0xCCCCCCCCCCCCCCCC 2020-06-07 [C]
      Key fingerprint = XXXX XXXX XXXX XXXX XXXX  XXXX XXXX XXXX XXXX XXXX
uid                   [ unknown] Abcde FGHIJ <abc@example.com>
ssb   rsa4096/0xSSSSSSSSSSSSSSSS 2020-06-07 [S] [expires: 2022-12-31]
ssb   rsa4096/0xEEEEEEEEEEEEEEEE 2020-06-07 [E] [expires: 2022-12-31]
ssb   rsa4096/0xAAAAAAAAAAAAAAAA 2020-06-07 [A] [expires: 2022-12-31]

全ての秘密鍵が取り込まれているのが確認できます。

副鍵秘密鍵の転送

続けて、副鍵秘密鍵の転送をしていきます。gpg --edit-key で GnuPG に入ります。

$ gpg --edit-key CCCCCCCCCCCCCCCC
gpg (GnuPG) 2.3.4; Copyright (C) 2021 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Secret key is available.

sec  rsa4096/0xCCCCCCCCCCCCCCCC
     created: 2020-06-07  expires: never       usage: C
     trust: unknown       validity: unknown
ssb  rsa4096/0xSSSSSSSSSSSSSSSS
     created: 2020-06-07  expires: 2022-12-31  usage: S
ssb  rsa4096/0xEEEEEEEEEEEEEEEE
     created: 2020-06-07  expires: 2022-12-31  usage: E
ssb  rsa4096/0xAAAAAAAAAAAAAAAA
     created: 2020-06-07  expires: 2022-12-31  usage: A
[ unknown] (1). Abcde FGHIJ <abc@example.com>

key n とすると指定した副鍵の選択状態がトグルします。選択された副鍵には * マークが付きますので、転送したい副鍵を選択した状態で keytocard します。選択した副鍵と同じ役割を持ったスロットに転送しましょう。

gpg> key 1

sec  rsa4096/0xCCCCCCCCCCCCCCCC
     created: 2020-06-07  expires: never       usage: C
     trust: unknown       validity: unknown
ssb* rsa4096/0xSSSSSSSSSSSSSSSS
     created: 2020-06-07  expires: 2022-12-31  usage: S
ssb  rsa4096/0xEEEEEEEEEEEEEEEE
     created: 2020-06-07  expires: 2022-12-31  usage: E
ssb  rsa4096/0xAAAAAAAAAAAAAAAA
     created: 2020-06-07  expires: 2022-12-31  usage: A
[ unknown] (1). Abcde FGHIJ <abc@example.com>

gpg> keytocard
Please select where to store the key:
   (1) Signature key
   (3) Authentication key
Your selection? 1

sec  rsa4096/0xCCCCCCCCCCCCCCCC
     created: 2020-06-07  expires: never       usage: C
     trust: unknown       validity: unknown
ssb* rsa4096/0xSSSSSSSSSSSSSSSS
     created: 2020-06-07  expires: 2022-12-31  usage: S
ssb  rsa4096/0xEEEEEEEEEEEEEEEE
     created: 2020-06-07  expires: 2022-12-31  usage: E
ssb  rsa4096/0xAAAAAAAAAAAAAAAA
     created: 2020-06-07  expires: 2022-12-31  usage: A
[ unknown] (1). Abcde FGHIJ <abc@example.com>

gpg> key 1

sec  rsa4096/0xCCCCCCCCCCCCCCCC
     created: 2020-06-07  expires: never       usage: C
     trust: unknown       validity: unknown
ssb  rsa4096/0xSSSSSSSSSSSSSSSS
     created: 2020-06-07  expires: 2022-12-31  usage: S
ssb  rsa4096/0xEEEEEEEEEEEEEEEE
     created: 2020-06-07  expires: 2022-12-31  usage: E
ssb  rsa4096/0xAAAAAAAAAAAAAAAA
     created: 2020-06-07  expires: 2022-12-31  usage: A
[ unknown] (1). Abcde FGHIJ <abc@example.com>

副鍵の選択はトグルなので、一度選択解除をした上で次の副鍵へ進んでいき、3 つとも転送したら完了です。テンポラリー環境なので、保存はしてもしなくても一緒です。終わったら Mac を再起動して、テンポラリー環境が消えているのを確認してから、ネットワーク接続を ON に戻します。

おわりに

これで、新しい YubiKey にも今までと同じ副鍵秘密鍵が格納されました。意外とあっさり。使い分けも、その場で手元にある方の YubiKey を挿しておけば良いので、楽チンです。もっと早く買えばよかった。

脚注
  1. Functional Specification of the OpenPGP application の 4.3.2 Key derived format 参照 ↩︎

Discussion