我有一个装有 ed25519 证书的 Yubikey。其中之一是身份验证证书。我可以通过 running 导出 sha gpg --export-ssh-key {key_id}
,并且 runninggpg-connect-agent readkey {keygrip}
似乎导出了我所期望的公钥,所以我认为它运行正常。我已经在 gpg 代理中启用了详细调试和日志记录,但我在那里看不到很多东西,即使我从连接代理运行命令也是如此。
我正在运行 windows openbsd ssh 代理,它似乎不想与 gpg 代理通信,我无法从中获取任何调试信息。我在这里陷入了死胡同,不知道该去哪里,我已按照本指南https://developers.yubico.com/PGP/SSH_authentication/Windows.html并尝试了几个 gpg 版本,但我开始了认为这可能是 windows ssh 代理的问题。
这很正常;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 的支持1是在3 天前在撰写本文时添加的,并将在下一个 GnuPG 版本中提供。(由于最近一次发布也是 3 天前,您将不得不等待几个月才能看到下一次发布。)
我会建议一种更直接的方法:从yubico-piv-tool获取 Yubikey PKCS#11 模块 (libykcs11.dll)并在 ~/.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 的一个问题,它的 gpg-agent 并非设计为那样工作,只是假设所有客户端都是同一个用户。(希望您的计算机上只有一个用户帐户!)