概述

随着量子计算技术的发展,传统加密算法面临潜在威胁。SSH 作为最常用的远程访问协议,其安全性尤为重要。本文介绍 OpenSSH 后量子密钥交换的配置方法,帮助管理员保护 SSH 连接免受"现在收集,以后解密"(Harvest Now, Decrypt Later)攻击。

为什么需要后量子密钥交换?

“现在收集,以后解密"攻击

即使量子计算机尚未实用化,攻击者已经开始收集加密的 SSH 流量。当量子计算机足够强大时,这些历史数据可能被解密。这就是所谓的"现在收集,以后解密”(也称"收获现在,解密 later")攻击。

OpenSSH 官方文档指出:整个 SSH 连接的隐私取决于密钥协商。如果攻击者能够破解密钥协商,他们就能解密整个会话。攻击者无需实时执行此攻击——他们可以现在收集加密的 SSH 会话,然后在获得量子计算机后解密。

时间线

  • 现在:攻击者开始收集加密数据
  • 2030 年左右:RSA 和 ECDH 可能被量子计算机破解
  • 2035 年:NIST 建议全面迁移到后量子密码学

OpenSSH 后量子支持历程

版本 发布时间 后量子支持
OpenSSH 9.0 2022年4月 默认启用 sntrup761x25519-sha512
OpenSSH 9.9 2024年 新增 mlkem768x25519-sha256
OpenSSH 10.0 2025年4月 mlkem768x25519-sha256 成为默认
OpenSSH 10.1 未来 未使用后量子算法时发出警告
RFC 9941 2026年4月 标准化 sntrup761x25519-sha512

支持的算法

混合密钥交换算法

  1. sntrup761x25519-sha512

    • 混合:NTRU Prime (sntrup761) + X25519
    • SHA-512 用于密钥派生
    • RFC 9941 标准化
  2. mlkem768x25519-sha256

    • 混合:ML-KEM-768 + X25519
    • SHA-256 用于密钥派生
    • NIST FIPS 203 标准
    • 需要 OpenSSH 9.9+

算法选择建议

  • 需要 FIPS 合规性:使用 mlkem768x25519-sha256(NIST 标准)
  • 兼容性优先:使用 sntrup761x25519-sha512(支持更广泛)
  • 最佳实践:同时配置两者,让客户端和服务器协商最佳算法

检查当前配置

检查 OpenSSH 版本

1
ssh -V

输出示例:

1
OpenSSH_9.2p1 Debian-2+deb12u9, OpenSSL 3.0.19 27 Jan 2026
  • OpenSSH 9.0-9.8:支持 sntrup761x25519-sha512
  • OpenSSH 9.9+:支持 mlkem768x25519-sha256sntrup761x25519-sha512

查看支持的密钥交换算法

1
ssh -Q kex

查看默认密钥交换算法优先级

1
sshd -T | grep kexalgorithms

客户端配置

方式一:使用默认配置(推荐)

OpenSSH 9.0 及以上版本默认启用后量子密钥交换,无需额外配置。

方式二:手动指定算法

~/.ssh/config/etc/ssh/ssh_config 中指定:

1
2
3
# 客户端配置 - 优先使用后量子算法
Host *
    KexAlgorithms sntrup761x25519-sha512,mlkem768x25519-sha256,curve25519-sha256

验证连接是否使用后量子算法

使用 -v 参数查看握手详情:

1
ssh -v user@hostname

在输出中查找:

1
debug1: kex: algorithm: sntrup761x25519-sha512

或使用以下命令查看更详细的信息:

1
ssh -vv user@hostname 2>&1 | grep -E "kex:|algorithm:"

禁用弱加密警告

OpenSSH 10.1+ 会在连接不使用后量子算法时发出警告。如需禁用:

1
2
3
# 对特定主机禁用警告
Host old-server.example.com
    WarnWeakCrypto no-pq-kex

服务器配置

查看当前服务器配置

1
sshd -T | grep kexalgorithms

配置服务器端优先算法

编辑 /etc/ssh/sshd_config

1
2
# 服务器配置 - 优先使用后量子算法
KexAlgorithms sntrup761x25519-sha512,mlkem768x25519-sha256,curve25519-sha256

重启 SSH 服务

1
2
3
4
5
# Debian/Ubuntu
sudo systemctl restart sshd

# RHEL/CentOS
sudo systemctl restart sshd

验证服务器配置

1
sshd -T | grep kexalgorithms

验证后量子密钥交换

测试本地连接

1
2
# 使用 localhost 测试
ssh localhost whoami

使用 tcpdump 验证

在另一个终端运行:

1
2
# 捕获 SSH 握手过程中的密钥交换消息
sudo tcpdump -i lo -nn -v port 22 2>&1 | grep -i "kex\|ecdh\|sntrup\|mlkem"

使用 Wireshark 分析

  1. 捕获 SSH 握手包
  2. 查看 SSH 协议解码
  3. 在 “Key Exchange” 部分确认使用的算法

故障排除

问题:连接失败

症状:配置后无法连接

排查步骤

  1. 检查 OpenSSH 版本是否支持所需的算法
  2. 检查服务器和客户端配置是否兼容
  3. 查看日志:
1
2
3
4
5
# 客户端日志
ssh -vvv user@hostname

# 服务器日志
sudo journalctl -u sshd -f

问题:算法不被识别

症状:sshd: unrecognized keyword KexAlgorithms

排查

  1. 确认 OpenSSH 版本支持该算法
  2. 检查配置文件语法
  3. 使用 sshd -t 测试配置:
1
sudo sshd -t

问题:回退到传统算法

症状:日志显示使用了 curve25519-sha256

排查

  1. 检查双方都支持后量子算法
  2. 确认配置正确且已重载
  3. 检查是否有中间设备干扰

未来展望

ML-DSA 主机密钥

当前 SSH 使用 Ed25519 或 RSA 作为主机密钥,这些仍然是传统算法。IETF 正在制定 ML-DSA(基于 ML-KEM 的数字签名算法)标准。

预计:

  • 2026-2027 年:ML-DSA SSH 草案标准化
  • 2027-2028 年:OpenSSH 实现 ML-DSA 主机密钥
  • 2030 年后:逐步迁移到纯后量子签名

迁移时间线建议

时间 操作
现在 确保 OpenSSH 9.0+,使用默认后量子 KEX
2026-2027 升级到 OpenSSH 10.0+,启用 mlkem768x25519-sha256
2028-2030 准备 ML-DSA 主机密钥迁移
2035 年前 完成所有传统算法的迁移

总结

OpenSSH 自 9.0 版本起默认启用后量子密钥交换,为 SSH 连接提供量子安全保护。通过本文的配置指南,管理员可以:

  1. 验证当前状态:确认 OpenSSH 版本和默认配置
  2. 启用后量子算法:在需要时手动配置优先级
  3. 监控连接:验证实际使用的密钥交换算法
  4. 规划未来:关注 ML-DSA 等后量子签名算法的进展

保护 SSH 连接免受未来量子计算威胁,现在是最好的时机。

参考来源