无法将 Windows OpenSSH 代理与 GPG Agent 和 Yubikey 一起使用

无法将 Windows OpenSSH 代理与 GPG Agent 和 Yubikey 一起使用

我有一个 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:

  1. 导航到目录%APPDATA%\gnupg\gpg-agent.conf或创建文件,并设置以下配置:
enable-ssh-support
enable-win32-openssh-support
  1. 点击Windows+R并输入services.msc,然后向下滚动到“OpenSSH 身份验证代理”。此默认代理将被 GPG 替换,因此双击它,将“启动类型”更改为已禁用,然后单击“停止”。单击“确定”并关闭窗口。(从 1Password 配置中提取
  2. 打开目录%HOME%\.ssh并粘贴公共 SSH 密钥文件,您可以使用 检索该文件gpg --export-ssh-key <key_id>
  3. 创建一个快捷方式以在启动时启动 gpg-agent。将快捷方式放在 中%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup;目标应为以下内容:
"C:\Program Files (x86)\GnuPG\bin\gpg-connect-agent.exe" /bye
  1. 重新启动 gpg-agent:
gpg-connect-agent killagent /bye
gpg-connect-agent /bye
  1. 按照常规配置 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。

相关内容