在 Windows 系统中使用硬件安全密钥的 OpenPGP 功能登录 SSH
硬件安全密钥:本文所指之硬件安全密钥,包括Yubikey和兼容Yubikey的各种硬件安全密钥实现(比如RS-Key、Pico Keys等)。只要能使用对应的应用的,理论上就可以适用本文,下文简称安全密钥。使用安全密钥登录 SSH 的几种方式
我们都知道安全密钥一般支持以下 Applet:
OATH:生成基于时间的一次性密码 (TOTP) 和基于计数器的一次性密码 (HOTP)
FIDO2 / WebAuthn:用于实现无密码或免密登录。
PIV:个人身份验证 (Personal Identity Verification)
OpenPGP:实现 OpenPGP 智能卡标准,可以用于代码签名和邮件加密。
其中,FIDO2、PIV、OpenPGP 均可以用于登录SSH,本文只介绍 OpenPGP 这种方式,因为它的配置还算简单,也没有太多奇怪的问题。
使用 OpenPGP 登录 SSH
首先,需要安装 Gpg4win,点击链接,到官网下载安装即可。
安装后,在 cmd 中执行gpg --version,应该能够看到版本信息。
如果你的安全密钥还没有初始化,可以使用 Kleopatra 在管理智能卡中进行初始化(卡片操作->生成新密钥)。
初始化过后,运行gpg --list-key,在杂乱的数据中,你应该能找到包含[A]标记的密钥,就像这样。

复制图中画横线的部分(也就是密钥指纹),执行以下命令
gpg --export-ssh-key <密钥指纹>如图:

复制输出的部分,插入到你想使用这个安全密钥登录的服务器的~/.ssh/authorized_keys中。
然后打开路径: %APPDATA%\gnupg,创建gpg-agent.conf,写入以下配置并保存
enable-ssh-supportenable-win32-openssh-supportenable-putty-supportdefault-cache-ttl 600max-cache-ttl 7200然后需要设置 gpg-agent 的自启动,这里请看这篇文章
下面需要选择一个好用的 SSH GUI 客户端~~(当然你直接用OpenSSH也不是不行)~~,我这里推荐MobaXterm,因为它配置 gpg-agent 很简单,只需要勾选Use PuTTY agent即可。

之后正常创建 SSH session 即可。连接时,MobaXterm 会自动调用 gpg-agent,询问你安全密钥的 PIN,输入后即可正常登录。

TIPS:
- Tabby 终端很难配置,我经过各种尝试都没有让他成功用上 gpg-agent。
- 输入一次 PIN 后,可能在拔下来之前重新验证就不需要再次输入 PIN,具体看卡的实现。
- 我还想写使用FIDO的,有点麻烦,暂时鸽了。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或打赏支持!
部分内容可能已过时
