在 WSL2 中使用 YubiKey
序言
这几天心血来潮开始整 WSL2 其中有一项就是在 WSL2 中使用 YubiKey
恰好这段时间也遇到了一些奇怪的问题,踩了不少坑,就顺手写篇文章记录下吧
Note本文以 Arch Linux 作为目标系统编写
Windows 侧解决方案基于 usbipd-win
前提条件
- 已安装 ArchWSL
- 有一个 YubiKey
连接
Windows 侧
安装 usbipd-win
winget install --interactive --exact dorssel.usbipd-win
连接 YubiKey 后执行
usbipd list
此时的输出应该类似于
Connected:
BUSID VID:PID DEVICE STATE
1-6 1050:0407 USB 输入设备, Microsoft Usbccid Smartcard Reader (WUDF) Not shared
1-7 17ef:6019 USB 输入设备 Not shared
1-8 1a2c:20c0 USB 输入设备 Not shared
记住 VID:PID
之后有用
接下来执行
usbipd bind --busid=<BUSID>
绑定设备
之后启动 WSL 并在 Windows 侧运行
usbipd attach --wsl --busid=<BUSID>
附加 YubiKey 到 WSL
Linux 侧
安装必需依赖
sudo pacman -S usbip usbutils
此时执行 lsusb
如果输出中包含 YubiKey
字样 恭喜你已经成功将 YubiKey 连接到 WSL 了
配置
安装 yubikey-manager
并启动 pcscd.service
sudo pacman -S yubikey-manager pcsclite pcsc-tools
sudo systemctl enable --now pcscd.service
执行 ykman info
命令 不出意外应该是出意外了 提示 No Yubikey detected
并且 GPG 也无法读取到 Key
这时我们需要配置一些 udev 规则
首先 我们需要新建一个名为 scard
的用户组 并把自己的用户添加进去
sudo groupadd scard
sudo usermod -aG scard $whoami
重启 WSL 并添加以下文件
/etc/udev/rules.d/10-security-key.rules
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="users", ATTRS{idVendor}=="2581", ATTRS{idProduct}=="f1d0"
使用 sudo udevadm trigger
重载 udev 规则
这时你会发现 ykman info
已经可以使用 但是 GPG 仍然无法读取到 Key
这是由于 Polkit
限制了本地客户端的权限 所以我们还需要添加一个 Polkit
规则
/etc/polkit-1/rules.d/99-pcscd.rules
polkit.addRule(function(action, subject) {
if (action.id == "org.debian.pcsc-lite.access_card" &&
subject.isInGroup("wheel")) {
return polkit.Result.YES;
}
});
polkit.addRule(function(action, subject) {
if (action.id == "org.debian.pcsc-lite.access_pcsc" &&
subject.isInGroup("wheel")) {
return polkit.Result.YES;
}
});
Important使用上述规则前请确保您的用户位于wheel
用户组中 否则规则将不会工作
然后重启 polkit.service
sudo systemctl restart polkit.service
此时 GPG 应当正常工作
后记
不得不说这玩意是真麻烦 耗了我半天时间找解决方法 累死我了