Yubikey 教程(三)在 WSL2 中使用 Yubikey

本文已过时

本文撰写于 2023 年 2 月 16 日,它已经过时。现在我们可以直接将 USB 设备共享给 WSL,以实现在 WSL 上直接使用 Yubikey。这远比本文提出的方法要方便。

WSL 即 Windows Subsystem for Linux,可以在 Windows 中运行 Linux 子系统。WSL2 使用虚拟机的方式运行 Linux 子系统,很方便在 Windows 中使用 Linux 的命令行工具。但是,WSL2 也有一些限制,比如不能直接访问 Windows 的硬件设备,比如 Yubikey。本文是 Yubikey 系列教程的第三篇,介绍如何在 WSL2 中使用 Yubikey 的 GPG 功能。

尝试

我尝试了以下几种方案:

  1. 通过 wsl2-ssh-pageant,出现 Broken Pipe 错误,原因不明
  2. 通过 gpg-bridge 将 GPG Agent 转发到 TCP,并在 WSL2 内通过 socat 转发到 unix socket,一度成功(不知道为什么),重启之后再也连不上了(超时)
  3. 通过 gpg-bridge 将 GPG Agent 转发到 TCP 并通过 SSH 进行远程转发,成功

本文将介绍第三种方案。如果你有其他成功的方案,欢迎在评论中分享。

设置 SSH 和 WSL2

gpg-bridge

gpg-bridge 是一个开源项目,目的是解决 Windows 上的 GPG Agent 难以进行 SSH 转发的问题。它将 Windows 下的 GPG Agent 转发到本地 TCP 端口。

首先在 Windows 上下载 gpg-bridge 并将解压出的可执行文件放到 PATH 中。然后运行如下命令:

1
gpg-bridge --extra 127.0.0.1:12345

这样就将 GPG Agent 转发到了本地的 12345 端口。你可以将 12345 改为任何你想要的端口。

设置 sshd_config

需要将 WSL /etc/ssh/sshd_config 中的 SSH 端口修改为 2222。同时根据 gnupg 的建议,你需要在文件中添加如下配置:

1
StreamLocalBindUnlink yes

这将允许在连接到远程计算机时自动删除过时的套接字。否则,在转发工作之前,您必须首先删除远程计算机上的套接字。

在 WSL2 中启动 SSH 服务

在 WSL2 中,SSH 服务默认是关闭的。你可以通过如下命令启动 SSH 服务:

1
sudo service ssh start

为了避免每次重启都需要手动启动 SSH 服务,你可以将如下命令添加到 ~/.bashrc 中:

1
sudo /etc/init.d/ssh start

同时你需要通过 visudo 命令将 /etc/init.d/ssh 设置为免密码执行,即在 %sudo ALL=(ALL:ALL) ALL 后添加一行 %sudo ALL=NOPASSWD: /etc/init.d/ssh

设置 SSH 密钥

你需要生成 SSH 密钥并将公钥添加到 ~/.ssh/authorized_keys 中。这部分网上有很多教程,这里不再赘述。

设置远程转发

在 Windows 上的 %USERPROFILE%\.ssh\config 中添加如下配置:

1
2
3
4
5
Host wsl
HostName 127.0.0.1
Port 2222
User <your username in wsl>
RemoteForward /home/<your username in wsl>/.gnupg/S.gpg-agent 127.0.0.1:12345

其中 <your username in wsl> 是你在 WSL2 中的用户名。

导入 GPG 公钥

你需要将 GPG 公钥导入到 WSL2 中。

测试和连接

通过如下命令将 Yubikey 连接到 WSL2:

  1. 在 Windows 中打开 cmd,输入 gpg-bridge --extra 127.0.0.1:12345
  2. 打开第二个 cmd,输入 wsl 启动 WSL2,此时 SSH 服务已经启动
  3. 打开第三个 cmd,输入 ssh wsl 进行端口转发

此时你就可以在 WSL2 中使用 Yubikey 的 GPG 功能了。你可以通过如下命令测试:

1
gpg -K

该命令应当显示 Yubikey 的私钥信息。

已知问题

  1. 每次使用时需要手动运行 gpg-bridge 并打开 ssh 连接
  2. 无法对智能卡执行管理员操作,这是设计中的行为,如果需要管理员操作,可以转发标准套接字而非额外套接字。

Reference

  1. Gunpg Wiki: Forwarding gpg-agent to a remote system over SSH
  2. GitHub: gpg-bridge
  3. GitHub: wsl2-ssh-pageant
  4. Gnupg Issue: 额外套接字无法对智能卡执行管理员操作

Yubikey 教程(三)在 WSL2 中使用 Yubikey

https://blog.caomingjun.com/series/yubikey/wsl/

作者

Cao Mingjun

发布于

2023-02-26

更新于

2023-02-26

许可协议

评论