配置 gpg-agent 作为 ssh Authentication 简要笔记(macOS / Windows)

最近花时间学习了一下 openPGP 的知识,虽然目前并没有什么实际需求 要用到这么强的 加密/签名/验证 之类的功能,大概只是闲的,完全出于好奇。
倒也学到了一点有用的,可以用 gpg-agent 来做 ssh Authentication 这样连接远程服务器时 安全性和易用性都更好。
大概整理一个笔记,记录一下配置 macOS(GPG Suite)和 Windows 11(gpg4win)的过程,以防时间长我自己也忘记了,要配置新机器时又得重新去查资料。

●●● 基本思路
假设你已经大概知道 openPGP 这些基础信息,并且已经生成了 openPGP private key 以及 Subkeys 我就跳过这部分了,如果不清楚的建议先搜索一下吧,我这里只用到 Subkey [A] 通过 gpg-agent 作为 ssh Authentication 让系统 ssh 及第三方 ssh 客户端统一走 gpg-agent

●●● 准备工作
导出为 ssh 公钥并上传至远程服务器:
gpg –export-ssh-key YOURKEY_ID > authorized_keys
将文件上传到远程主机的 ~/.ssh/authorized_keys
修改 /etc/ssh/sshd_config 启用 PubkeyAuthentication
然后重启 sshd 服务,详细步骤如果不清楚 请搜索一下吧,配置错误会把自己关在外面

●● macOS 配置步骤(GPG Suite)

●启用 gpg-agent 的 ssh 支持
编辑配置文件,如果不存在配置文件,可手动创建:
nano ~/.gnupg/gpg-agent.conf
添加以下内容:
enable-ssh-support
pinentry-program /usr/local/MacGPG2/libexec/pinentry-mac.app/Contents/MacOS/pinentry-mac

● 重启 gpg-agent
gpgconf –kill gpg-agent
gpgconf –launch gpg-agent
确认进程是否存在:
ps aux | grep gpg-agent

● 配置 SSH_AUTH_SOCK 环境变量 以 zsh 为例
nano ~/.zshrc
加入:
export SSH_AUTH_SOCK=”$(gpgconf –list-dirs agent-ssh-socket)”
加载配置:
source ~/.zshrc
验证以下两个命令输出应一致:
gpgconf –list-dirs agent-ssh-socket
echo $SSH_AUTH_SOCK
正常情况下路径类似:
/Users/yourname/.gnupg/S.gpg-agent.ssh

● 将 Subkey 的 keygrip 写入 sshcontrol
获取 keygrip:
gpg -K –with-keygrip
编辑控制文件:
nano ~/.gnupg/sshcontrol
将对应用于 Authentication 的 Subkey keygrip 添加上去。

● 再次重启 gpg-agent
gpgconf –kill gpg-agent
gpgconf –launch gpg-agent
验证 SSH Agent 状态
ssh-add -L
正常情况下会看到类似输出:
ssh-ed25519 AAAA**** (none)

● 测试 ssh 登录
ssh -p 23456 user@your.domain.com
首次连接会弹出 GPG 的 Pinentry 窗口,输入对应的 passphrase。
可以选择将凭证保存到 macOS Keychain,避免每次重复输入。

● 其他 ssh 客户端(macOS)
调用系统原生 ssh 的程序无需额外配置。
Tabby 需要使用 ssh-auth-socket 插件,并手动指定路径:
~/.gnupg/S.gpg-agent.ssh

●● Windows 11 配置(gpg4win)
整体流程与 macOS 基本一致,主要区别在于 ssh agent 的通信方式。

● gpg-agent 配置
编辑配置文件,如果不存在配置文件,可手动创建:
%APPDATA%\gnupg\gpg-agent.conf
添加:
enable-ssh-support
enable-win32-openssh-support
## 其中 enable-win32-openssh-support 用于兼容 Windows 的 Named Pipe 机制。

● 配置 sshcontrol 重启 gpg-agent
获取 keygrip 写入 %APPDATA%\gnupg\sshcontrol
步骤和 macOS 完全一致

● Windows SSH_AUTH_SOCK 环境变量
正常情况下 执行:
gpgconf –list-dirs agent-ssh-socket
应该会返回:
C:\Users\yourname\AppData\Local\gnupg\S.gpg-agent.ssh
这是 Unix Domain Socket 路径,但 Windows OpenSSH 默认使用 Named Pipe,尝试把这个加入环境变量,测试不通。用下面的 Named Pipe 配置才行。
设置环境变量 SSH_AUTH_SOCK
\\.\pipe\openssh-ssh-agent

● 重启 gpg-agent 终端/PowerShell 验证是否成功
ssh-add -L
如果能看到输出,说明配置成功。

● 第三方 ssh 客户端测试结果
Tabby:无需插件,添加 ssh 配置时 验证选择 Agent 即可。
MobaXterm 25.4 也增加了 Use Windows SSH Agent 选项,勾选即可正常使用。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注