我有一个 Yubikey,上面加载了 ed25519 证书。其中一个是身份验证证书。我可以通过运行 导出它的 sha 值gpg --export-ssh-key {key_id}
,并且运行gpg-connect-agent readkey {keygrip}
似乎可以导出公钥,正如我所期望的那样,所以我认为它运行正常。我已在 gpg 代理中启用了详细调试和日志记录,但我没有看到任何东西,即使我从连接代理运行命令也是如此。
我正在运行 Windows OpenBSD SSH 代理,但它似乎不想与 GPG 代理通信,我无法从中获取任何调试信息。我在这里陷入了死胡同,不知道该去哪里,我已按照本指南操作https://developers.yubico.com/PGP/SSH_authentication/Windows.html并尝试了几个 gpg 版本,但我开始认为这可能是 Windows ssh 代理的问题。
答案1
windows openbsd ssh 代理正在运行,但它似乎不想与 gpg 代理进行通信
这是正常的;ssh-agent 根本不与 gpg-agent 通信。
它的工作方式是 gpg-agent假装ssh-agent – 它导出一个与 ssh-agent 协议兼容的单独套接字,并且您的 $SSH_AUTH_SOCK 告诉 ssh 客户端直接与 gpg-agent 对话(模拟 ssh-agent),而实际的 ssh-agent 进程仍然完全未被使用。
但目前的 GnuPG 版本仅支持在类 Unix 系统上执行此操作,而不支持在 Windows 上执行此操作。添加了用于模拟 Windows OpenSSH ssh-agent 的支持13天前在撰写本文时,它将在下一个 GnuPG 版本中可用。(由于最近的版本也是 3 天前发布的,因此您必须等待几个月才能获得下一个版本。)
我建议采用更直接的方法:从以下位置获取 Yubikey PKCS#11 模块 (libykcs11.dll)yubico-piv-工具并在 ~/.ssh/config 中将其配置为PKCS11Provider
。这允许 OpenSSH 客户端直接与密钥的 PIV 小程序通信,并且无需使用 gpg-agent 或 ssh-agent。
1由于 Windows 历史上缺少 AF_UNIX 套接字(直到 2016 年),这有点混乱,不同的程序选择不同的替代方案——例如,OpenSSH 的本机 Microsoft 端口使用命名管道(类似于但不完全类似于 AF_UNIX 套接字)而 OpenSSH 的 Cygwin 端口使用环回 TCP,等等。
更复杂的是,微软的 OpenSSH 端口由于未知原因使用了全系统ssh-agent 保存所有用户的密钥(通过调用者的 UID 来区分它们),这与每个用户都有自己的 ssh-agent 实例的常规方法不同。这实际上可能是 GnuPG 的一个问题,因为 GnuPG 的 gpg-agent 并非设计为那样工作,而是假设所有客户端都是同一个用户。(希望您的计算机上只有一个用户帐户!)
答案2
中提到的变化目前接受的答案现在是 GPG 2.40.0 和 Gpg4Win 4.1.0 的一部分。它尚未记录,而且相当复杂,但可以做到。使用加载到 YubiKey 上的 GPG 身份验证子密钥进行测试(这可能是最糟糕的情况)。
假设 Gpg4Win 已安装且位于 PATH 上,并且要使用 Windows OpenSSH:
- 导航到目录
%APPDATA%\gnupg\gpg-agent.conf
或创建文件,并设置以下配置:
enable-ssh-support
enable-win32-openssh-support
- 点击
Windows+R
并输入services.msc
,然后向下滚动到“OpenSSH 身份验证代理”。此默认代理将被 GPG 替换,因此双击它,将“启动类型”更改为已禁用,然后单击“停止”。单击“确定”并关闭窗口。(从 1Password 配置中提取) - 打开目录
%HOME%\.ssh
并粘贴公共 SSH 密钥文件,您可以使用 检索该文件gpg --export-ssh-key <key_id>
。 - 创建一个快捷方式以在启动时启动 gpg-agent。将快捷方式放在 中
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
;目标应为以下内容:
"C:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe" /bye
- 重新启动 gpg-agent:
gpg-connect-agent killagent /bye
gpg-connect-agent /bye
- 按照常规配置 SSH 和 GPG:设置
.ssh\config
、添加 GPG 密钥等。
如果你使用的是 Windows 版 Git,需要进行一些额外的更改。它打包了自己的 SSH 安装(不是 Windows 客户端)和 GPG(截至 2023-02-07,尚未运行最新版本)。
- 打开你的 gitconfig (
%HOME%\.gitconfig
或者在 repo 中)- 将 GPG 设置为使用 Gpg4Win:
git config gpg.program "C:/Program Files (x86)/GnuPG/bin/gpg.exe"
- 将 SSH 设置为使用 Windows OpenSSH 客户端:
git config core.sshCommand "C:/Windows/System32/OpenSSH/ssh.exe"
- 打开
%HOME%\.bash_profile
或创建文件,并通过将其附加到末尾来设置 GPG 主目录:
export GNUPGHOME=$APPDATA/gnupg
设置任何 GPG 签名或连接密钥,然后按照步骤 5 重新启动 gpg-agent。