nginx 的 HTTPS 安全配置及 TLS 1.3 踩坑
防止默认配置导致暴漏域名
通过IP扫描,然后浏览器HTTPS访问会在证书里暴漏网站域名。
或者通过访问已知的,未配置HTTPS证书的域名,会暴漏有证书的第一个域名
有两种方式,一种是生成一个证书配置一个default_server。
一种是通过nginx 1.19.4 以后的ssl指令配置default_server。
生成证书配置默认网站
生成localhost证书:
cd /usr/local/nginx/conf/ssl/
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout localhost.key
-out localhost.crt
配置默认网站:
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_certificate ssl/localhost.crt;
ssl_certificate_key ssl/localhost.key;
return 444;
}
通过IP访问不会再暴漏域名
ssl_reject_handshake 指令
nginx版本大于 1.19.4可以使用该指令,无需创建假证书
http://nginx.org/en/docs/http/ngx_http_ssl_module.html
server {
listen 80 default_server;
listen 443 ssl default_server;
server_name _;
ssl_reject_handshake on;
return 444;
}
TLS安全配置
PCI DSS合规认证需要TLS 1.2
查看:https://ssl-config.mozilla.org/
看到TLS 1.2已经是默认配置,并且:
Supports Firefox 27, Android 4.4.2, Chrome 31, Edge, IE 11 on Windows 7, Java 8u31, OpenSSL 1.0.1, Opera 20, and Safari 9
XP系统安装chrome完美支持TLS 1.2,绝大多数环境都能够很好的工作。
XP可用的chrome 49
链接:https://caiyun.139.com/m/i?175CjfVEgFn0o
提取码:Tbo2
kb931125-rootsupd,XP证书补丁kb931125
链接:https://caiyun.139.com/m/i?175CdDrzQiA5d
提取码:SDKS
重点就是:ssl_ciphers
、ssl_prefer_server_ciphers
因为RC4,md5、sha1、des等算法都是不安全的
TLSv1.3 需要openssl 1.1.1版本,目前国内大型网站都未使用,Apple,Mozilla、GitHub都是使用的,握手时间更短,算法更安全。
ssl_protocols TLSv1.2;
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:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
OCSP stapling一般只有Apple系需要
可以通过curl测试,Linux版的curl的tls选项都是正常的,Windows版的向下兼容,不够准确。
curl -I --tlsv1.2 https://www.baidu.com
openssl s_client -host www.baidu.com -port 443 -msg -state -showcerts -tls1_2
TLS 1.3 使用
安装nginx时,需要指定openssl 1.1.1版本
单个域名开启无效,需要default_server中开启。