YubiKey 5 NFC にて PGP key を取り込む



2019年に書いていたものであり、現時点(May, 2022)において内容が古くなっているかもしれない。
なお、文中の各種ID,Keyなどは実際に表示されたものを編集していることを記しておく。


YubiKey 5 NFCを購入した。PGPの鍵を入れておけるとあったので、実際に試した結果を記載した。
OSは、macOS Mojave、ハードは、MacBook Proである。


<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2520265/28e5a0a8-8521-5471-c43a-2a0cf71de9f4.jpeg" width="200">



最初に、
https://support.yubico.com/support/solutions/articles/15000006420-using-your-yubikey-with-openpgp
を読んだのだが、必要もないのに”Insert the YubiKey into the USB port.”との記述が散見される。
そのため、ちょっと信頼できないと感じた。

そこで、文献探し。

開発者向けのドキュメントがあった。以降、この手順に従い作業を行った記録である。
https://developers.yubico.com/PGP/Importing_keys.html


## 準備

1. ykmanコマンドをインストールしておく。
macOS なので、Homebrewにてインストールする。

以下、HomeBrewにてインストールされた状態から開始する。

```
$ which ykman
/usr/local/bin/ykman
```

2. PGPにて事前にPGPの鍵作成をしておくこと。

注意事項としては、キー長を 2048としておくこと。


## ドキュメントのとおり作業


>1. Introduction
>
>This is a short description of how to import an already existing PGP key to a YubiKey with PGP >support.
>
>2. Prerequisites
>For this procedure to work you must have GnuPG version 2.0.22 or later installed on your >computer. The version of the YubiKey’s OpenPGP module must be 1.0.5 or later. To check this > >version you may run, after inserting your YubiKey:
>
>```
>$ gpg-connect-agent --hex "scd apdu 00 f1 00 00" /bye
>D[0000]  6D 00                                              m.
>OK
>```
>If you have an existing key you want to import, that key must be a RSA 2048 bit key.
>
>You’ll also need the YubiKey’s Admin PIN.


「RSA 2048 bit key.」とある。


>3. Generate a key
>

https://gpgtools.org/ にてインストールしているので、
GPG Keychainにて鍵を作成した。

>Take note of the id of the key, in this case 13AFCE85.

GPG Keychain にて作成した鍵のIDを調べる。
以下、「555ABC55」とする。

>Add an authentication key
>Here we will add an authentication key to the previously generated key.

コマンド
```
gpg --expert --edit-key 555ABC55
```

実行結果
```
$ gpg --expert --edit-key 555ABC55
gpg (GnuPG/MacGPG2) 2.2.17; Copyright (C) 2019 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.

秘密鍵が利用できます。

sec  rsa2048/FFFFFFFF555ABC55
     作成: 2019-09-10  有効期限: 無期限      利用法: SC
     信用: 究極        有効性: 究極
ssb  rsa2048/8E22D98EH3B2A105
     作成: 2019-09-10  有効期限: 無期限      利用法: E
[  究極  ] (1). Foo Bar <foobar@sample.org>

gpg>

```

addkeyをする。

```
gpg> addkey
ご希望の鍵の種類を選択してください:
   (3) DSA (署名のみ)
   (4) RSA (署名のみ)
   (5) Elgamal (暗号化のみ)
   (6) RSA (暗号化のみ)
   (7) DSA (機能をあなた自身で設定)
   (8) RSA (機能をあなた自身で設定)
  (10) ECC (署名のみ)
  (11) ECC (機能をあなた自身で設定)
  (12) ECC (暗号化のみ)
  (13) 既存の鍵
あなたの選択は? 8

鍵RSAに認められた操作: Sign Encrypt Authenticate
現在の認められた操作: Sign Encrypt

   (S) 署名機能を反転する
   (E) 暗号機能を反転する
   (A) 認証機能を反転する
   (Q) 完了

あなたの選択は? A

鍵RSAに認められた操作: Sign Encrypt Authenticate
現在の認められた操作: Sign Encrypt Authenticate

   (S) 署名機能を反転する
   (E) 暗号機能を反転する
   (A) 認証機能を反転する
   (Q) 完了

あなたの選択は? S

鍵RSAに認められた操作: Sign Encrypt Authenticate
現在の認められた操作: Encrypt Authenticate

   (S) 署名機能を反転する
   (E) 暗号機能を反転する
   (A) 認証機能を反転する
   (Q) 完了

あなたの選択は? E

鍵RSAに認められた操作: Sign Encrypt Authenticate
現在の認められた操作: Authenticate

   (S) 署名機能を反転する
   (E) 暗号機能を反転する
   (A) 認証機能を反転する
   (Q) 完了

あなたの選択は? Q
RSA 鍵は 1024 から 4096 ビットの長さで可能です。
鍵長は? (2048)
要求された鍵長は2048ビット
鍵の有効期限を指定してください。
         0 = 鍵は無期限
      <n>  = 鍵は n 日間で期限切れ
      <n>w = 鍵は n 週間で期限切れ
      <n>m = 鍵は n か月間で期限切れ
      <n>y = 鍵は n 年間で期限切れ
鍵の有効期間は? (0)
鍵は無期限です
これで正しいですか? (y/N) y
本当に作成しますか? (y/N) y
たくさんのランダム・バイトの生成が必要です。キーボードを打つ、マウスを動か
す、ディスクにアクセスするなどの他の操作を素数生成の間に行うことで、乱数生
成器に十分なエントロピーを供給する機会を与えることができます。
```

