我已经在各种版本的 Linux 上多次设置过 OpenSSH。但我无论如何都无法让它在 Windows 上正常运行。
这个问题似乎有两个方面。权限和sshd
/使用的密钥ssh-agent
。
权限
我读过的每一页对于正确权限的答案都不同。有些可以工作,但有时程序会抱怨它们。
据我所知,所有密钥都应归 拥有SYSTEM
, 具有读取权限NT SERVICE\sshd
, 具有完全控制权Administrators
和SYSTEM
? (据我所知,SYSTEM
和代表 Windows 中的 root)。我在文档中读到,只有在不使用/Administrators
时才需要读取权限。我还为文件配置了相同的权限,并添加了Ed25519 密钥,这是我用来尝试连接的密钥,尽管我也尝试过使用自己生成的 RSA 密钥。ssh-add
ssh-agent
%USERPROFILE%/.ssh/authorized_keys
.pub
通过这种方式设置权限,程序在向代理添加密钥或运行守护程序时不会发出抱怨。我更改的唯一选项sshd_config
是ListenAddress
绑定到 0.0.0.0,我将其设置为机器的本地 IP,因为 SSH 只会在本地使用。
按键
当我sshd.exe
使用该-d
选项运行时,我注意到它从 导入了 4 个默认密钥%PROGRAMDATA%/ssh
。当我将ed25519.pub
密钥添加到authorized_keys
它时,后面跟着HOSTNAME@workstation@HOSTNAME
,HOSTNAME
这是我的 PC 的主机名。通常我期望看到user@host
。我尝试创建自己的密钥并添加它,但当我运行时,sshd.exe -d
它似乎从未使用默认密钥以外的任何东西。
最后,我无法连接到 OpenSSH 服务器,日志%PROGRAMDATA%/ssh/Logs
似乎只显示服务器正在启动。总结一下我的问题:密钥文件和的正确权限是什么authorized_hosts
?注释authorized_keys
错误会有什么影响吗?我应该将所有默认密钥添加.pub
到吗authorized_hosts
?最后,sshd
启动期间提到这些密钥是什么意思(见日志)?只要我将自己生成的密钥添加到,它难道不应该起作用吗authorized_hosts
?
debug1: sshd version OpenSSH_for_Windows_7.6, LibreSSL 2.6.4
debug1: private host key #0: ssh-rsa SHA256:and12LVkEqyXJ2gr0SxFEQObaSFF+Czlcnx2uFjZaJQ
debug1: private host key #1: ssh-dss SHA256:waeLdy4Sm3NT+zbwEMIhbfl8TLe6WeQ0MuZE07CzFQU
debug1: private host key #2: ecdsa-sha2-nistp256 SHA256:G8/7y/04cSE3EezTrcmpK4lRmJ5f5I/CDPcHaPzsv4o
debug1: private host key #3: ssh-ed25519 SHA256:Jvn9UjsbdzH54L/yvGYGfCzJQVIMiIWL5RETbaL2ACA
debug1: rexec_argv[0]='C:\\WINDOWS\\System32\\OpenSSH\\sshd.exe'
debug1: rexec_argv[1]='-d'
debug1: Bind to port 22 on 192.168.1.144.
Server listening on 192.168.1.144 port 22.
答案1
你似乎混合了服务器主机密钥和你的账户公钥。
服务器主机密钥是由 Win32-OpenSSH 在%PROGRAMDATA%/ssh
首次启动时生成的。它们也具有正确的权限,无需修改。这些是您在日志中看到作为“私有主机密钥”加载的密钥。这也表明它们具有正确的权限(否则它们将不会加载)。
你的账户公钥转到%USERPROFILE%/.ssh/authorized_keys
(或%PROGRAMDATA%/ssh/administrators_authorized_keys
管理员帐户转到)。该文件必须仅对其所属的帐户具有写访问权限。
该authorized_keys
文件应包含您的公钥部分账户密钥对.pub
。这与来自的文件毫无关系%PROGRAMDATA%/ssh
。
文件中的注释authorized_keys
根本不重要。
服务器启动时不会加载文件中的密钥authorized_keys
。只有当您尝试登录时才会加载它们。
另请参阅我的指南:
答案2
请注意,如果您为管理员用户设置密钥,则将公钥放入%USERPROFILE%/.ssh/authorized_keys
将不起作用。您必须将公钥附加到%PROGRAMDATA%/ssh/administrators_authorized_keys
。
并且您必须使用在 powershell admin 中运行的此脚本设置权限:
$acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys
$acl.SetAccessRuleProtection($true, $false)
$administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule("Administrators","FullControl","Allow")
$systemRule = New-Object system.security.accesscontrol.filesystemaccessrule("SYSTEM","FullControl","Allow")
$acl.SetAccessRule($administratorsRule)
$acl.SetAccessRule($systemRule)
$acl | Set-Acl
答案3
我只是为此挣扎了大约两个小时,但其中一个只是在旁注中提到马丁斯的文章最终找到了我的解决方案:
设置 SSH 公钥认证
但是,在默认的 Win32-OpenSSH 配置中,sshd_config 中为管理员组中的帐户设置了一个例外。对于这些帐户,服务器使用不同的位置来存放授权密钥文件:(%ALLUSERSPROFILE%\ssh\administrators_authorized_keys
即通常C:\ProgramData\ssh\administrators_authorized_keys
)。
因此,由于我的用户是管理员组的成员,所以我所要做的就是将我的移动~/.ssh/authorized_keys
到%PROGRAMDATA/ssh/administrators_authorized_keys
顺便说一句:我正在运行 Windows 11 Pro 22H2