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 是否复用)。