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: ...

通常是以下问题之一:

  1. 你连到的不是这台机器的 sshd(网关/NAT/跳板/容器映射端口)
  2. 生效的是另一个端口或另一份 sshd 配置
  3. 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,防止锁死

总结

这条警告本身不影响“能不能连上”,但反映了连接是否具备后量子防护能力。
最稳妥做法是:检测 -> 配置优先算法 -> 重载 -> 强制验证
按照本文流程,你可以快速、批量处理同类服务器。