本文介绍在 Windows 系统上遇到与主机密钥算法不匹配相关的 OpenSSH 连接错误时出现的多种常见原因和解决方案。
通过安全外壳(SSH)连接到服务器时,可能会遇到以下错误:
无法与 <服务器>协商:找不到匹配的主机密钥类型。
主机密钥算法:(不匹配)
拒绝访问(公钥)。
服务器拒绝了密钥。
这些错误通常表示受支持算法不匹配、权限问题或安全问题。
原因 1:更新后的 OpenSSH 版本中禁用 RSA 算法
OpenSSH 8.8 及更高版本默认禁用不安全 ssh-rsa 算法,导致依赖于 RSA 密钥的旧客户端失败连接尝试。
决议
-
备份现有配置:
Copy-Item "C:\ProgramData\ssh\sshd_config" "C:\ProgramData\ssh\sshd_config.bak" -
修改 sshd_config 文件:
-
以管理员身份打开记事本。
-
使用以下命令打开 sshd_config 文件:
notepad "C:\ProgramData\ssh\sshd_config" -
将以下行添加到文件末尾:
PubkeyAcceptedAlgorithms +ssh-rsa HostKeyAlgorithms +ssh-rsa
-
-
重启 OpenSSH 服务:
Restart-Service sshd -
验证 SSH 连接:
ssh -v user@server.example.com
原因 2:authorized_keys文件缺失或不正确或文件权限不正确
连接失败是由于缺少或不正确的 authorized_keys 文件或不正确的文件权限,生成“权限被拒绝”错误。
决议
-
确保文件 authorized_keys 存在:
文件路径: C:\ProgramData\ssh\administrators_authorized_keys
请将您的公钥正确放置在此文件中。
-
正确的文件权限:
确保只有管理员对文件具有写入权限:
icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" -
重启 OpenSSH 服务:
net stop sshd net start sshd
原因 3:注册表中存储的私钥在会话中保留,从而导致安全风险
OpenSSH 的 ssh 代理服务存储的私钥在 Windows 注册表中的会话之间保持,这可能会导致安全风险。
决议
- 生成私钥时,请使用强加密和通行短语。
- 通过用户权限限制注册表访问。
- 定期从官方来源(例如 GitHub)更新 OpenSSH。
- 应定期审核注册表项,并在不需要时清除敏感键。
可选注册表调整
通过注册表策略安全地管理 RSA 密钥:
Set-ItemProperty -Path 'HKLM:\SOFTWARE\Policies\Microsoft\Windows\SSH-Server' -Name AllowRSAKey -Value 1 -Type DWORD
Set-ItemProperty -Path 'HKLM:\System\CurrentControlSet\Services\SSH-Server\Parameters' -Name AllowRSAKey -Value 1 -Type DWORD
建议的常规安全做法
- 保护用户帐户并维护严格的文件权限。
- 定期更新 OpenSSH 以包含最新的安全修补程序。
- 尽可能使用更强大的算法,例如ED25519或 ECDSA。
- 让用户了解安全密钥管理做法。
疑难解答日志和诊断
若要在连接尝试期间收集详细的调试日志,请使用详细 SSH 命令:
ssh -vvv user@hostname
分析从工作和非工作环境收集的日志,以确定配置差异。