2025 年还让用户在地址栏看到"不安全"三个字,等于把流量往竞争对手那里送。本文从证书选型、免费方案到自动化续期,给出一套企业网站 HTTPS 落地的完整方案,并把最常见的"混合内容"告警一次解决。

一、证书类型怎么选

类型验证级别覆盖范围适合场景
DV(域名验证)仅验证域名所有权单域名 / 泛域名企业官网、博客、演示站
OV(组织验证)验证企业资质单域名 / 泛域名对外业务系统、管理后台
EV(扩展验证)最严格审核单域名金融、电商支付场景

对绝大多数企业官网:DV 泛域名证书(*.example.com)性价比最高,一张证书覆盖所有二级域名(www、api、img、m),新增子域无需重新签发。

二、免费方案:Let's Encrypt 完整实操

Let's Encrypt 证书 90 天有效,必须配自动续期。以最常见的 Nginx + Ubuntu 为例:

1. 安装 certbot

sudo apt update
sudo apt install certbot python3-certbot-nginx -y

2. 签发证书(自动改写 Nginx 配置)

sudo certbot --nginx -d example.com -d www.example.com \
  --agree-tos -m admin@example.com --redirect

--redirect 参数会自动添加 80 → 443 的 301 跳转,一步到位。

3. 泛域名证书(需 DNS 验证)

sudo certbot certonly --dns-dnspod \
  --dns-dnspod-credentials /etc/letsencrypt/dnspod.ini \
  -d "*.example.com" -d example.com

DNS 验证通过 TXT 记录完成,certbot 插件可自动添加与清理记录,全程无需人工介入。

4. 自动续期(核心)

certbot 安装时已自带 systemd timer,验证一下即可:

# 模拟续期,验证自动化链路是否正常
sudo certbot renew --dry-run

# 查看定时任务
systemctl list-timers | grep certbot
血泪教训:一定要在上线当天执行 --dry-run 验证续期链路。大量网站 90 天后证书集体过期,都是因为签发成功但续期任务从未真正跑通过。

三、混合内容(Mixed Content):HTTPS 后最常见告警

页面通过 HTTPS 加载,但其中的图片、脚本、iframe 仍走 HTTP,浏览器会拦截或降级提示。排查与修复:

1. 定位不安全资源

# 服务端快速扫描首页中的 http:// 资源引用
curl -s https://example.com | grep -oE 'http://[^"'\''> ]+' | sort -u

2. 三种修复方式(按推荐度排序)

  • 改协议相对路径:src="//img.example.com/a.png",跟随页面协议自动切换。
  • 数据库批量替换:富文本历史内容中的 http:// 链接批量升级,注意先备份。
  • 自动升级头(兜底):Nginx 加 add_header Content-Security-Policy "upgrade-insecure-requests";,浏览器会把页面内 http 请求自动升级为 https。

3. iframe/外链资源

地图、客服、视频等第三方嵌入务必确认对方支持 HTTPS;仍在用 http 的国内老牌统计代码、客服组件要升级到其新版本。

四、Nginx HTTPS 配置模板(含安全头)

server {
    listen 443 ssl http2;
    server_name 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         HIGH:!aNULL:!MD5;

    # 安全增强头
    add_header Strict-Transport-Security "max-age=31536000" always;
    add_header X-Content-Type-Options nosniff;
}

# HTTP 全部 301 到 HTTPS
server {
    listen 80;
    server_name example.com;
    return 301 https://$host$request_uri;
}

HSTS 头建议在确认全站 HTTPS 稳定运行一个月后再加,避免子域未就绪时锁死用户。

五、上线检查清单

  • 用 SSL Labs(ssllabs.com/ssltest)评分,目标 A 以上;常见扣分项是未启用 TLS1.3、证书链不完整(fullchain 一定要用对)。
  • 检查所有子域(api、img、m)都在证书覆盖范围内。
  • 微信内访问测试:微信对证书链不完整的站点会直接白屏。
  • 小程序服务器域名配置(request/uploadFile 域名)必须为 HTTPS 且备案有效。

HTTPS 已经不是加分项而是底线。把证书自动化续期跑通、把混合内容清零,一次投入长期受益。