7.5.5 TLS版本与加密套件加固
TLS版本与加密套件加固的目标是在兼容性与安全性之间取得平衡,优先禁用已知不安全的协议与弱加密套件,统一配置服务端优先策略并启用现代算法。常见安全基线为仅支持 TLS 1.2 与 TLS 1.3,禁用 SSLv2/SSLv3/TLS1.0/TLS1.1,移除 RC4、3DES、NULL、EXPORT 等弱套件,优先使用 ECDHE 提供前向保密。
原理草图(协议协商与套件选择流程):
关键配置示例(/etc/nginx/conf.d/https.conf):
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
# 仅允许 TLS 1.2/1.3
ssl_protocols TLSv1.2 TLSv1.3;
# TLS 1.2 强套件(TLS 1.3 不需要配置)
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:
ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:
ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305';
ssl_prefer_server_ciphers on;
# 椭圆曲线与会话复用
ssl_ecdh_curve X25519:secp256r1;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 10m;
location / {
root /var/www/html;
index index.html;
}
}
命令与解释(配置前后自检):
# 1) 查看 Nginx 是否支持 TLS1.3(OpenSSL 1.1.1+)
nginx -V 2>&1 | grep -o 'OpenSSL[^)]*'
# 预期:OpenSSL 1.1.1 或更高,才支持 TLS1.3
# 2) 检查配置语法
nginx -t
# 预期:syntax is ok / test is successful
# 3) 仅用 TLS1.2 测试握手
openssl s_client -connect example.com:443 -tls1_2 </dev/null
# 预期:Protocol : TLSv1.2,且 Cipher 为 GCM/CHACHA20
# 4) TLS1.0/1.1 应该失败
openssl s_client -connect example.com:443 -tls1 </dev/null
openssl s_client -connect example.com:443 -tls1_1 </dev/null
# 预期:handshake failure 或 no protocols available
# 5) 扫描支持的协议与套件(需安装 nmap)
nmap --script ssl-enum-ciphers -p 443 example.com
# 预期:仅列出 TLS1.2/TLS1.3 及强套件
安装与依赖说明(保证 TLS1.3 能力):
# CentOS/RHEL 8+
yum install -y nginx openssl
# Ubuntu 20.04+
apt-get update && apt-get install -y nginx openssl
# 若 OpenSSL 版本过低,需升级系统或替换为高版本构建的 Nginx
常见问题与排错:
1) 现象:客户端提示 “protocol version”
原因:客户端不支持 TLS1.2+,被策略拒绝。
处理:评估是否需要放开旧版本;若必须兼容,单独开低安全域名/端口。
2) 现象:部分旧 Java 客户端握手失败
原因:只支持少量 RSA 套件。
处理:在 TLS1.2 套件中保留 ECDHE-RSA-AES128-GCM-SHA256 等兼容套件。
3) 现象:TLS1.3 未生效
原因:Nginx 使用旧 OpenSSL。
处理:升级 OpenSSL 或使用官方带 1.1.1+ 的 Nginx 版本。
验证清单:
- 协议版本仅支持 TLS1.2/1.3
- 无 RC4/3DES/NULL/EXPORT
- 前向保密(ECDHE)已启用
- RSA 证书密钥长度 ≥ 2048
- 与 CDN/负载均衡策略一致,避免下游降级
练习:
1) 在测试域名上仅开启 TLS1.2/1.3,验证 TLS1.0/1.1 连接失败。
2) 将 ssl_ciphers 精简为仅 GCM 套件,比较 nmap 输出的差异。
3) 使用 openssl s_client 验证会话复用是否生效(关注 Session-ID 是否复用)。