本文目录导读:

配置全站 HTTPS 涉及多个环节,从证书获取到服务器配置,再到强制跳转和资源检查,以下是标准化的操作步骤,适用于大多数 Web 服务器和云服务环境:
核心准备工作
获取 SSL 证书
- 免费方案:使用 Let's Encrypt(推荐 Certbot 工具)
- 商业方案:DigiCert、GlobalSign、Let's Encrypt 付费版
- 云厂商:阿里云SSL证书、腾讯云SSL证书、AWS Certificate Manager
确认服务器环境
- 操作系统类型(Linux/Windows)
- Web 服务器软件(Nginx/Apache/IIS/Tomcat)
- 是否使用 CDN、负载均衡等中间层
针对不同服务器的配置
场景 A:Nginx 配置
server {
listen 443 ssl http2;
server_name yourdomain.com;
# 证书文件路径
ssl_certificate /etc/ssl/certs/yourdomain.crt;
ssl_certificate_key /etc/ssl/private/yourdomain.key;
# 安全配置建议
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS(强制浏览器使用HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# 其他站点配置
root /var/www/html;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
# HTTP 重定向到 HTTPS(如果只做单向)
server {
listen 80;
server_name yourdomain.com;
return 301 https://$server_name$request_uri;
}
场景 B:Apache 配置
<VirtualHost *:443>
ServerName yourdomain.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/certs/yourdomain.crt
SSLCertificateKeyFile /etc/ssl/private/yourdomain.key
# 安全配置
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!aNULL:!MD5
SSLHonorCipherOrder on
# HSTS
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</VirtualHost>
# HTTP 重定向
<VirtualHost *:80>
ServerName yourdomain.com
Redirect permanent / https://yourdomain.com/
</VirtualHost>
强制全站 HTTPS 的关键步骤
自动跳转(HTTP → HTTPS)
- Nginx:使用
return 301 - Apache:使用
Redirect permanent - CDN:开启「HTTP 自动跳转 HTTPS」
- 云负载均衡:配置监听规则重定向
HSTS(HTTP Strict Transport Security)
- 意义:通知浏览器永远只通过 HTTPS 访问你的站点,避免首次 HTTP 连接的降级攻击。
- 配置:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload - 提交预加载列表(可选但强烈推荐):访问 HSTS Preload 提交你的域名,让浏览器在首次连接前就预加载 HTTPS 规则。
- 注意:
includeSubDomains会强制所有子域名,请确认子域名均已支持 HTTPS。
修复
全站 HTTPS 后,所有资源(脚本、样式、图片、字体、API)必须通过 HTTPS 加载,否则浏览器会阻止混合内容。
检查方法:
- 浏览器开发者工具(F12)→ Console → 查找 "Mixed Content" 错误
- 使用在线扫描工具:Why No Padlock、SSL Labs
修复办法:
- 将所有资源链接改为相对路径(
//cdn.example.com/file.js)或协议无关路径(/assets/js/main.js) - 在代码中统一使用
https:// - 反向代理中,设置
proxy_set_header X-Forwarded-Proto https;
API 接口统一 HTTPS
- 后端 API 域名也需部署 HTTPS
- 前端 AJAX 请求使用
https://api.yourdomain.com - 跨域场景(CORS)需允许 HTTPS 来源
配置验证与测试
在线扫描工具
- SSL Labs Server Test —— 全面评估 SSL/TLS 配置
- Why No Padlock —— 检查混合内容
- SSL Checker —— 验证证书链
本地检查
curl -I https://yourdomain.com # 检查返回的状态码(应为200)和 Location 头(不应有跳转)
浏览器手动访问
https://yourdomain.com # 应直接加载,无安全警告
http://yourdomain.com # 应自动跳转到 https://
特殊场景处理
CDN 加速的情况
- 在 CDN 控制台开启「强制 HTTPS 跳转」
- 配置 CDN 节点回源时使用 HTTPS(源站也需要有证书,或使用 CDN 提供的免费证书)
- 确保 CDN 和源站的 HSTS 策略一致
多域名/泛域名证书
- 使用 SAN 证书(Subject Alternative Name)覆盖
*.example.com及example.com - 泛域名证书不能直接覆盖二级域名(如
blog.example.com可用*.example.com,但cdn.example.com同样可用) - 如果需要
example.com本身,需要单独包含或使用泛域名 + 顶级域名
负载均衡器反向代理
- 负载均衡器持有证书并终止 TLS
- 负载均衡器与后端服务器之间建议使用内网 HTTP(关闭证书验证)
- 负载均衡器需要正确传递
X-Forwarded-Proto: https给后端,让应用感知客户端是通过 HTTPS 访问的
常见问题排查
证书链不完整
- 症状:浏览器提示「证书错误」或「不受信任的证书」
- 解决:将中间证书和根证书合并到 .crt 文件中(部分 CA 已提供合并后的文件)
重定向循环
- 症状:访问 HTTP 后 301,浏览器再次访问 HTTPS 又 301 回 HTTP
- 解决:检查是否有多个重定向规则互相冲突(如服务器 + CDN + .htaccess 同时设置)
端口未开放
- 确认服务器安全组/防火墙已放行 443 端口
- 云服务器控制台需添加「HTTPS(443)」入站规则
维护与续期
- Let's Encrypt:配置 cron 定时任务,每月自动续期
0 0 * * * /usr/bin/certbot renew --quiet
- 商业证书:设置到期前提醒(通常提前 30 天通知)
- 监控告警:使用监控工具(如 UptimeRobot、StatusCake)检测 HTTPS 可用性
全站 HTTPS 的本质是三个动作:
- 获取并部署有效证书(443端口)
- HTTP 强制重定向到 HTTPS(301)
- 确保所有资源通过 HTTPS 加载(消灭混合内容)
执行完毕后在 SSL Labs 测试,获得 A 评级即为通过。