93

我在使用公钥身份验证为 Windows 设置 OpenSSH 时遇到问题。

我有这个在我的本地桌面上工作,并且可以使用来自 Unix 机器或其他用于 Windows 机器的 OpenSSH 的密钥进行 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. 为 Windows 安装 OpenSSH
  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 密钥,并确保在主目录中创建文件
  9. 为每个用户添加了 authorized_keys 文件到 .ssh 目录中,并为传入的连接用户添加了密钥
  10. net stop opensshd/net start opensshd
  11. 测试密码身份验证是否在本地和远程都有效
  12. 更新了 sshd_config,以启用密钥身份验证 - 重新启动 opensshd
  13. 测试连接并得到上述错误。此外,它甚至不尝试密码验证。
  14. 更新 sshd_config,完全禁用密码验证 - 重新启动 opensshd
  15. 测试连接,仍然出现上述错误

似乎服务器出于某种原因正在终止连接。

4

11 回答 11

271

以下是 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

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

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

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

服务器设置继续(非提升的 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. 右键authorized_keys,转到Properties -> Security -> Advanced
    3. 点击“禁用继承”;
    4. 出现提示时选择“将继承的权限转换为此对象的显式权限”;
    5. (真的,真的很重要)删除文件上的所有权限,除了SYSTEMand你自己。文件上必须正好有两个权限条目。一些指南建议运行Repair-AuthorizedKeyPermission $env:USERPROFILE\.ssh\authorized_keys- 这将尝试将sshd用户添加到权限列表中,它破坏身份验证,因此,不要这样做,或者至少不同意添加sshd用户)。您和您自己都SYSTEM应该完全控制该文件。
  5. C:\ProgramData\ssh\sshd_config如果您的 Windows 版本是 1809 或更高版本,则需要在文件中注释掉以下行。然后重启sshd服务。
    # Match Group administrators                                                    
    #       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys  
    

客户:

  1. 运行ssh <serverusername>@<serverhostname>。它应该在这一点上工作。

尝试将 Windows 10 作为服务器,并将其本身和 Debian Linux 作为客户端。

于 2018-05-24T06:02:30.457 回答
19

在 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 组必须对文件具有权限而不继承。

administrators_authorized_keys 权限集

于 2020-11-17T02:12:32.583 回答
9

如果您遇到困难,另一个提示是在调试模式下运行 sshd。我这样做了:

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

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

于 2020-07-11T06:35:35.300 回答
7

我已经解决了这个问题...

它与启动服务的帐户有关 - 它正在使用本地系统帐户 - 这正在阻止它访问公钥和 authorized_keys 文件。

一旦我停止服务并以我试图连接的用户身份启动,它就起作用了!

所以基本上,您需要从服务帐户开始,然后外部用户以该用户身份连接。

于 2013-04-25T11:30:21.693 回答
4

这只是我的@n0rds 好答案的脚本版本。

将此脚本放在带有您的私钥/公钥/对的目录中并运行!

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
于 2020-10-31T22:26:26.250 回答
3

如果您使用的是 mls-software.com 的 OpenSSH 版本,这里还有一个注意事项。