**ここでパスフレーズ入力**

```
sec  rsa2048/FFFFFFFF555ABC55
     作成: 2019-09-10  有効期限: 無期限      利用法: SC
     信用: 究極        有効性: 究極
ssb  rsa2048/8E22D98EH3B2A105
     作成: 2019-09-10  有効期限: 無期限      利用法: E
ssb  rsa2048/427E7CD60E72F115
     作成: 2019-09-10  有効期限: 無期限      利用法: A
[  究極  ] (1). Foo Bar <foobar@sample.org>

gpg>
```

>Backup
>This is a good point to create a backup of your key.

バックアップを行う。

```
$ gpg --export-secret-key --armor 555ABC55 > gpg-private-key.asc
$ ls -l gpg-private-key.asc
-rw-r--r--  1 foo  staff  5387  9 10 23:33 gpg-private-key.asc
$ chmod og-r gpg-private-key.asc
$ ls -l gpg-private-key.asc
-rw-------  1 foo  staff  5387  9 10 23:33 gpg-private-key.asc
$
```
Make sure to store the backup offline in a secure place.



> Reset openpgp

ykmanコマンドを用いてカード側をリセットする。
（初期PINなどを明示的に説明するため。初期PIN,Admin PINがわかっている場合は不要)

ykmanコマンドにてカードをリセットする。PGPに関するもののみであり、**YubiKey 5 NFC全体を初期化するわけではない。**

```
$ ykman openpgp reset
WARNING! This will delete all stored OpenPGP keys and data and restore factory settings? [y/N]: y
Resetting OpenPGP data, don't remove your YubiKey...
Success! All data has been cleared and default PINs are set.
PIN:         123456
Reset code:  NOT SET
Admin PIN:   12345678
$
```

初期PIN,Admin PINが表示されるので、これを変更する。

```
$ gpg --card-status
Reader ...........: Yubico Yubikey 4 OTP U2F CCID
Application ID ...: E1234001234123020004568764560000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 12345678
Name of cardholder: [未設定]
Language prefs ...: [未設定]
Sex ..............: 無指定
URL of public key : [未設定]
Login data .......: [未設定]
Signature PIN ....: 強制なし
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]
$
```

管理者モードへ。

```
gpg/card> admin
管理者コマンドが許可されています
```

PINとAdmin PINを変更する。
以下は、PINのみ変更

```
gpg/card> passwd
gpg: OpenPGPカードno. E1234001234123020004568764560000を検出

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

あなたの選択は? 3
PIN changed.

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

あなたの選択は? 1
PIN changed.

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

あなたの選択は? q
```

カードの所有者名を書いてみる。

```
gpg/card> name
カード所有者の姓 (surname): foo
カード所有者の名 (given name): bar

gpg/card> sex
性別 ((M)男、(F)女、または空白): M

gpg/card> quit
```


このとおり。

```
$ gpg --card-status
Reader ...........: Yubico Yubikey 4 OTP U2F CCID
Application ID ...: E1234001234123020004568764560000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 12345678
Name of cardholder: Foo Bar
Language prefs ...: [未設定]
Sex ..............: 男
URL of public key : [未設定]
Login data .......: [未設定]
Signature PIN ....: 強制なし
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: [none]
Encryption key....: [none]
Authentication key: [none]
General key info..: [none]
$
```


>Importing the key
>Now it’s time to import the key into the YubiKey.


インポートする。


