从零搭建企业级HTTPS:Nginx+Let's Encrypt+HSTS全攻略
一、为什么需要HTTPS?
- 数据加密:防止中间人窃取敏感信息(如密码、信用卡号)。
- SEO优化:Google等搜索引擎优先收录HTTPS网站。
- 合规要求:满足GDPR、等保2.0等法规对数据传输安全的要求。
二、环境准备
1. 服务器与域名
- 服务器:Ubuntu 22.04 LTS(推荐)或 CentOS 7+。
- 域名:已备案且解析到服务器IP(如
example.com
)。
2. 安装Nginx
bash
复制
# Ubuntu
sudo apt update && sudo apt install nginx -y
# CentOS
sudo yum install epel-release && sudo yum install nginx -y
3. 配置防火墙
bash
复制
# 开放80/443端口(Ubuntu)
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw reload
# CentOS使用firewalld
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reload
三、申请Let's Encrypt免费证书
1. 安装Certbot工具
bash
复制
# Ubuntu
sudo apt install certbot python3-certbot-nginx -y
# CentOS
sudo yum install certbot python3-certbot-nginx -y
2. 证书申请(DNS验证方式)
bash
复制
sudo certbot --nginx -d example.com -d *.example.com --non-interactive --agree-tos -m admin@example.com --preferred-challenges dns
- DNS验证:需在域名服务商处添加TXT记录(如
_acme-challenge.example.com
)。 - 自动化续期:Certbot会自动生成Cron任务,但需手动测试一次续期:
bash
复制
sudo certbot renew --dry-run
四、Nginx HTTPS配置
1. 基础配置(/etc/nginx/sites-available/example.com
)
nginx
复制
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri; # HTTP强制跳转HTTPS
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# SSL证书路径
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 ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
# 证书吊销检查(可选)
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# 其他配置...
}
2. 启用HTTP/2与OCSP Stapling
- HTTP/2:提升并发性能(需Nginx 1.9.5+)。
- OCSP Stapling:减少客户端证书验证延迟。
五、启用HSTS增强安全
1. HSTS头部配置
nginx
复制
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
- 参数说明:
max-age=31536000
:强制HTTPS有效期(1年)。includeSubDomains
:子域名也强制HTTPS。preload
:加入HSTS预加载列表(需通过 HSTS Preload Submit 提交)。
2. HSTS生效验证
- 使用浏览器开发者工具查看响应头:
markdown
复制
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
- 通过在线工具 HSTS Check 验证配置。
六、性能优化与进阶配置
1. 启用Session Resumption
nginx
复制
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
- 效果:减少重复握手的延迟。
2. 配置OCSP Stapling
nginx
复制
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
七、常见问题排查
1. 证书续期失败
- 原因:DNS解析未更新或防火墙拦截。
- 解决:手动执行
certbot renew --force-renewal
并检查日志/var/log/letsencrypt/letsencrypt.log
。
2. 混合内容警告(Mixed Content)
- 现象:HTTPS页面加载HTTP资源(如图片/CSS)。
- 解决:
- 使用相对路径或协议相对URL(如
//example.com/image.jpg
)。 - 配置Nginx拦截HTTP资源:
nginx
复制
if ($scheme != "https") { return 301 https://$host$request_uri; }
- 使用相对路径或协议相对URL(如
3. HSTS头部未生效
- 检查项:
- 确认Nginx配置中
add_header
未被覆盖。 - 清除浏览器缓存或使用隐身模式访问。
- 确认Nginx配置中
八、监控与维护
1. 证书有效期监控
bash
复制
# 查看证书过期时间
openssl x509 -in /etc/letsencrypt/live/example.com/cert.pem -noout -enddate
2. 自动化监控(Prometheus + Grafana)
- 使用
cert-manager
和 Prometheus Exporter 监控证书状态。
九、总结
通过Nginx+Let's Encrypt+HSTS的组合,可快速搭建企业级HTTPS服务,兼顾安全性与性能。关键点:
- 选择强加密套件(禁用弱算法如SHA1/RC4)。
- 强制HSTS防止降级攻击。
- 自动化证书续期避免服务中断。
附录:
- Let's Encrypt官方文档
- Nginx SSL配置生成器
通过本文,读者可独立完成从零部署到高级优化的全流程,适合运维工程师与开发者参考。