客户:
- 基于 Arch 的发行版
- OpenSSH 软件包版本:9.3p1-2
- SSH-Agent
ssh-agent -c
在fish
shell中启动 - 密钥生成于:
ssh-keygen -t ed25519-sk -f ~/.ssh/servers_ed25519_sk -O verify-required
服务器:
- 使用 vagrant 启动服务器作为虚拟机
- Debian 11
- openssh 服务器版本:1:8.4p1-5+deb11u1
初始客户端命令:
ssh [email protected] -p22150 -i ~/.ssh/servers_ed25519_sk -vvv -o IdentitiesOnly=yes
解释:
ssh [email protected] -p22150
:流浪汉相关。-vvv
:详细输出-o IdentitiesOnly=yes
:避免使用其他密钥(vagrant 生成一个私钥,存储在 ssh-agent 中,如果没有被禁止则使用)。
运行命令时,会请求所有内容:密码、PIN 和 Touch。初始连接有效。
密钥会在第一次运行期间自动添加到 ssh-agent。
再次运行相同命令。输出:
debug1: Offering public key: ~/.ssh/servers_ed25519_sk ED25519-SK SHA256:XXX explicit authenticator agent
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 60
debug1: Server accepts key: ~/.ssh/servers_ed25519_sk ED25519-SK SHA256:XXX explicit authenticator agent
debug3: sign_and_send_pubkey: using publickey with ED25519-SK SHA256:XXX
debug3: sign_and_send_pubkey: signing using [email protected] SHA256:XXX
sign_and_send_pubkey: signing failed for ED25519-SK "~/.ssh/servers_ed25519_sk" from agent: agent refused operation
没有提示或类似的东西来重新输入 PIN。所以我猜这就是问题所在,因为密钥是通过verify-required
选项生成的。
据我了解,从 8.9 版开始,openssh 客户端应该能够使用代理中的 ed25519-sk 密钥进行连接。这似乎不是服务器问题,因为初始连接有效。那么为什么不起作用呢?
答案1
我发现A自己解决。
当您首次连接到服务器时,所有内容都位于活动终端会话的前台,因此您可以立即收到提示。首次连接后,如果运行 ssh 代理,“打开”密钥将保存在代理中。
未保存的是第二个因素的 PIN。每次要使用第二个因素时都必须请求它。要使此问题起作用,您必须将环境变量SSH_ASKPASS
设置为 ssh 密码请求的二进制文件。
例如,对于 KDE,您可以/usr/bin/ksshaskpass
。您使用什么以及在何处为 shell 配置环境变量完全取决于您的设置、桌面环境等。
(i)以下是有关为什么事情会这样发展的假设。
这就是我认为您必须这样设置的原因。
如上所述,ssh
在第一次连接时会在终端上要求输入 PIN,但之后不再要求输入。我认为这是因为 确实会ssh
在第一次连接时自己处理对密钥的访问。在使用正确的密码打开密钥后,它将这个责任移交给ssh-agent
。ssh-agent
也是在后续连接中意识到我们正在处理什么类型的密钥以及需要第二个因素的参与者。由于 是一个ssh-agent
可能在多个终端/shell 实例之间共享的后台进程,因此它不知道在哪里附加以询问密码。这就是为什么它需要指向SSH_ASKPASS
可以为其处理这些输入的二进制文件的环境变量。它只是生成程序,等待它返回用户输入并继续。如果未设置变量,它就会失败。
虽然这很烦人,但可能没有办法解决它,而且由于 ssh 密钥的 2fa 对大多数用户来说仍然不那么常见,所以它可能需要一段时间才能改变行为。如果有可能的话。
答案2
添加IdentityAgent none
到您的~/.ssh/config
或将选项传递-o IdentityAgent=none
给ssh
命令。
IdentityAgent none
禁用外部ssh 代理的。
根据建筑维基使用 创建的密钥存在一个错误-O verify-required
。