りんけーじ - blog

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

参考にさせていただいたもの

はじめる前に

本稿は初心者向けではない。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 infoykman openpgp infogpg --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 2510 
sec>  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] 2510 
ssb>  cv25519 2025-04-29 [E] [expires: 2027-04-29]

この状態になれば、あとは通常の使い方ができる。

詳しくは mitome.in さんの 公開鍵の公開や、公開鍵のインポートと署名あたりを参考にするとよい。