WSL2中用YubiKey的GPG密钥实现Git认证报错求助
WSL2中YubiKey GPG密钥作为SSH密钥认证Git服务器的问题解决
环境配置
YubiKey Manager (ykman) version: 5.1.1 How was it installed?: Using Yubico's PPA (Ubuntu) Operating system and version: WSL2; 1.2.5.0; Windows version: 10.0.22621.819 (Ubuntu distro) YubiKey model and version: YubiKey 5 NFC (5.4.3)
当前配置
已在WSL中安装socat和wsl2-ssh-pageant,并在~/.bashrc中添加以下套接字同步配置:
config_path="C\:/Users/<YOUR_USER>/AppData/Local/gnupg" wsl2_ssh_pageant_bin="$HOME/.ssh/wsl2-ssh-pageant.exe" # SSH Socket # Removing Linux SSH socket and replacing it by link to wsl2-ssh-pageant socket export SSH_AUTH_SOCK="$HOME/.ssh/agent.sock" if ! ss -a | grep -q "$SSH_AUTH_SOCK"; then rm -f "$SSH_AUTH_SOCK" if test -x "$wsl2_ssh_pageant_bin"; then (setsid nohup socat UNIX-LISTEN:"$SSH_AUTH_SOCK,fork" EXEC:"$wsl2_ssh_pageant_bin" >/dev/null 2>&1 &) else echo >&2 "WARNING: $wsl2_ssh_pageant_bin is not executable." fi fi # GPG Socket # Removing Linux GPG Agent socket and replacing it by link to wsl2-ssh-pageant GPG socket export GPG_AGENT_SOCK="$HOME/.gnupg/S.gpg-agent" if ! ss -a | grep -q "$GPG_AGENT_SOCK"; then rm -rf "$GPG_AGENT_SOCK" if test -x "$wsl2_ssh_pageant_bin"; then (setsid nohup socat UNIX-LISTEN:"$GPG_AGENT_SOCK,fork" EXEC:"$wsl2_ssh_pageant_bin --gpgConfigBasepath ${config_path} --gpg S.gpg-agent" >/dev/null 2>&1 &) else echo >&2 "WARNING: $wsl2_ssh_pageant_bin is not executable." fi fi
问题描述
gpg --card-status可正常显示YubiKey信息,且已通过gpg --card-edit配置GPG密钥,但执行ssh-add -L获取SSH公钥时,报错:
error fetching identities: communication with agent failed
确认gpg-agent处于运行状态。
排查与解决方法
1. 确保gpg-agent启用SSH支持
编辑~/.gnupg/gpg-agent.conf,添加或确认存在以下行:
enable-ssh-support
保存后重启gpg-agent:
gpg-connect-agent reloadagent /bye
2. 修正SSH_AUTH_SOCK指向
GPG密钥作为SSH密钥使用时,需通过gpg-agent的SSH扩展暴露公钥,因此SSH_AUTH_SOCK应指向gpg-agent的SSH套接字,而非单独的SSH代理套接字。修改.bashrc中的SSH配置部分:
- 移除原有的SSH_AUTH_SOCK设置,替换为:
export SSH_AUTH_SOCK="$HOME/.gnupg/S.gpg-agent.ssh"
- 若仍需通过wsl2-ssh-pageant转发Windows端的gpg-agent SSH套接字,需调整socat命令指向Windows端对应套接字,或确保wsl2-ssh-pageant正确转发gpg-agent的SSH通道。
3. 验证套接字通信
执行以下命令检查SSH_AUTH_SOCK是否能正常通信:
echo test | socat - UNIX-CONNECT:$SSH_AUTH_SOCK
若返回SSH_AGENT_FAILURE或无响应,说明套接字连接异常,检查socat进程状态:
ps aux | grep socat
4. 检查文件权限
确保相关目录和文件权限正确:
chmod 700 ~/.gnupg ~/.ssh chmod +x "$HOME/.ssh/wsl2-ssh-pageant.exe"
5. 重启相关服务
- 杀掉WSL中运行的socat和gpg-agent进程:
pkill socat gpg-agent
- 重新加载
.bashrc:
source ~/.bashrc
- 重新插拔YubiKey,确认Windows端
gpg-agent.exe进程正常运行(可通过任务管理器查看)。
6. 验证GPG密钥的SSH属性
确认GPG密钥已配置为可用于SSH认证:
gpg --list-secret-keys --with-keygrip
找到对应密钥的keygrip后,尝试直接指定gpg-agent的SSH套接字执行命令:
SSH_AUTH_SOCK="$HOME/.gnupg/S.gpg-agent.ssh" ssh-add -L
内容的提问来源于stack exchange,提问作者Preeti
相关产品推荐
相关产品推荐

