我有以下配置:
# SSL certificates
ssl_certificate /etc/letsencrypt/live/domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/domain/privkey.pem;
# Diffie-Hellman parameters for DHE cipher suites
ssl_dhparam /etc/nginx/dhparams.pem;
# Session settings
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m; # about 40000 sessions
ssl_session_tickets off;
# Protocols
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_8_SHA256:TLS_AES_128_CCM_SHA256::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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
add_header Strict-Transport-Security "max-age=63072000" always;
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
# OCSP stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/domain/fullchain.pem;
我将其包含在 ngninx 的 include 指令的网站配置文件中。问题是,虽然该网站完全可以使用安全连接,但未启用 TLS 1.3,并且对其进行测试后会openssl s_client -connect www.dimain.com:443
发送以下内容:
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
这里可能存在什么问题?
更新
问题解决了!我使用的是 nginx 的 ofician 主线 repo 的最新版本,但它是用 OpenSSL v1.1.0 构建的,所以我用 OpenSSL 从源代码构建了 nginx,现在一切都正常了!
答案1
您已在使用最新的 OpenSSL 编译 NGINX 时找到了答案。
然而,从安全角度来看,编译用于网络的软件存在各种不良做法:
- 系统中到处散布的编译软件会带来安全风险
- 更新到 NGINX 的下一个版本(最近的修复可能会更安全)将需要重新编译,如果不小心操作,停机时间会更长
您可以在线找到带有最新 OpenSSL 的预构建 NGINX 版本,这可能是更好的选择。
例如,对于 CentOS/RHEL 6、7 和 8,有NGINX 修改版。除了 TLS 1.3,它还修补了 Cloudflare 完整的 HPACK 支持以及动态 TLS 记录功能。