全站HTTPS如何配置

wen 开源项目 32

本文目录导读:

全站HTTPS如何配置

  1. 核心准备工作
  2. 针对不同服务器的配置
  3. 强制全站 HTTPS 的关键步骤
  4. 配置验证与测试
  5. 特殊场景处理
  6. 常见问题排查
  7. 维护与续期

配置全站 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 来源

配置验证与测试

在线扫描工具

本地检查

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.comexample.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 的本质是三个动作:

  1. 获取并部署有效证书(443端口)
  2. HTTP 强制重定向到 HTTPS(301)
  3. 确保所有资源通过 HTTPS 加载(消灭混合内容)

执行完毕后在 SSL Labs 测试,获得 A 评级即为通过。

抱歉,评论功能暂时关闭!