```
$ gpg --edit-key 555ABC55
gpg (GnuPG/MacGPG2) 2.2.17; Copyright (C) 2019 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.

秘密鍵が利用できます。

sec  rsa2048/FFFFFFFF555ABC55
     作成: 2019-09-10  有効期限: 無期限      利用法: SC
     信用: 究極        有効性: 究極
ssb  rsa2048/8E22D98EH3B2A105
     作成: 2019-09-10  有効期限: 無期限      利用法: E
ssb  rsa2048/427E7CD60E72F115
     作成: 2019-09-10  有効期限: 無期限      利用法: A
[  究極  ] (1). Foo Bar <foobar@sample.org>

gpg> toggle

sec  rsa2048/FFFFFFFF555ABC55
     作成: 2019-09-10  有効期限: 無期限      利用法: SC
     信用: 究極        有効性: 究極
ssb  rsa2048/8E22D98EH3B2A105
     作成: 2019-09-10  有効期限: 無期限      利用法: E
ssb  rsa2048/427E7CD60E72F115
     作成: 2019-09-10  有効期限: 無期限      利用法: A
[  究極  ] (1). Foo Bar <foobar@sample.org>

gpg> keytocard
この主鍵を本当に移動しますか? (y/N) y
鍵を保管する場所を選択してください:
   (1) 署名鍵
   (3) 認証鍵
あなたの選択は? 1

sec  rsa2048/FFFFFFFF555ABC55
     作成: 2019-09-10  有効期限: 無期限      利用法: SC
     信用: 究極        有効性: 究極
ssb  rsa2048/8E22D98EH3B2A105
     作成: 2019-09-10  有効期限: 無期限      利用法: E
ssb  rsa2048/427E7CD60E72F115
     作成: 2019-09-10  有効期限: 無期限      利用法: A
[  究極  ] (1). Foo Bar <foobar@sample.org>

gpg> key 1

sec  rsa2048/FFFFFFFF555ABC55
     作成: 2019-09-10  有効期限: 無期限      利用法: SC
     信用: 究極        有効性: 究極
ssb* rsa2048/8E22D98EH3B2A105
     作成: 2019-09-10  有効期限: 無期限      利用法: E
ssb  rsa2048/427E7CD60E72F115
     作成: 2019-09-10  有効期限: 無期限      利用法: A
[  究極  ] (1). Foo Bar <foobar@sample.org>

gpg> keytocard
鍵を保管する場所を選択してください:
   (2) 暗号化鍵
あなたの選択は? 2

sec  rsa2048/FFFFFFFF555ABC55
     作成: 2019-09-10  有効期限: 無期限      利用法: SC
     信用: 究極        有効性: 究極
ssb* rsa2048/8E22D98EH3B2A105
     作成: 2019-09-10  有効期限: 無期限      利用法: E
ssb  rsa2048/427E7CD60E72F115
     作成: 2019-09-10  有効期限: 無期限      利用法: A
[  究極  ] (1). Foo Bar <foobar@sample.org>

gpg> key 1

sec  rsa2048/FFFFFFFF555ABC55
     作成: 2019-09-10  有効期限: 無期限      利用法: SC
     信用: 究極        有効性: 究極
ssb  rsa2048/8E22D98EH3B2A105
     作成: 2019-09-10  有効期限: 無期限      利用法: E
ssb  rsa2048/427E7CD60E72F115
     作成: 2019-09-10  有効期限: 無期限      利用法: A
[  究極  ] (1). Foo Bar <foobar@sample.org>

gpg> key 2

sec  rsa2048/FFFFFFFF555ABC55
     作成: 2019-09-10  有効期限: 無期限      利用法: SC
     信用: 究極        有効性: 究極
ssb  rsa2048/8E22D98EH3B2A105
     作成: 2019-09-10  有効期限: 無期限      利用法: E
ssb* rsa2048/427E7CD60E72F115
     作成: 2019-09-10  有効期限: 無期限      利用法: A
[  究極  ] (1). Foo Bar <foobar@sample.org>

gpg> keytocard
鍵を保管する場所を選択してください:
   (3) 認証鍵
あなたの選択は? 3

sec  rsa2048/FFFFFFFF555ABC55
     作成: 2019-09-10  有効期限: 無期限      利用法: SC
     信用: 究極        有効性: 究極
ssb  rsa2048/8E22D98EH3B2A105
     作成: 2019-09-10  有効期限: 無期限      利用法: E
ssb* rsa2048/427E7CD60E72F115
     作成: 2019-09-10  有効期限: 無期限      利用法: A
[  究極  ] (1). Foo Bar <foobar@sample.org>

gpg> quit
変更を保存しますか? (y/N) y
$
```


カード情報を見てみる。

```
$ gpg --card-status
Reader ...........: Yubico Yubikey 4 OTP U2F CCID
Application ID ...: E1234001234123020004568764560000
Version ..........: 2.1
Manufacturer .....: Yubico
Serial number ....: 12345678
Name of cardholder: Foo Bar
Language prefs ...: [未設定]
Sex ..............: 男
URL of public key : [未設定]
Login data .......: [未設定]
Signature PIN ....: 強制なし
Key attributes ...: rsa2048 rsa2048 rsa2048
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 0
Signature key ....: 804F 1263 FE1D 2416 BB23  97DA EE7B 3550 698B A9F6
      created ....: 2019-09-10 14:12:53
Encryption key....: A9E9 6A89 7133 33CE 10EE  77D9 4F55 F08C D4F3 D501
      created ....: 2019-09-10 14:12:53
Authentication key: 5FAF E251 2F2F 0323 FB57  050E 427E 7CD6 0E72 F115
      created ....: 2019-09-10 14:26:07
General key info..: pub  rsa2048/FFFFFFFF555ABC55 2019-09-10 Foo Bar <foobar@sample.org>
sec>  rsa2048/FFFFFFFF555ABC55  作成: 2019-09-10  有効期限: 無期限
                                カード番号: 0006 12345678
ssb>  rsa2048/8E22D98EH3B2A105  作成: 2019-09-10  有効期限: 無期限
                                カード番号: 0006 12345678
ssb>  rsa2048/427E7CD60E72F115  作成: 2019-09-10  有効期限: 無期限
                                カード番号: 0006 12345678
$
```