我正在尝试将 OpenSSH 配置为 Microsoft Windows 10 上的 ssh 服务器 (sshd),如下所述: https://docs.microsoft.com/en-us/windows-server/administration/openssh/openssh_keymanagement
说明清晰易懂,但完成之后,系统仍提示我输入密码。我的第一个测试只是使用 ssh 访问同一台 (Windows) 计算机,但如果我尝试从另一台计算机 ssh 进入这台计算机,也会出现同样的问题。如下面的输出所示,我创建了两个密钥对:一个用于 RSA,一个用于 Ed25519。
OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5
debug3: Failed to open file:C:/Users/Administrator/.ssh/config error:2
debug3: Failed to open file:C:/ProgramData/ssh/ssh_config error:2
debug2: resolving "localhost" port 22
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to localhost [::1] port 22.
debug1: Connection established.
...
debug1: Local version string SSH-2.0-OpenSSH_for_Windows_7.7
debug1: Remote protocol version 2.0, remote software version OpenSSH_for_Windows_7.7
debug1: match: OpenSSH_for_Windows_7.7 pat OpenSSH* compat 0x04000000
debug2: fd 3 setting O_NONBLOCK
debug1: Authenticating to localhost:22 as 'administrator'
...
debug2: key: C:\\Users\\Administrator/.ssh/id_rsa (<redacted>), agent
debug2: key: C:\\Users\\Administrator/.ssh/id_ed25519 (<redacted>), agent
debug2: key: C:\\Users\\Administrator/.ssh/id_dsa (0000000000000000)
debug2: key: C:\\Users\\Administrator/.ssh/id_ecdsa (0000000000000000)
debug2: key: C:\\Users\\Administrator/.ssh/id_xmss (0000000000000000)
debug3: send packet: type 5
debug3: receive packet: type 7
...
debug1: Offering public key: RSA SHA256:<redacted> C:\\Users\\Administrator/.ssh/id_rsa
debug3: send_pubkey_test
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug1: Offering public key: ED25519 SHA256:<redacted> C:\\Users\\Administrator/.ssh/id_ed25519
debug3: send_pubkey_test
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
...
debug3: remaining preferred: password
Get-Service 显示 ssh-agent 正在运行。ssh-add -l 显示该用户的两个条目。
它确实正确接受了用户的密码,但这项工作只是需要自动执行在另一台 Windows 计算机上运行命令的一些步骤的项目的一小部分,因此我需要使用无密码身份验证功能。
(如果有帮助的话,我来自 Linux/Unix 世界,并且已经在这些环境中配置了 ssh。)
感谢您对这个问题的任何帮助!
sshd 配置文件的 ACL:
icacls sshd_config
sshd_config NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
NT AUTHORITY\Authenticated Users:(I)(RX)
问题解决了:一位队友建议,此处得票最多的答案(下面的链接)中的步骤可能会有所帮助。我只需要步骤 4(“正确设置权限”)和步骤 5(注释掉 sshd_config 中的 2 行)。 https://stackoverflow.com/questions/16212816/setting-up-openssh-for-windows-using-public-key-authentication
现在它可以正常工作。
答案1
回答我自己的问题:
OpenSSH (在我看来) 对包含密钥的文件的权限非常挑剔。我在问题中引用的 Microsoft 文档没有提供设置权限的步骤。
一位队友在另一个问题中提出了答案(链接如下)。以下是这些步骤,略作了修改。
正确设置权限:
- 运行 start . 以使用当前文件夹打开资源管理器(
$env:USERPROFILE\.ssh
) - 右键单击 authorized_keys,转到属性 -> 安全 -> 高级
- 点击“禁用继承”
- 出现提示时,选择“将继承的权限转换为此对象的显式权限”
- 删除文件上除 SYSTEM 和您本人之外的所有权限。文件上必须恰好有两个权限条目。SYSTEM 和您本人都应该对文件拥有完全控制权。
如果您的 Windows 版本是 1809 或更高版本,则必须注释掉C:\ProgramData\ssh\sshd_config
文件中的以下几行。然后重新启动 sshd 服务。
# Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
答案2
该解决方案在 Windows 11 上对我有效。
更改权限和 sshd_config 文件后,您还需要在 Windows 服务中重新启动名为“OpenSSH SSH Server”的服务。