Yubikey 教程(三)在 WSL2 中使用 Yubikey
WSL 即 Windows Subsystem for Linux,可以在 Windows 中运行 Linux 子系统。WSL2 使用虚拟机的方式运行 Linux 子系统,很方便在 Windows 中使用 Linux 的命令行工具。但是,WSL2 也有一些限制,比如不能直接访问 Windows 的硬件设备,比如 Yubikey。本文是 Yubikey 系列教程的第三篇,介绍如何在 WSL2 中使用 Yubikey 的 GPG 功能。
尝试
我尝试了以下几种方案:
- 通过 wsl2-ssh-pageant,出现 Broken Pipe 错误,原因不明
- 通过 gpg-bridge 将 GPG Agent 转发到 TCP,并在 WSL2 内通过
socat
转发到 unix socket,一度成功(不知道为什么),重启之后再也连不上了(超时) - 通过 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 Agent 转发到了本地的 12345 端口。你可以将 12345 改为任何你想要的端口。
设置 sshd_config
需要将 WSL /etc/ssh/sshd_config
中的 SSH 端口修改为 2222。同时根据 gnupg 的建议,你需要在文件中添加如下配置:
1 |
|
这将允许在连接到远程计算机时自动删除过时的套接字。否则,在转发工作之前,您必须首先删除远程计算机上的套接字。
在 WSL2 中启动 SSH 服务
在 WSL2 中,SSH 服务默认是关闭的。你可以通过如下命令启动 SSH 服务:
1 |
|
为了避免每次重启都需要手动启动 SSH 服务,你可以将如下命令添加到 ~/.bashrc
中:
1 |
|
同时你需要通过 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 |
|
其中 <your username in wsl>
是你在 WSL2 中的用户名。
导入 GPG 公钥
你需要将 GPG 公钥导入到 WSL2 中。
测试和连接
通过如下命令将 Yubikey 连接到 WSL2:
- 在 Windows 中打开
cmd
,输入gpg-bridge --extra 127.0.0.1:12345
- 打开第二个
cmd
,输入wsl
启动 WSL2,此时 SSH 服务已经启动 - 打开第三个
cmd
,输入ssh wsl
进行端口转发
此时你就可以在 WSL2 中使用 Yubikey 的 GPG 功能了。你可以通过如下命令测试:
1 |
|
该命令应当显示 Yubikey 的私钥信息。
已知问题
- 每次使用时需要手动运行
gpg-bridge
并打开ssh
连接 - 无法对智能卡执行管理员操作,这是设计中的行为,如果需要管理员操作,可以转发标准套接字而非额外套接字。
Reference
Yubikey 教程(三)在 WSL2 中使用 Yubikey