2025/04/29 23:04 : FreeBSDでYubiKeyを使ってOpenPGPする
FreeBSD+GnuPG+YubiKeyで、OpenPGPした。
初期設定をちょこっとしてあげれば、あとはちゃんと動く。
楕円曲線暗号(EC)も使えた。
更新履歴
2025/04/30 20:59更新: fingerprintを鍵IDと誤って記載していたので修正。
材料
- FreeBSD 14.2-RELEASE
- GnuPG 2.4.7
- YubiKey 5C NFC
参考にさせていただいたもの
- mitome.in
- Using Your YubiKey with OpenPGP
- Setting up yubikey/solo2 for piv, fido, and gpg on FreeBSD (Firefox, Chromium, PAM, SSH, and GnuPG)
(FreeBSD GnuPG with Smartcard/Yubikeyのセクションを主に参照)
はじめる前に
本稿は初心者向けではない。FreeBSDという、世間的には珍しい環境でOpenPGP/GnuPGとYubiKeyを使うという、かなり特殊と思われるパターンを実行した "記録" である。
YubiKeyのPIN/PUKは予め設定しておく、秘密鍵の扱いには注意するなど、それぞれの要素における「基本」は説明しないが、注意されたい。
メモを取りながら実験した記録をあとから書き起こしている。正直しんどいのでちゃんと整理していないが、ご容赦願いたい。
インストール
今回は新しくFreeBSD 14.2-RELEASEをインストールし、pkgで必要なパッケージをインストールした。
# pkg install -g pcsc-lite ccid gnupg u2f-devd py311-yubikey-manager
インストール後の初期設定は以下の通り。
ほぼGistの内容そのままだが、追加でpcscd_flagsの設定が必要だった。
loader.conf:
hidraw_load="YES"
~/.gnupg/scdaemon.conf:
pcsc-shared disable-ccid
# pw group mod u2f -m <user> # sysrc pcscd_enable=YES pcscd_flags=--disable-polkit
設定したら再起動する。
非特権ユーザで ykman info
、ykman openpgp info
、gpg --card-status
を実行して、それっぽい出力が得られればOK。
ネットワークから切断
ここからはネットワークを切断して、エアギャップ環境とする。
鍵対を作ったら、もう二度とこのPCはネットワークに接続してはならない。
鍵対の作成
OpenPGPで鍵対を作る。
YubiKeyはFirmware 5.2.3以降でcurve25519をサポートしている。Curve 448などはサポートされておらず、YubiKeyへの移動でコケるので注意すること。
心配ならRSA 4096bitなどを利用してもよい。
$ gpg --full-gen --expert (以下、必要な部分を除いて省略している) Please select what kind of key you want: (9) ECC (sign and encrypt) *default* Please select which elliptic curve you want: (1) Curve 25519 *default*
ほかは聞かれた通りに進めればよい。
生成が終わったら、好きな方法で ~/.gnupg
をバックアップしておく。
$ tar -Jcf gnupg.tar.xz .gnupg && chmod 400 gnupg.tar.xz
鍵をYubiKeyに書き込む
gnupg --list-key
でfingerprintを確認してから、gnupg --edit-key <fingerprint>
で起動する。
まず keytocard
と打ち、sign key(1)を書き込む。
ここでYubiKeyのAdmin PIN(=PUK)を問われるので入力する。2回連続で問われるので、2回とも同じものを入力すればいい。なお、鍵対生成時に対応していないアルゴリズムを選んでいると、ここでInvalid valueなどと言われる。
続けて keytocard
と打ち、authentication key(3)を書き込む。
最後に key 1
と打ち、さらに keytocard
と打ち、encryption key(2)を書き込む。
quit
と打ち、保存するかと聞かれたら n(o)
と答え、保存せずに終了するかと問われたらy(es)
と答える。
ここで保存すると、ローカルの鍵が消えてしまうので注意する。 必要なら別のYubiKeyを接続して、必要なだけ書き込む。
公開鍵をコピーする
$ gnupg --export <fingerprint> > pubkey.bin
このファイルはUSBメモリ等に入れておいて、別の環境(エアギャップ環境の外)にもっていく。
エアギャップ環境での操作はここまで。 syncしてshutdownしておこう。 この先は適当なPCで作業を続ける。
公開鍵をインポートする
$ gpg --import < pubkey.bin
インポートした鍵を「絶対的に信頼」とする。
gpg --list-key
でfingerprintを確認してから、以下を実行する。
$ gpg --edit-key <fingerprint> gpg> trust (...snip...) Your decision? 5 gpg> quit
YubiKeyを挿して、gpg --card-status
でチェックする。
$ gpg --card-status Reader ...........: Yubico YubiKey FIDO CCID 00 00 (...snip...) Signature key ....: **** **** **** **** **** **** **** **** **** **** created ....: 2025-04-29 **:**:** Encryption key....: **** **** **** **** **** **** **** **** **** **** created ....: 2025-04-29 **:**:** Authentication key: **** **** **** **** **** **** **** **** **** **** created ....: 2025-04-29 **:**:** General key info..: pub ed25519/**************** 2025-04-29 2510sec> ed25519/**************** created: 2025-04-29 expires: 2027-04-29 card-no: **** ******** ssb> cv25519/**************** created: 2025-04-29 expires: 2027-04-29 card-no: **** ********
この状態でsecret key一覧を見ると、鍵がYubiKey上にあると認識できている。
$ gpg --list-secret-keys /home/2510/.gnupg/pubring.kbx ----------------------------- sec> ed25519 2025-04-29 [SC] [expires: 2027-04-29] **************************************** Card serial no. = **** ******** uid [ultimate] 2510ssb> cv25519 2025-04-29 [E] [expires: 2027-04-29]
この状態になれば、あとは通常の使い方ができる。
詳しくは mitome.in さんの 公開鍵の公開や、公開鍵のインポートと署名あたりを参考にするとよい。