SSH 出现“not using a post-quantum key exchange algorithm”怎么办(可复用排查与修复手册)
一篇可直接复用的 SSH 后量子密钥交换(PQ KEX)排查与修复指南,覆盖检测、配置、验证、常见误区与临时降噪方案。
在使用较新版本 OpenSSH 客户端连接服务器时,很多人会看到这条警告:
** WARNING: connection is not using a post-quantum key exchange algorithm.
** This session may be vulnerable to "store now, decrypt later" attacks.
这不是应用故障,也不代表 SSH 连接不可用。它的含义是:当前会话没有使用后量子/混合密钥交换(PQ KEX),从长期安全视角存在“先存流量、未来解密”的风险。
本文给你一套可复用的处理流程,后续遇到同类服务器可直接照做。
1. 快速判断是否需要处理
先在本地查看本次握手到底用了什么算法(禁用连接复用,避免误判):
SSH_OPTS="-p 22 -i ~/.ssh/id_rsa -S none -o ControlMaster=no -o ControlPath=none -o ControlPersist=no"
ssh $SSH_OPTS user@host -vv 'exit' 2>&1 | sed -n 's/.*kex: algorithm: //p' | tail -1
判断标准:
- 输出
mlkem...或sntrup...:已使用 PQ/混合算法,通常可忽略警告 - 输出
curve25519.../ecdh.../diffie-hellman...:未使用 PQ,建议修复
2. 服务端标准修复(推荐)
在服务器上新增一个独立配置文件,避免改坏主配置:
sudo tee /etc/ssh/sshd_config.d/00-pq-kex.conf >/dev/null <<'EOF'
KexAlgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org
EOF
sudo sshd -t
sudo systemctl reload sshd
说明:
sntrup...放第一优先- 保留
curve25519...作为兼容回退,避免老客户端无法连接
3. 修复后验证(必须做)
强制客户端只用 sntrup 测试:
ssh $SSH_OPTS -o KexAlgorithms=sntrup761x25519-sha512@openssh.com user@host 'exit'
再看实际协商算法:
ssh $SSH_OPTS -vv user@host 'exit' 2>&1 | sed -n 's/.*kex: algorithm: //p' | tail -1
目标输出:sntrup761x25519-sha512@openssh.com(或你配置的 PQ 算法)。
4. 常见“看起来配好了但仍失败”的原因
如果你看到:
Unable to negotiate ... no matching key exchange method found. Their offer: ...
通常是以下问题之一:
- 你连到的不是这台机器的 sshd(网关/NAT/跳板/容器映射端口)
- 生效的是另一个端口或另一份 sshd 配置
- sshd 没有重载到新配置
建议排查命令:
# 看目标端口由谁监听
sudo ss -tlpn | grep ':<PORT>'
# 看该端口最终生效配置
sudo /usr/sbin/sshd -T -C user=<USER>,addr=<CLIENT_IP>,lport=<PORT> | grep kexalgorithms
5. 临时降噪(不提升安全)
如果你暂时不能改服务器,只想去掉本地警告:
ssh -o WarnWeakCrypto=no user@host
或写入 ~/.ssh/config。
注意:这只是隐藏提示,不是安全修复。
6. 建议的长期策略
- 优先升级服务器 OpenSSH(保持较新稳定版本)
- 标准化
sshd_config.d配置方式 - 每次改动都做“强制算法测试 + 实际握手验证”
- 保留一个已登录会话再重载 sshd,防止锁死
总结
这条警告本身不影响“能不能连上”,但反映了连接是否具备后量子防护能力。
最稳妥做法是:检测 -> 配置优先算法 -> 重载 -> 强制验证。
按照本文流程,你可以快速、批量处理同类服务器。