如果您使用 SSHD_SERVER 帐户和权限分离进行安装,您将能够使用公钥身份验证(根据http://www.mls-software.com/opensshd-pki.html)。但是,如果启用 UAC,您将无法成功安装。将无法正确创建用户,也不会创建服务。事后手动尝试获取这些项目非常困难。在安装前简单地禁用 UAC 将允许安装过程正确创建用户和服务。安装后,您可以重新启用 UAC。

当我手动创建 SSHD_SERVER 帐户时,使用密码身份验证时身份验证成功,但客户端使用“/bin/bash: Operation not allowed”终止连接。服务器关闭了使用公钥的身份验证(Cambolie 发布的原始错误)。

于 2014-11-04T17:25:26.017 回答
1

我通过以下方式解决了它:

  1. 以 SSHD_SERVER + 权限分离模式安装。我还在配置中手动将权限分离设置为“是”。这对我来说很长时间没有用,用户没有被创建。然后它起作用了,我不知道为什么。我只去了控制面板中的用户帐户来检查 UAC 是否关闭。我也有 /var/empty 对每个人都具有完全访问权限。
  2. 对于 C:\openssh\var\empty,我已将“属性获取/设置”权限设置为所有人和我自己,并将“完全”权限设置为 .\sshd_server。我也做了它的主人。
于 2015-06-12T13:34:46.570 回答
0

n0rd 的解决方案很划算,但对于同样属于管理员组的用户来说,还有一个额外的复杂性。如果您正在为涉及以下情况的情况寻找解决方案:

  • 您想在每个用户的基础上使用公钥(或者您不想使用该administrators_authorized_keys文件)。
  • 而且您不想使用 PasswordAuthentication。
  • 并且一些用户也属于 admin 组。

我遇到的问题是,当我尝试 n0rd 的解决方案时,它在上述条件下对用户不起作用。经过一番修修补补,我找到了一个对我始终有效的解决方案。按照 n0rd 的解决方案,只需更改以下内容

ssh_config确保设置以下设置:

AuthorizedKeysFile  .ssh/authorized_keys 
PasswordAuthentication no
PubkeyAuthentication yes

另外,请务必注释掉 Match Group Administrators 设置:

#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys

C:\Users\username\.ssh\authorized_keys确保在服务器文件中包含客户端的公钥。

最后,为了帮助将用户与帐户匹配,我发现更具体地使用客户端上的用户数据很有帮助。我没有使用普通用户名,而是使用了用户名以及服务器上用户的域。就我而言,我的客户C:\Users\UserName\.ssh\config文件如下所示:

Host my_short_name
  HostName my.serveraddress.net
  User serversname\username
  IdentityFile .ssh\id_rsa

在这种情况下,我的 Windows 10 服务器将被称为 serversname(在设备名称下)。通过以这种方式指定用户,我可以避免密码验证。

作为额外的奖励,这与 PowerShell 7 的默认 shell 配合得非常好。甚至我的默认 PowerShell 配置文件也可以通过 ssh 运行,并且我完全支持 posh-git 和 oh-my-posh。但是,我发现建议将 PowerShell 设置为默认 shell 环境的默认方法(通过编辑ssh_conf以包含 'Subsystem powershell c:/progra~1/powershell/7/pwsh.exe -sshs -NoLogo')不适用于我。相反,在服务器上使用提升的 PowerShell 窗口中的命令:

New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value "c:/progra~1/powershell/7/pwsh.exe" -PropertyType String -Force

这只是创建一个注册表项。如果需要,您可以随时弹出注册表以稍后将其删除。

于 2021-11-05T23:21:10.907 回答
0

我遇到了不同的情况。

首先,按照gWay所说的进行调试,另一个终端窗口连接到服务器。

我有read_keyfile_line: C:\\Users\\yieatn\\.ssh/authorized_keys line 1 exceeds size limit

将 authorized_keys 重新编码为 utf-8

原因是我创建了authorized_keys,cat id_rsa >> authorized_keys而powershell中文使用UTF-16创建文件。

于 2021-10-14T14:12:40.943 回答
0

我已经在多台 Windows Pro 1809 和 2004 计算机上彻底测试了 n0rd 的解决方案。我同意他的大部分步骤。

服务器设置(提升的 PowerShell):同意所有。

客户端设置(非提升的 PowerShell):同意所有。

服务器设置继续(非提升的 PowerShell):步骤 1、2、3:同意

服务器设置继续(非提升的 PowerShell): 第 4 步:不要在第 4 步中执行任何操作。

服务器设置继续(非提升的 PowerShell):步骤 5:同意

服务器设置继续(非提升的 PowerShell):第 6 步:(添加)从 C:\ProgramData\ssh\sshd_config 取消注释(删除 #):#PasswordAuthentication 是

服务器设置继续(非提升的 PowerShell): 步骤 7:(添加)在服务中,重新启动 OpenSSH SSH 服务器。

对于任何文件,我没有发现任何关于安全、权限或 Unicode 的问题。他们都是正确的。

于 2020-04-17T18:42:49.953 回答
-1

这是 Microsoft 使用的非常以英语为中心的默认设置。组匹配行当前检查称为“管理员”的管理员组的英语语言版本字符串,这在许多其他语言安装的 Windows 上失败。在德语安装中,该行需要改为“administratoren”。他们最好让 le 按 SID 匹配 group 成为可能。(这在 DenyGroups 匹配功能中更为重要 - 尚未对此进行测试 - 但如果他们在那里检查字符串而不是 SID,那么拒绝是没有意义的,并且很容易通过使用不同的 Windows 语言安装来规避)

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

于 2021-02-02T11:22:48.520 回答