HTTPS常用于保证数据传输安全、提升用户信任、满足搜索引擎排名规则等。作为当下流行web服务器之一,nginx的HTTPS配置看似简单但是还是需要注意不少细节。从证书选择到加密套件调优,从自动续期到性能瓶颈突破,任何环境都和安全防护息息相关。
HTTPS的核心是SSL/TLS证书,而证书的获取与管理是配置的第一步。对于个人站点或中小型企业,Let's Encrypt提供的免费证书是最佳选择,其自动化工具Certbot可快速完成证书申请与Nginx配置。以Ubuntu系统为例,执行以下命令即可完成基础安装:
sudo apt update
sudo apt install certbot python3certbotnginx
sudo certbot nginx d example.com d www.example.com
此过程会自动修改Nginx配置,添加证书路径并启用443端口监听。但自动化工具生成的配置往往只满足基本需求,生产环境需进一步优化。基础HTTPS配置的核心在于server块的设定。以下是一个兼顾兼容性与安全性的模板:
nginx
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# 协议与套件配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHEECDSAAES128GCMSHA256:ECDHERSAAES128GCMSHA256:ECDHEECDSAAES256GCMSHA384:ECDHERSAAES256GCMSHA384;
ssl_prefer_server_ciphers on;
# 性能优化
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
# 安全头
add_header StrictTransportSecurity "maxage=63072000" always;
add_header XContentTypeOptions nosniff;
add_header XFrameOptions DENY;
# 其他业务配置
root /var/www/html;
index index.html;
}
# HTTP强制跳转HTTPS
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
此配置明确禁用已证实不安全的TLS 1.0/1.1版本,选用现代浏览器广泛支持的加密套件,并通过HSTS头强制客户端使用HTTPS连接。但需注意,HSTS的maxage设置过长可能导致无法回退,建议初期设置为604800(一周),确认无误后再延长至两年。
证书链完整性是常见故障点。若Nginx配置中未包含中间证书,部分客户端(如旧版Android)会因无法构建完整信任链而报错。通过以下命令可验证证书链:
openssl s_client connect example.com:443 showcerts
输出应包含服务器证书、中间证书及根证书。使用Let's Encrypt证书时,fullchain.pem已包含必要链,但若使用其他CA颁发的证书,需手动拼接中间证书。
性能优化是HTTPS落地的重要环节。TLS握手会增加服务器负载,通过以下策略可显著降低开销:
1. 会话复用:
nginx
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 1d;
共享会话缓存允许多个工作进程复用同一会话,减少重复密钥协商。
2. OCSP Stapling:
nginx
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
将OCSP查询结果缓存在服务端,避免客户端直接向CA发送请求,降低延迟。
3. TLS 1.3优先:
作为最新协议版本,TLS 1.3减少了握手步骤,实现“1RTT”甚至“0RTT”连接。但需注意,0RTT可能面临重放攻击风险,敏感操作应禁用:
nginx
ssl_early_data off;
自动续期是证书管理的生命线。手动续期极易遗忘。通过crontab设置定时任务:
0 3 /usr/bin/certbot renew quiet posthook "systemctl reload nginx"
每日凌晨3点检查证书到期情况,续期后自动重载Nginx配置。当页面通过HTTPS加载,但子资源(如图片、JS)使用HTTP链接时,浏览器会阻止加载或提示警告。解决方案包括:
1. 内容重写:
nginx
sub_filter 'http://' 'https://';
sub_filter_once off;
将响应内容中的HTTP链接替换为HTTPS。
2. CSP头限制:
nginx
add_header ContentSecurityPolicy "defaultsrc https: 'unsafeinline' 'unsafeeval';";
强制所有资源必须通过HTTPS加载。
安全加固需多维度推进。除基础配置外,还应:
禁用弱密码、密钥轮换、证书透明度监控、旧版客户端兼容性需要权衡取舍。可临时开启兼容模式:
nginx
ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
但需同步加强入侵检测,并推动客户端升级。