应执行sshd -T | grep kexalgorithms查看当前生效的KEX算法列表,若含diffie-hellman-group1-sha1或diffie-hellman-group14-sha1即存在弱算法;正确禁用方式是显式配置KexAlgorithms curve25519-sha256,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256并重载服务。

如何确认当前 OpenSSH 是否启用了弱密钥交换算法
直接看运行中的 sshd 实际启用的 KEX(密钥交换)列表,比翻配置文件更可靠。很多用户改了 /etc/ssh/sshd_config 却没重载服务,或者被系统默认策略覆盖,导致“以为禁了,其实还在用”。
- 在服务器上执行:
sshd -T | grep kexalgorithms—— 输出的是当前生效的完整 KEX 列表 - 若没显式配置
KexAlgorithms,OpenSSH 8.0+ 默认包含diffie-hellman-group14-sha256等尚可接受的算法,但**仍保留diffie-hellman-group1-sha1和diffie-hellman-group14-sha1(已不安全)** - 客户端连接时加
-vvv参数(如ssh -vvv user@host),在日志里搜debug1: kex: algorithm:行,能看清本次实际协商用的算法
禁用弱 KEX 的正确写法(OpenSSH 7.3+)
不是简单删掉旧算法就行,得显式指定一整套现代、强校验的组合,否则 OpenSSH 可能 fallback 到兼容模式或忽略配置。
- 编辑
/etc/ssh/sshd_config,添加或替换这一行:KexAlgorithms curve25519-sha256,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256 - 必须排除所有带
sha1后缀的算法(如diffie-hellman-group14-sha1),它们已被 NIST 和 CISA 明确标记为不安全 - 不要包含
diffie-hellman-group16-sha512或group18—— 多数老客户端(如旧版 PuTTY、某些嵌入式 SSH 客户端)根本不认识,会导致连接失败 - 改完必须执行:
sudo systemctl reload sshd(不是 restart),避免断开现有连接
为什么 curve25519-sha256 是首选,但不能只留它一个
它速度快、抗侧信道、实现简洁,是目前最推荐的 KEX 算法。但单靠它会牺牲兼容性——不是所有客户端都支持。
- OpenSSH 6.5+ 支持
curve25519-sha256;PuTTY 0.70+ 才支持;旧版 SecureCRT、某些 Java SSH 库(如 JSch 0.1.55 之前)完全不识别 - 所以推荐组合中保留
ecdh-sha2-nistp256和diffie-hellman-group-exchange-sha256作为 fallback:前者广泛支持,后者允许服务端动态提供强 DH 参数 - 别用
diffie-hellman-group14-sha256单独撑场面——它依赖固定 2048-bit 参数,而 NIST 已建议迁移到 3072-bit 起,group-exchange-sha256才能真正启用更强参数
检查是否真生效:连不上时先排查这三处
禁用弱算法后最常见的故障不是加密失败,而是协商中断——客户端根本找不到共同算法,直接断连。
- 查服务端日志:
sudo journalctl -u sshd -n 50 --no-pager | grep "no matching kex",出现这句说明客户端提的 KEX 全被拒了 - 客户端如果是 OpenSSH,临时加
-o KexAlgorithms=+强制启用某个算法测试(例如ssh -o KexAlgorithms=+diffie-hellman-group14-sha1 user@host),确认是否真因 KEX 不匹配 - 注意 Windows 上的 OpenSSH 客户端(Win10 1809+ 自带)默认 KEX 列表比 Linux 旧,可能不含
curve25519-sha256,需升级或手动指定
真正麻烦的不是配错一行,而是不同环境 SSH 版本碎片化太严重——同一份配置,在 CentOS 7、Ubuntu 22.04、macOS 14 和某台老网络设备上表现可能完全不同。每次上线前,务必用目标环境中真实客户端连一次,抓 -vvv 日志看协商结果。

















