我一直在尝试为我的 Windows 10 专业版媒体服务器配置 OpenSSH。我可以使用正常的密码登录,没有任何问题,但我正在尝试设置公钥身份验证。
我已编辑sshd_config
文件以允许公钥认证。客户端和服务器正在运行ssh-agent
。由于该帐户是管理员帐户,我已将 SSH 公钥从客户端计算机复制并粘贴到文件中C:\ProgramData\ssh\administrators_authorized_keys
。上述文件的权限设置与目录中的其他密钥文件相同,只有 SYSTEM 和管理员拥有完全控制权,没有列出其他人。
我添加了调试日志,当我尝试使用公钥连接时,我得到了以下信息:
debug1: userauth-request for user uther service ssh-connection method none [preauth]
debug1: attempt 0 failures 0 [preauth]
debug1: user uther matched group list administrators at line 84
debug1: userauth-request for user uther service ssh-connection method publickey [preauth]
debug1: attempt 1 failures 0 [preauth]
debug1: userauth_pubkey: test pkalg ssh-rsa pkblob RSA SHA256:jcQNaVuxvH90SIh4zu8xduBqJaav1WFQJIov3hiFSFM [preauth]
debug1: trying public key file C:\\ProgramData\\ssh\\administrators_authorized_keys
Failed publickey for uther from 10.0.0.24 port 60432 ssh2: RSA SHA256:jcQNaVuxvH90SIh4zu8xduBqJaav1WFQJIov3hiFSFM
debug1: userauth-request for user uther service ssh-connection method keyboard-interactive [preauth]
我不知道该如何解决这个问题。我使用远程桌面将客户端上的 id_rsa.pub 文本剪切并粘贴到管理员授权密钥文件中的服务器中。似乎没有权限错误,我不明白为什么它无法进行身份验证。
如果有人能帮我实现这个功能,我将不胜感激。这并不重要,SSH 不会暴露在互联网上,但我使用的某些脚本如果使用公钥身份验证会更好。
我还应该注意,当我设置服务器时,我使用了我的 Microsoft 帐户,我一直想知道这是否与它有关,所以我可能会尝试设置一个直接本地帐户,看看是否可以解决问题。
编辑:我尝试创建一个本地用户帐户,但无法创建。即使我尝试使用control userpasswords2
该框,但创建帐户的所有选项都被禁用。我想这一定是因为我使用的是 Windows 10 Professional,而不是某些更高级、最昂贵的版本。
答案1
我最终通过注释掉以下行解决了该问题:
Match Group administrators
AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
然后,我将授权密钥放入普通文件中,~\.ssh\authorized_keys
就像我使用 ssh 时所做的一样。当我进行初步研究时,我发现这对很多人来说都不起作用,因此放弃了它。
答案2
在 PowerShell 中使用此命令序列来更正administrators_authorized_keys
$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
除了Sergio Cabral 的回答, 这文档提供了另一个选项来应用适当的权限:
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
答案4
$systemRule = New-Object system.security.accesscontrol.filesystemaccessrule("SYSTEM","FullControl","Allow") $administratorsRule = New-Object system.security.accesscontrol.filesystemaccessrule("Administrators","FullControl","Allow") $acl = Get-Acl C:\ProgramData\ssh\administrators_authorized_keys $acl.SetAccessRule($systemRule) $acl.SetAccessRule($administratorsRule) $acl.SetAccessRuleProtection($true, $false) $acl | Set-Ac升