OpenSSH 报 no matching host key type found,允许 ssh-rsa 后又要求密码
连接旧 SSH 服务时,客户端先报 no matching host key type found,并列出 Their offer: ssh-rsa;增加 HostKeyAlgorithms +ssh-rsa 后,连接继续了,却没有使用原来的公钥登录,而是要求密码。这两个现象发生在不同认证阶段,不能用同一个选项解释。
连接旧 SSH 服务时,客户端先报 no matching host key type found,并列出 Their offer: ssh-rsa;增加 HostKeyAlgorithms +ssh-rsa 后,连接继续了,却没有使用原来的公钥登录,而是要求密码。这两个现象发生在不同认证阶段,不能用同一个选项解释。
OpenSSH 8.8 起默认禁用基于 SHA-1 的 RSA 签名。这里的 ssh-rsa 算法与“RSA 密钥”不能混为一谈:同一把 RSA 密钥可以使用 RSA/SHA-256 或 RSA/SHA-512 签名,OpenSSH 从 7.2 起支持这些方式。现代两端能够协商更强签名时,不需要仅因公钥文本以 ssh-rsa 开头就重建密钥。
本文处理现代客户端连接只支持旧签名的遗留服务。发行版的加密策略和具体构建还可能施加额外限制,不能保证配置选项能重新启用被系统禁用或不再实现的算法。
主机身份通过后,才轮到用户公钥
HostKeyAlgorithms 控制服务端证明自身身份时,客户端接受哪些主机密钥签名算法。没有共同算法时,连接在用户登录之前就会失败;修改 authorized_keys 或用户私钥权限不会修复这一阶段的协商。
PubkeyAcceptedAlgorithms 控制客户端用于用户公钥认证的签名算法。主机认证通过后,旧服务端如果不支持客户端默认使用的 RSA/SHA-2 签名,用户公钥认证仍可能失败,随后退到密码等其他可用方式。
先用与原连接一致的主机、端口、跳板和身份选项查看调试输出:
ssh -v operator@legacy.example.com
地址和用户名是占位值。区分“没有共同主机算法”“用户密钥未被提供”“密钥已提供但不被接受”。仅仅出现密码提示也可能是账号、授权文件或密钥选择有误,不能立即认定需要允许 SHA-1。日志含连接信息与指纹,分享前应脱敏,不需要输出私钥内容。
优先修正遗留端能力
能够维护服务端时,应按设备或系统支持的流程升级,或配置双方均支持的现代主机密钥及用户认证方式。更换主机密钥会涉及客户端信任记录,应通过可信渠道确认新指纹;不能把删掉 known_hosts 当作算法升级步骤。
不要假定一个很旧的服务端支持 Ed25519,也不要把新生成的用户公钥当成服务端主机密钥。先核对实际软件能力和部署流程,保留可用管理入口,避免一次改动把远程维护通道全部关掉。
必须临时兼容时,只限定目标主机
只有确认对端确实需要旧 RSA/SHA-1、并接受相应风险时,才使用针对该主机的临时例外。可以先仅对一次连接允许主机算法:
ssh -o HostKeyAlgorithms=+ssh-rsa operator@legacy.example.com
+ 表示追加到默认集合,保留更强算法,而不是用 ssh-rsa 替换整个集合。仍需验证服务端指纹;允许一种算法不等于确认了对端身份。
若主机认证已经通过,进一步确认用户 RSA 认证也因签名兼容失败,才增加用户认证选项:
ssh -o HostKeyAlgorithms=+ssh-rsa \
-o PubkeyAcceptedAlgorithms=+ssh-rsa \
operator@legacy.example.com
这不会替你授权一把未在服务端登记的公钥,也不会修复错误账号。保留原本必要的 IdentityFile 等连接配置,不要因密码提示批量修改服务端授权文件。
需要短期保存时,把例外写在自己的配置中,限定专用别名:
Host legacy-maintenance
HostName legacy.example.com
User operator
HostKeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
以后只在需要时连接 legacy-maintenance。不要放到 Host *,也不要顺手开放 ssh-dss、旧密钥交换或全部密码套件。其他协商错误应按对应字段单独调查。这里使用现代客户端的选项名称,不用旧教程中的名称反推当前默认值。
确认协商结果并撤销临时例外
可用 ssh -G legacy-maintenance 检查有效配置,但它只输出配置,不会验证登录。还需建立新的连接,确认目标指纹、账号和实际公钥认证结果;已有复用连接不能代替新握手检查。
升级或重配遗留端后,先去掉这两项临时例外,再验证新连接能够使用双方支持的现代算法完成认证。记录哪些目标仍依赖旧签名,避免例外长期遗忘。
若临时修改影响其他目标,恢复本次 Host 块即可;一次性命令参数不持久修改配置。恢复配置不会升级服务端,也不会撤销已完成的远端操作,因此仍要按维护流程核对实际系统状态。


