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

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

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

我在本地桌面上运行它,可以使用来自 Unix 机器或其他适用于 Windows 机器的 OpenSSH 的 key 进行 ssh。

我已经将构建复制到服务器上,我可以让密码身份验证正常工作,但是当我使用 key 时,我遇到了以下问题:

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 连接到本地主机,但即使在远程尝试时,我也会遇到同样的问题。

更奇怪的是,当我在 sshd_config 中同时启用密码和公钥时,它只会尝试使用 key ,然后用上面的消息轰炸,甚至不会尝试使用密码。

以下是我采取的步骤:

  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 中的主目录以指向 c:\sshusers%USER% - 其中 %USER% 是用户名
  7. 启用密码验证,禁用 key 验证
  8. 为 jsadmint2232/OpenSSH 创建 SSH key 并确保文件是在主目录中创建的
  9. 将 authorized_keys 文件添加到每个用户的 .ssh 目录中,并为传入的连接用户添加 key
  10. net 停止 opensshd/net 启动 opensshd
  11. 测试密码验证是否在本地和远程都有效
  12. 已更新 sshd_config,以启用 key 身份验证 - 重新启动 opensshd
  13. 测试连接并得到上述错误。此外,它甚至不尝试密码验证。
  14. 更新了 sshd_config,以完全禁用密码验证 - 重新启动 opensshd
  15. 测试连接,仍然出现上述错误

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

最佳答案

以下是 Windows 10 v.1803(2018 年 4 月更新)附带的 OpenSSH 的设置步骤。请参阅本文的评论,它可能不适用于 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 中自动生成主机 key 和默认配置)。

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

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

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

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

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

  1. 以用户身份登录,要使用的公钥auth
  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. (真的,真的很重要)删除除 SYSTEM 之外的所有文件权限和你自己。文件中必须有恰好两个权限条目。一些指南建议运行 Repair-AuthorizedKeyPermission $env:USERPROFILE\.ssh\authorized_keys - 这将尝试添加 sshd用户添加到权限列表,它破坏身份验证,所以不要这样做,或者至少不同意添加 sshd用户)。两者 SYSTEM并且您自己应该可以完全控制该文件。
  5. 如果您的 Windows 版本是 1809 或更高版本,则需要在 C:\ProgramData\ssh\sshd_config 中注释掉以下行文件。然后重新启动 sshd服务。
    # Match Group administrators                                                    
    #       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys  
    

客户:

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

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

关于windows - 使用公钥身份验证为 Windows 设置 OpenSSH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16212816/

相关文章:

c++ - 正确地将字符串添加到 Windows 注册表中的 REG_BINARY 类型

java - Apache mina-sshd ssh 客户端总是打印 EdDSA provider not supported

linux - 命令行公钥加密实用程序

php - 无法解密数据 - openssl_private_decrypt() : key parameter is not a valid private key

Ruby OpenSSL 无法解密

windows - 在 Windows 上安装 Redis 4(最新稳定版)

c# - 如果还设置了 InitialDirectory,OpenFileDialog 是否可以自动选择具有 FileName 中设置的值的文件?

c# - 在C#中使用参数委托(delegate)给其他线程

ssh - Clojure - 如何远程连接到正在运行的 REPL 进程

shell - jenkins 上的交互式 shell 脚本