Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

YubikeyをGPGが認識しないときはlsusbして犯人を探すんじゃ

tl;dr

  • pcscdがうまくデバイスを掴めないとYubikeyをGPGが認識できない
  • systemctl status pcscdで様子を見よう
  • lsusblsofでUSBデバイスを使用中のプロセスを特定せよ
  • snapなどで起動したyubioath-desktopがUSBデバイスを奪っていることがある

あらすじ

gpg --card-statusしてもYubikeyが認識されない。

% gpg --card-status                                                                                                                                                          
gpg: selecting card failed: そのようなデバイスはありません
gpg: OpenPGPカードが利用できません: そのようなデバイスはありません

pcscd不調

Linuxのサービスとしてはpcscdがこの手のスマートカードのハンドリングを担っている。systemctlを利用してスマートカードが認識されているか確認する:

% systemctl status pcscd.service
● pcscd.service - PC/SC Smart Card Daemon
     Loaded: loaded (/usr/lib/systemd/system/pcscd.service; indirect; preset: disabled)
     Active: active (running) since Tue 2025-09-02 20:31:30 JST; 18h ago
 Invocation: 853067c0c5f1429d98242bce729e2b7e
TriggeredBy: ● pcscd.socket
       Docs: man:pcscd(8)
   Main PID: 5429 (pcscd)
      Tasks: 11 (limit: 76368)
        CPU: 339ms
     CGroup: /system.slice/pcscd.service
             └─5429 /usr/sbin/pcscd --foreground

 903 14:52:18 localhost.localdomain pcscd[5429]: 99999999 ../src/ccid_usb.c:740:OpenUSBByName() Can't claim interface 1/22: LIBUSB_ERROR_BUSY
 9月 03 14:52:18 localhost.localdomain pcscd[5429]: 00000295 ../src/ifdhandler.c:139:CreateChannelByNameOrChannel() failed
 9月 03 14:52:18 localhost.localdomain pcscd[5429]: 00000006 ../src/readerfactory.c:1144:RFInitializeReader() Open Port 0x200000 Failed (usb:1050/0407:libudev:2:/dev/bus/us>
 9月 03 14:52:18 localhost.localdomain pcscd[5429]: 00000003 ../src/readerfactory.c:371:RFAddReader() Yubico YubiKey OTP+FIDO+CCID init failed.
 9月 03 14:52:18 localhost.localdomain pcscd[5429]: 00000061 ../src/hotplug_libudev.c:527:HPAddDevice() Failed adding USB device: Yubico YubiKey OTP+FIDO+CCID
 9月 03 14:53:12 localhost.localdomain pcscd[5429]: 53225473 ../src/ccid_usb.c:740:OpenUSBByName() Can't claim interface 1/23: LIBUSB_ERROR_BUSY
 903 14:53:12 localhost.localdomain pcscd[5429]: 00000273 ../src/ifdhandler.c:139:CreateChannelByNameOrChannel() failed
 903 14:53:12 localhost.localdomain pcscd[5429]: 00000004 ../src/readerfactory.c:1144:RFInitializeReader() Open Port 0x200000 Failed (usb:1050/0407:libudev:2:/dev/bus/us>
 903 14:53:12 localhost.localdomain pcscd[5429]: 00000002 ../src/readerfactory.c:371:RFAddReader() Yubico YubiKey OTP+FIDO+CCID init failed.
 903 14:53:12 localhost.localdomain pcscd[5429]: 00000059 ../src/hotplug_libudev.c:527:HPAddDevice() Failed adding USB device: Yubico YubiKey OTP+FIDO+CCID

Can't claim interface 1/22: LIBUSB_ERROR_BUSYとある。このエラーはlibusbというUSBを扱うライブラリが、USBデバイスがビジーでデバイスを確保できなかったときに発生する。つまり、他のプロセスがこのデバイスを触ってるから利用できないよ、ということ。

デバイス探し

USBデバイスをどのプロセスが利用しているかを知るために、まず バスIDとデバイスIDを知る必要がある。USBでは個々のデバイスはバスIDとデバイスIDによって識別されるためだ。lsusbを実行するとこれらを得られる:

% lsusb
...
Bus 001 Device 020: ID 0499:170a Yamaha Corp. Steinberg UR12
...
Bus 001 Device 024: ID 1050:0407 Yubico.com Yubikey 4/5 OTP+U2F+CCID
...

すると、突き刺しているYubikeyがこのマシンではバスIDが001、デバイスIDが024であることが分かる。認識はされているが利用できていないということだ。

プロセス探し

Linuxにおいてはなんでもファイルなので、USBデバイスも実態はファイルとして扱われている。これは/dev/bus/usb/<bus>/<dev>に用意されている。そしてファイルの利用状況はlsofコマンドで把握できるため、USBデバイスの利用状況も知ることができる:

% sudo lsof /dev/bus/usb/001/024
COMMAND  PID USER FD   TYPE DEVICE SIZE/OFF NODE NAME
pcscd   4062 root 13u   CHR 189,23      0t0 1935 /dev/bus/usb/001/024

一見pcscdが掴んでいるように見える。systemctlを利用してpcscdを終了させてみる:

% sudo systemctl stop pcscd

しかし再度lsofしても結果は同じだった。

偽物のpcscdがいる

btopコマンドなどで調査したところ、この4062番のpcscdsnapでインストールされたyubioath-desktopのものだった。これが勝手に起動してYubikeyへのアクセスを独占し、本来のpcscdによるアクセスを妨げていたのだ。

このsnapは今は利用していないので止めてもかまわない。そこで、snapを利用してyubioath-desktopを停止させ、無効化した:

% snap stop yubioath-desktop.pcscd
Stopped.

% snap disable yubioath-desktop
yubioath-desktop disabled

pcscd再起動

最後にsystemctlpcscdを再起動する:

% sudo systemctl start pcscd

% sudo systemctl status pcscd.service
● pcscd.service - PC/SC Smart Card Daemon
     Loaded: loaded (/usr/lib/systemd/system/pcscd.service; indirect; preset: disabled)
     Active: active (running) since Wed 2025-09-03 15:10:16 JST; 8s ago
 Invocation: 70cacd01984d46419632f3a45a7d6a68
TriggeredBy: ● pcscd.socket
       Docs: man:pcscd(8)
   Main PID: 362586 (pcscd)
      Tasks: 5 (limit: 76368)
        CPU: 138ms
     CGroup: /system.slice/pcscd.service
             └─362586 /usr/sbin/pcscd --foreground

 903 15:10:16 localhost.localdomain systemd[1]: Started PC/SC Smart Card Daemon.

問題なく起動できている。

gpgテスト

最後にgpgを使って確認したところ正常に認識していた。

% gpg --card-status
Reader ...........: Yubico YubiKey OTP FIDO CCID 00 00
Application ID ...: ***
Application type .: OpenPGP
Version ..........: 3.4
Manufacturer .....: Yubico
Serial number ....: ***
Name of cardholder: [未設定]
Language prefs ...: [未設定]
Salutation .......:
URL of public key : [未設定]
Login data .......: [未設定]
Signature PIN ....: 強制なし
Key attributes ...: ed25519 cv25519 ed25519
Max. PIN lengths .: 127 127 127
PIN retry counter : 3 0 3
Signature counter : 205
KDF setting ......: off
UIF setting ......: Sign=off Decrypt=off Auth=off
Signature key ....: **** **** ****
      created ....: 2024-10-13 14:53:10
Encryption key....: **** **** ****
      created ....: 2024-10-13 14:50:59
Authentication key: **** **** ****
      created ....: 2024-10-13 14:53:10
General key info..: sub  ed25519/**** 2024-10-13 Windymelt <windymelt@3qe.us>
sec#  ed25519/**** **** ****  作成: 2022-10-02  有効期限: 無期限
ssb>  ed25519/**** **** ****  作成: 2024-10-13  有効期限: 2029-10-12
                                カード番号: **** ****
ssb>  cv25519/**** **** ****  作成: 2024-10-13  有効期限: 2029-10-12
                                カード番号: **** ****
ssb>  ed25519/**** **** ****  作成: 2022-10-02  有効期限: 2023-10-02
                                カード番号: **** ****
ssb>  cv25519/**** **** ****  作成: 2022-10-02  有効期限: 2023-10-02
                                カード番号: **** ****
★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?