SSH 密钥交换(Key Exchange)是 SSH 协议中最关键的安全机制之一,它确保了客户端和服务器能够在不安全的网络上安全地协商出会话密钥,而不会泄露密钥信息。
密钥交换的目的
- 安全协商会话密钥:在不安全的网络上安全地建立共享密钥
- 防止中间人攻击:确保通信双方的身份验证
- 前向保密:即使长期密钥泄露,过去的会话仍然安全
- 密钥独立性:每个会话使用不同的密钥
密钥交换算法
Diffie-Hellman (DH) 算法
传统的密钥交换算法,基于离散对数问题的数学难题。
bash# 常见的 DH 组 diffie-hellman-group1-sha1 # 1024 位(已弃用) diffie-hellman-group14-sha1 # 2048 位(已弃用) diffie-hellman-group16-sha512 # 4096 位 diffie-hellman-group18-sha512 # 8192 位
工作原理:
- 双方约定公开参数(p, g)
- 各自生成私有密钥(a, b)
- 计算公开值(A = g^a mod p, B = g^b mod p)
- 交换公开值
- 计算共享密钥(s = B^a mod p = A^b mod p)
Elliptic Curve Diffie-Hellman (ECDH)
基于椭圆曲线离散对数问题,提供相同安全性下更小的密钥尺寸。
bash# 常见的 ECDH 算法 curve25519-sha256@libssh.org # 推荐 ecdh-sha2-nistp256 # NIST P-256 ecdh-sha2-nistp384 # NIST P-384 ecdh-sha2-nistp521 # NIST P-521
优势:
- 更快的计算速度
- 更小的密钥尺寸
- 更好的安全性
- 适合移动设备
SSH 密钥交换流程
1. 算法协商
shellClient -> Server: KEXINIT(支持的算法列表) Server -> Client: KEXINIT(支持的算法列表)
双方选择第一个共同支持的算法。
2. 密钥交换
shellClient -> Server: DH 公开值 + 签名 Server -> Client: DH 公开值 + 签名 + 主机密钥
3. 密钥计算
双方使用 DH 公开值计算共享密钥,然后派生出:
- 加密密钥(用于数据加密)
- MAC 密钥(用于数据完整性)
- IV(初始化向量)
4. 身份验证
shellClient -> Server: NEWKEYS Server -> Client: NEWKEYS
确认密钥交换完成,开始使用新密钥。
安全特性
前向保密(Perfect Forward Secrecy)
即使服务器的私钥泄露,攻击者也无法解密过去的会话。
bash# 启用前向保密的配置 KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
密钥重用保护
防止密钥重放攻击,每个会话生成新的密钥。
强随机数生成
使用加密安全的随机数生成器,确保密钥的不可预测性。
配置优化
推荐的密钥交换算法
bash# /etc/ssh/sshd_config # 优先使用 Curve25519 KexAlgorithms curve25519-sha256@libssh.org # 备用算法 KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
禁用不安全的算法
bash# 禁用 SHA-1 算法 KexAlgorithms -diffie-hellman-group1-sha1,-diffie-hellman-group14-sha1 # 禁用弱 DH 组 KexAlgorithms -diffie-hellman-group1-sha1
性能优化
bash# 使用更快的算法 KexAlgorithms curve25519-sha256@libssh.org # 增加 DH 组大小 ModulusSize 4096
安全最佳实践
- 使用现代算法:优先使用 Curve25519
- 定期更新:保持 SSH 软件最新
- 禁用弱算法:移除不安全的密钥交换算法
- 监控日志:检查密钥交换相关的错误
- 测试配置:使用
ssh -Q kex查看支持的算法
常见问题
Q: 为什么需要密钥交换?
A: 密钥交换允许双方在不安全的网络上安全地协商密钥,而无需预先共享密钥。
Q: Curve25519 比 RSA 好在哪里?
A: Curve25519 提供更好的性能、更小的密钥尺寸和更强的安全性。
Q: 如何检查服务器支持的密钥交换算法?
A: 使用 nmap --script ssh2-enum-algos -p 22 hostname 或 ssh -Q kex。
SSH 密钥交换是保障 SSH 安全性的核心技术,理解其工作原理对于系统安全至关重要。