网站启用HTTPS 的完整实战指南,涵盖从 Let’s Encrypt 免费证书申请到 Nginx 配置的详细步骤,包括重定向、HSTS 设置及常见问题排查:
一、准备工作
1. 确保域名解析正确
• 在 DNS 管理后台,将域名(如 example.com
)的 A/AAAA 记录指向服务器 IP。
• 验证解析生效:
ping example.com # 检查是否返回服务器 IP
2. 安装必要工具
• 更新系统包:
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
sudo yum update -y # CentOS/RHEL
• 安装 Nginx(如未安装):
sudo apt install nginx -y # Ubuntu/Debian
sudo yum install nginx # CentOS/RHEL
• 安装 Certbot(Let’s Encrypt 客户端):
# Ubuntu/Debian
sudo apt install certbot python3-certbot-nginx -y
# CentOS/RHEL
sudo yum install certbot python3-certbot-nginx -y
二、申请 Let’s Encrypt 证书
1. 执行证书申请命令
sudo certbot --nginx -d example.com -d www.example.com
• 参数说明:
• --nginx
:自动配置 Nginx。
• -d
:指定域名(支持多域名,如 -d example.com -d api.example.com
)。
• 交互流程:
- 选择是否启用 HTTP → HTTPS 自动重定向(推荐选“Yes”)。
- 输入邮箱(用于证书吊销通知)。
- 同意服务条款。
2. 验证证书生成
• 证书路径:
• 证书文件:/etc/letsencrypt/live/example.com/fullchain.pem
• 私钥文件:/etc/letsencrypt/live/example.com/privkey.pem
• 查看证书信息:
openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -text -noout
三、配置 Nginx 支持 HTTPS
1. 修改 Nginx 配置文件
• 编辑站点配置文件(如 /etc/nginx/sites-available/example.com
):
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 协议与加密套件
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
# HSTS 头部(可选)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 其他配置(如根目录、代理等)
root /var/www/html;
index index.html;
}
2. 测试 Nginx 配置
sudo nginx -t # 检查语法错误
sudo systemctl reload nginx # 重新加载配置
四、配置 HSTS(HTTP Strict Transport Security)
1. 启用 HSTS 头部
• 在 Nginx 的 HTTPS 服务器块中添加:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
• 参数说明:
• max-age
:HSTS 生效时间(秒),建议 31536000
(1年)。
• includeSubDomains
:强制子域名也使用 HTTPS。
• preload
:允许浏览器预加载 HSTS 列表(需提交域名到 HSTS Preload List)。
2. 验证 HSTS 生效
• 使用浏览器开发者工具(Network 标签)检查响应头是否包含:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
五、自动续期 Let’s Encrypt 证书
1. 测试自动续期
sudo certbot renew --dry-run # 模拟续期流程
• 成功标志:输出 Congratulations, all renewals succeeded.
2. 配置定时任务
• Certbot 默认已创建 systemd timer,但可手动添加 cron 任务:
sudo crontab -e
• 添加以下内容(每日凌晨 2 点检查续期):
0 2 * * * /usr/bin/certbot renew --quiet
六、常见问题排查
1. 证书申请失败
• 错误原因:端口 80/443 被占用或防火墙未开放。
• 解决方案:
```bash
sudo ufw allow 80/tcp # 开放 HTTP 端口(Ubuntu)
sudo firewall-cmd --add-service=http --permanent && sudo firewall-cmd --reload # CentOS
```
2. Nginx 配置错误
• 错误日志:
tail -f /var/log/nginx/error.log
• 常见错误:
• 证书路径错误:检查 ssl_certificate
和 ssl_certificate_key
路径。
• 协议不兼容:禁用旧版 TLS(如 SSLv3)。
3. HSTS 导致浏览器缓存问题
• 临时绕过:在 Chrome 地址栏输入 chrome://net-internals/#hsts
,删除域名 HSTS 记录。
七、验证 HTTPS 安全性
1. 使用 SSL Labs 测试
• 访问 SSL Labs Server Test,输入域名,获取安全评分和优化建议。
2. 检查关键配置
• 证书链完整性:确保 fullchain.pem
包含中间证书。
• 加密套件强度:禁用弱算法(如 RC4、SHA-1)。
总结
通过以上步骤,您的网站将实现:
- 全站 HTTPS:HTTP 自动跳转 HTTPS,杜绝明文传输。
- 强加密与身份验证:Let’s Encrypt 证书确保数据机密性。
- HSTS 防护:强制浏览器使用 HTTPS,抵御降级攻击。
- 自动化维护:证书自动续期,无需人工干预。
后续优化:
• 配置 OCSP Stapling 提升证书验证性能。
• 启用 HTTP/2 或 HTTP/3 进一步优化速度。