必须显式指定现代KexAlgorithms(如curve25519-sha256,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256)并排除所有sha1算法,再通过sshd -t检查、systemctl reload重载、sshd -T验证生效,否则将回退至不安全默认值或协商失败。

要真正禁用过时的密钥交换协议,不能只靠“删掉旧算法”,而必须显式指定一整套现代、安全且服务端实际支持的 KexAlgorithms。否则 OpenSSH 会回退到默认列表(含不安全项)或协商失败。
确认当前生效的密钥交换算法
别信配置文件,看运行时真实启用的列表:
- 在服务器上执行:sudo sshd -T | grep kexalgorithms —— 输出即为当前生效值
- 若结果中出现 diffie-hellman-group1-sha1 或 diffie-hellman-group14-sha1,说明弱算法仍在使用
- 连接时加 ssh -vvv user@host,搜索日志中的 debug1: kex: algorithm: 行,可验证本次实际协商结果
正确配置 KexAlgorithms 参数
编辑 /etc/ssh/sshd_config,添加或替换这一行(顶格写,逗号后无空格):
KexAlgorithms curve25519-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256
- 必须排除所有带 sha1 后缀的算法(如 group14-sha1),NIST 和 CISA 已明确弃用
- 避免单独保留 curve25519-sha256 —— 它虽快且安全,但老旧客户端(如 Xshell5、旧版 PuTTY)可能不支持,导致连接中断
- 保留 diffie-hellman-group-exchange-sha256 是关键:它允许服务端动态提供强 DH 参数(如 3072-bit+),而非硬编码弱参数
- 不要加入 group16-sha512 或 group18 —— 兼容性差,多数生产环境客户端尚不识别
应用配置并验证是否生效
改完不是直接重启,而是重载服务:
- 先检查语法:sudo sshd -t(无输出即通过)
- 再重载配置:sudo systemctl reload sshd(不中断已有连接)
- 重连测试后,再次运行 sudo sshd -T | grep kexalgorithms 确认输出已更新
- 若新客户端连不上,优先查日志:sudo journalctl -u sshd -n 50 --no-pager,重点找 “no matching key exchange method” 类报错
禁用弱 KEX 的本质不是做减法,而是用明确、兼容、现代的算法集覆盖默认行为。操作本身不复杂,但漏掉重载、写错格式、或忽略客户端兼容性,就容易把门锁死在外面。


















