我在使用公钥认证设置OpenSSH for Windows时遇到问题。
我在本地桌面上工作,可以使用Unix机器或其他OpenSSH for Windows机器上的密钥进行ssh。
我已将构建复制到服务器上,我可以正常使用密码验证,但是当我使用密钥时,我会遇到以下问题:
debug1: Authentications that can continue: publickey,password,keyboard-interactive
debug3: start over, passed a different list publickey,password,keyboard-interactive
debug3: preferred publickey,keyboard-interactive,password
debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /cygdrive/c/sshusers/jsadmint2232/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
Connection closed by 127.0.0.1
因此,出于测试目的,我一直尝试SSH到localhost,但即使远程尝试,我也会遇到同样的问题。
更奇怪的是,当我同时拥有密码&在sshd_config
中启用了公钥,它只会尝试使用密钥,然后使用上述消息弹出,甚至不会尝试使用密码。
以下是我采取的步骤:
服务器出于某种原因似乎正在终止连接?
答案 0 :(得分:35)
以下是Windows 10 v.1803附带的OpenSSH的设置步骤(2018年4月更新。请参阅此帖子的评论,它可能不适用于1809)。
服务器设置(提升的powershell):
安装OpenSSH服务器:Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
。
启动代理和sshd服务:Start-Service ssh-agent; Start-Service sshd
(这将在$env:ProgramData\ssh
中自动生成主机密钥和默认配置。)
[可选]安装OpenSSHUtils powershell模块:Install-Module -Force OpenSSHUtils
客户端设置(非提升的PowerShell):
生成用户密钥:cd $env:USERPROFILE\.ssh; ssh-keygen.exe
,按照提示操作,同意默认建议的文件位置。这将创建2个文件:id_rsa
和id_rsa.pub
;
[可选]向身份验证代理添加密钥,因此每次使用时都不必输入密码:ssh-add .\id_rsa
(或生成的任何文件);
服务器设置继续(非提升的PowerShell):
cd $env:USERPROFILE; mkdir .ssh; cd .ssh; New-Item authorized_keys
; id_rsa.pub
文件的内容从客户端粘贴到上一步的.ssh\authorized_keys
文件中。start .
以使用当前文件夹($env:USERPROFILE\.ssh
); authorized_keys
,转到Properties -> Security -> Advanced
SYSTEM
和你自己之外,删除文件上的所有权限。文件上必须有两个权限条目。有些指南建议运行Repair-AuthorizedKeyPermission $env:USERPROFILE\.ssh\authorized_keys
- 这会尝试将sshd
用户添加到权限列表中,而将破坏身份验证,因此,请勿执行此操作,或者至少不同意添加sshd
用户)。 SYSTEM
和你自己都可以完全控制文件。客户端:
ssh <serverusername>@<serverhostname>
。它应该在这一点上起作用。尝试将Windows 10作为服务器,并将其本身和Debian Linux作为客户端。
编辑:(见下文评论部分) 当前的Windows构建还需要在
中注释掉以下内容 PS C:\ProgramData\ssh> bash -c 'vim sshd_config'
# Match Group administrators
# AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
答案 1 :(得分:5)
我已经解决了这个问题......
它与启动服务的帐户有关 - 它使用的是本地系统帐户 - 这会阻止它访问pub密钥和authorized_keys文件。
一旦我停止了服务并以我尝试连接的用户身份启动,它就有效了!
基本上,您需要从服务帐户开始,然后外部用户以该用户身份连接。
答案 2 :(得分:3)
如果您正在使用mls-software.com的OpenSSH版本,请另外注意。
如果使用SSHD_SERVER帐户和权限分离进行安装,则可以使用公钥身份验证(按http://www.mls-software.com/opensshd-pki.html)。但是,如果启用了UAC,则无法成功安装。将无法正确创建用户,并且不会创建服务。在事实之后手动尝试获取这些物品非常困难。在安装之前简单地禁用UAC将允许安装过程正确地创建用户和服务。安装完成后,您可以重新启用UAC。
当我创建SSHD_SERVER帐户时,手动身份验证在使用密码身份验证时成功,但客户端终止与&#34; / bin / bash的连接:不允许操作&#34;。服务器关闭了公钥验证(Cambolie发布的原始错误)。
答案 3 :(得分:3)
如果遇到困难,另一个提示是在调试模式下运行sshd。我是这样做的:
事实证明密钥需要在例如 C:\ ProgramData \ ssh \ administrators_authorized_keys ,而不是 C:\ Users \ yourUsser.ssh \ authorized_keys 。
答案 4 :(得分:1)
我解决了它:
答案 5 :(得分:0)
我已经在多台Windows Pro 1809和2004计算机上全面测试了n0rd's solution。我同意他的大部分步骤。
服务器设置(PowerShell升级):同意所有人。
客户端设置(非高架PowerShell):同意所有人。
服务器设置继续(非高架PowerShell):步骤1,2,3:同意
服务器设置继续(非高架PowerShell):步骤4:在步骤4中不要执行任何操作。
服务器设置继续(非高架PowerShell):步骤5:同意
服务器设置继续(非高架PowerShell):步骤6 :(添加)从C:\ ProgramData \ ssh \ sshd_config取消注释(删除#):#PasswordAuthentication是
服务器设置继续(非高架PowerShell):步骤7 :(添加)在“服务”中,重新启动OpenSSH SSH Server。
我没有发现任何文件有关安全性,权限或Unicode的问题。他们都是开箱即用的。
答案 6 :(得分:0)
这只是我的@n0rds great answer的脚本版本。
将此脚本放在带有您的私钥/公钥/对的目录中并运行!
PowerShell.exe -ExecutionPolicy Bypass -File "C:\bypass\prompt\standard.ps1" 2>&1>$null
Add-WindowsCapability -Online -Name OpenSSH.Server
New-NetFirewallRule -Name sshd -DisplayName 'OpenSSH SSH Server' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 -Program "%WINDIR%\System32\OpenSSH\sshd.exe"
#Must Enable ssh-agent before starting
Set-Service -Name ssh-agent -StartupType Automatic
Set-Service -Name sshd -StartupType Automatic
Start-Service ssh-agent; Start-Service sshd
$sshdir="$env:USERPROFILE\.ssh"
mkdir $sshdir
copy .\id_rsa $sshdir\
cat $sshdir\id_rsa
copy .\*.pub $sshdir\authorized_keys
cat $sshdir\authorized_keys
ssh-add $sshdir\id_rsa
$sshd_config="C:\ProgramData\ssh\sshd_config"
(Get-Content $sshd_config) -replace '#PubkeyAuthentication', 'PubkeyAuthentication' | Out-File -encoding ASCII $sshd_config
(Get-Content $sshd_config) -replace 'AuthorizedKeysFile __PROGRAMDATA__', '#AuthorizedKeysFile __PROGRAMDATA__' | Out-File -encoding ASCII $sshd_config
(Get-Content $sshd_config) -replace 'Match Group administrators', '#Match Group administrators' | Out-File -encoding ASCII $sshd_config
cat C:\ProgramData\ssh\sshd_config
Restart-Service ssh-agent; Restart-Service sshd
Write-Host "Use this to Login/test Now"
write-host ssh $env:UserName@localhost
答案 7 :(得分:0)
在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
文件中只有SYSTEM和Administrators组必须具有权限,而不能继承。
答案 8 :(得分:0)
这是一个非常以英语为中心的默认 Microsoft 使用。 组匹配行当前检查名为“管理员”的管理员组的 ENGLISH 语言版本字符串,这在许多其他语言的 Windows 安装上失败。在德语安装中,该行需要改为“administratoren”。它们更好地使按 SID 匹配组成为可能。 (这在 DenyGroups 匹配功能中更为重要 - 尚未对此进行测试 - 但如果他们在那里检查字符串而不是 SID,则拒绝是没有意义的,并且可以通过使用不同的 Windows 语言安装轻松绕过)
(另见https://github.com/MicrosoftDocs/windowsserverdocs/issues/1911#issuecomment-771552030)