使用公钥身份验证为Windows设置OpenSSH

时间:2013-04-25 10:51:39

标签: windows ssh public-key-encryption openssh public-key

我在使用公钥认证设置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中启用了公钥,它只会尝试使用密钥,然后使用上述消息弹出,甚至不会尝试使用密码。

以下是我采取的步骤:

  1. 安装OpenSSH for Windows
  2. mkgroup -l>> .. \ etc \ group(添加了本地组)
  3. mkgroup -d>> .. \ etc \ group(已添加的域组)
  4. mkpasswd -L -u openssh>> .. \ passwd(添加了我的本地用户)
  5. mkpasswd -D -u jsadmint2232>> .. \ passwd(添加了我的域用户)
  6. 在passwd中编辑homedir指向c:\ sshusers \%USER% - 其中%USER%是用户名
  7. 启用密码验证,禁用密钥验证
  8. 为jsadmint2232 / openssh创建了ssh密钥并确保文件是在homedirs中创建的
  9. 为每个用户添加authorized_keys文件到.ssh dirs,并为传入的连接用户添加了密钥
  10. net stop opensshd / net start opensshd
  11. 测试密码身份验证在本地和远程工作
  12. 更新了sshd_config,以启用密钥身份验证 - 重新启动opensshd
  13. 测试连接并获得上述错误,甚至不尝试密码验证?
  14. 更新了sshd_config,以完全禁用密码验证 - 重新启动opensshd
  15. 测试连接但仍然出现上述错误
  16. 服务器出于某种原因似乎正在终止连接?

9 个答案:

答案 0 :(得分:35)

以下是Windows 10 v.1803附带的OpenSSH的设置步骤(2018年4月更新。请参阅此帖子的评论,它可能不适用于1809)。

服务器设置(提升的powershell):

  1. 安装OpenSSH服务器:Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

  2. 启动代理和sshd服务:Start-Service ssh-agent; Start-Service sshd(这将在$env:ProgramData\ssh中自动生成主机密钥和默认配置。)

  3. [可选]安装OpenSSHUtils powershell模块:Install-Module -Force OpenSSHUtils

  4. 客户端设置(非提升的PowerShell):

    1. 生成用户密钥:cd $env:USERPROFILE\.ssh; ssh-keygen.exe,按照提示操作,同意默认建议的文件位置。这将创建2个文件:id_rsaid_rsa.pub;

    2. [可选]向身份验证代理添加密钥,因此每次使用时都不必输入密码:ssh-add .\id_rsa(或生成的任何文件);

    3. 服务器设置继续(非提升的PowerShell):

      1. 以用户身份登录,使用公钥身份验证
      2. cd $env:USERPROFILE; mkdir .ssh; cd .ssh; New-Item authorized_keys;
      3. id_rsa.pub文件的内容从客户端粘贴到上一步的.ssh\authorized_keys文件中。
      4. 正确设置权限(重要!!!):
        1. 运行start .以使用当前文件夹($env:USERPROFILE\.ssh);
        2. 打开资源管理器
        3. 右键点击authorized_keys,转到Properties -> Security -> Advanced
        4. 点击“停用继承”;
        5. 出现提示时选择“将继承的权限转换为对此对象的显式权限”;
        6. (真的,非常重要)除了SYSTEM和你自己之外,删除文件上的所有权限。文件上必须有两个权限条目。有些指南建议运行Repair-AuthorizedKeyPermission $env:USERPROFILE\.ssh\authorized_keys - 这会尝试将sshd用户添加到权限列表中,而破坏身份验证,因此,请勿执行此操作,或者至少不同意添加sshd用户)。 SYSTEM和你自己都可以完全控制文件。
      5. 客户端:

        1. 运行ssh <serverusername>@<serverhostname>。它应该在这一点上起作用。
        2. 尝试将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。我是这样做的:

  1. 停止 sshd 服务
  2. 使用管理员权限打开PowerShell控制台
  3. 输入“ sshd -d”
  4. 在我的客户端计算机上
  5. 键入登录

事实证明密钥需要在例如 C:\ ProgramData \ ssh \ administrators_authorized_keys ,而不是 C:\ Users \ yourUsser.ssh \ authorized_keys

答案 4 :(得分:1)

我解决了它:

  1. 以SSHD_SERVER +权限分离模式安装。我还在配置中手动将权限分离设置为“是”。这对我很长时间没用,用户没有被创建。然后它工作,我不知道为什么。我只去控制面板中的用户帐户检查UAC是否已关闭。我也有/ var / empty,每个人都可以完全访问。
  2. 对于C:\ openssh \ var \ empty我为Everyone和我设置了“attributes get / set”权限,并为。\ sshd_server设置了“完全”权限。我也把它作为主人。

答案 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组必须具有权限,而不能继承。

Permission set of administrators_authorized_keys

答案 8 :(得分:0)

这是一个非常以英语为中心的默认 Microsoft 使用。 组匹配行当前检查名为“管理员”的管理员组的 ENGLISH 语言版本字符串,这在许多其他语言的 Windows 安装上失败。在德语安装中,该行需要改为“administratoren”。它们更好地使按 SID 匹配组成为可能。 (这在 DenyGroups 匹配功能中更为重要 - 尚未对此进行测试 - 但如果他们在那里检查字符串而不是 SID,则拒绝是没有意义的,并且可以通过使用不同的 Windows 语言安装轻松绕过)

(另见https://github.com/MicrosoftDocs/windowsserverdocs/issues/1911#issuecomment-771552030