SSL 证书与 HTTPS 配置
小绿锁只是开始,混合内容才是硬仗
证书装上、地址栏出现小锁,很多人以为这就完事了。打开产品页一看,图片没加载、样式错位、控制台一片红字 Mixed Content——从 HTTP 迁到 HTTPS 的站几乎必现。这一页讲证书怎么选、怎么签发续期、Nginx 那几行怎么写,以及数据库里几万条 http:// 怎么安全换掉。
证书分三种
企业站多数只需要一种
安全强度上三种证书没有本质差别,差别在审核流程、保险额度与”证书里写了什么公司信息”。价格随渠道波动,下表只给区间,以官方报价为准。
DV 域名验证型
只验证域名控制权,几分钟签发。地址栏表现与 OV 完全一样,Let’s Encrypt 与各云厂商的免费证书都属于这一类。企业官网、产品展示站用这个足够。
- 免费,90 天有效,需自动续期
- 通配符版本同样可以免费申请
OV 企业验证型
需要提交营业执照,CA 核验企业主体信息,签发要一到三个工作日,证书详情里能看到公司名。价值主要在合规场景:海外客户的供应商审核、部分行业投标会要求。
- 有效期通常一年,需重新审核
- 价格按年计,通常几百到几千
证书链必须完整
只配站点证书、没配中间证书时,Chrome 能打开,但安卓旧版、邮件客户端、微信内置浏览器会报 NET::ERR_CERT_AUTHORITY_INVALID。Nginx 里要用 fullchain 而不是 cert。
主域与 www 都要覆盖
客户输入 www.example.com 和 example.com 的概率差不多。证书只写一个,另一个就报 NET::ERR_CERT_COMMON_NAME_INVALID。申请时把两个名字都加进去,或在服务器层 301 统一。
签发与续期
两种验证方式,各有各的限制
CA 要确认域名确实归你控制,验证方式分文件验证与 DNS 验证。选错方式会导致通配符证书根本签不下来。
文件验证 HTTP-01
CA 要求你在 /.well-known/acme-challenge/ 下放一个指定内容的文件,再从公网访问确认。配置简单,面板一键就能完成。限制是不能签通配符,且要求 80 端口对外可访问——只开了 443、或 CDN 把 80 全劫持的站会一直失败。
DNS 验证 DNS-01
在域名解析里加一条 TXT 记录,内容由 CA 给出。支持通配符,也不需要 80 端口。代价是每次续期都要能改 DNS,要么手动加,要么给客户端一个 API 密钥自动改。
面板一键与 certbot
宝塔在「网站 → SSL → Let’s Encrypt」里勾选域名即可,续期由面板计划任务完成。命令行环境的典型命令是 certbot --nginx -d example.com -d www.example.com,会自动改 Nginx 配置并注册续期任务。certbot renew --dry-run 可演练一次续期,不消耗额度。
续期失败的三种原因
一是 80 端口被安全组或防火墙关闭;二是 .well-known 目录被伪静态规则拦截,返回 404 页面而不是文件;三是 CDN 开了强制 HTTPS 却没放行验证路径,第三种最隐蔽。
续期成功不等于生效。Nginx 需要 reload 才读新证书,只换文件不 reload 的站会在第 91 天准时掉锁。把 reload 写进续期钩子,并在到期前 15 天设一个提醒作人工兜底。
服务器上要配的几行
跳转、协议、HSTS
证书文件放好只是第一步,规则不写就等于没配。下面的配置以 Nginx 为例,Apache 环境在 .htaccess 里做等价处理。
80 端口统一 301 到 443
单独写一个 server 块监听 80,除放行 /.well-known/acme-challenge/ 之外,其余全部 return 301 https://$host$request_uri;。验证路径不排除,续期就会被自己的跳转打断。
证书路径用 fullchain
ssl_certificate 指向 fullchain.pem,ssl_certificate_key 指向 privkey.pem。宝塔生成的目录通常是 /www/server/panel/vhost/cert/域名/。只指 cert.pem 会缺中间证书,前面提到的安卓与微信端报错就是这么来的。
协议版本与加密套件
只留 TLSv1.2 TLSv1.3,关掉 1.0 与 1.1。这两个版本已被主流浏览器标记为不安全,还会在合规扫描里扣分。加密套件交给默认值,手改容易改出兼容问题。
HSTS 要不要开
Strict-Transport-Security 告诉浏览器以后只用 HTTPS。开了之后,有效期内即使证书出问题也点不了”继续访问”。建议先用 max-age=300 试一周,确认无混合内容、子域都有证书再调到一年。
http2 与 ssl 要同时写在 listen 行上,例如 listen 443 ssl http2;。只写 ssl 会退回 HTTP 1.1,首屏慢一截。改完用 nginx -t 验证。
混合内容
锁是绿的,页面还是坏的
浏览器控制台里最常见的一句是:Mixed Content: The page at ‘https://example.com/’ was loaded over HTTPS, but requested an insecure element ‘http://…/a.jpg’. This request has been blocked. 意思是页面安全,但里面还有东西在用 http 拉。
源头一:数据库里的绝对地址
老文章正文里的 <img src="http://...">、按钮链接、自定义 HTML 区块都写死了 http,几千条手工改不现实。批量处理要区分三张表:wp_posts 的 post_content、wp_postmeta 的 meta_value、wp_options 的配置值。
为什么不能用 phpMyAdmin 替换
WordPress 把数组和对象序列化成字符串存库,格式是 s:5:"hello",其中 5 是字节长度。http 换成 https 多了一个字符,长度对不上,整个字段就解析失败。表现为主题设置全部丢失、构建器页面变成空白。
正确做法:序列化安全替换
用 WP-CLI 执行 wp search-replace 'http://example.com' 'https://example.com' --all-tables --precise --report-changed-only,它会重算序列化长度,支持 --dry-run 先看影响行数。没有 SSH 时用 Better Search Replace 这类插件,同样先备份。
源头二:主题与插件的写死路径
CSS 里的 background: url(http://...)、主题选项里存的 logo 地址、统计代码的脚本地址,都不在数据库的主内容字段里。替换完仍报警,就在主题目录里全局搜 http://。第三方脚本不支持 https 的只能换掉。
wp-config 里的两个常量
确认 WP_HOME 与 WP_SITEURL 都写成了 https 开头。如果只改了数据库里的 siteurl、没改这两个常量,会出现前台正常、后台跳回 http 的割裂状态。反过来只改常量不改数据库,又会出现内页资源仍走 http。
切完 HTTPS 之后
这几处会跟着出问题
证书本身不复杂,麻烦的是它牵连的范围。下面三处是切换后一周内最常被反馈的问题。
CDN 回源失败
回源协议还配着 http,而源站已强制跳 https,就会出现 525 或 521。把回源协议改成 HTTPS 或”协议跟随”,同时确认 CDN 侧上传了证书。
邮件与嵌入代码
询盘邮件里写死 http 的”查看详情”链接会被跳转,部分企业邮箱还判为可疑;地图、客服代码的老版本嵌入也可能被 blocked,逐个换新。
最后改站点地图与 robots 里的域名,并在两个搜索引擎后台各提交一次新地址。切换如果和换服务器一起做,顺序安排见WordPress 网站迁移搬家。
证书方案对比
按站点结构选
价格区间仅供参考,以 CA 与服务商当期报价为准。
| 类型 | 覆盖范围 | 签发时间 | 有效期 | 适用场景 |
|---|---|---|---|---|
| 免费 DV 单域名 | 一个域名 | 几分钟 | 90 天,需自动续 | 单一域名的企业官网 |
| 免费 DV 通配符 | 主域 + 全部二级子域 | 几分钟至一小时 | 90 天,需 DNS 验证 | 多语言子域站、站群 |
| 付费 DV 多域名 | 指定的多个域名 | 几分钟至几小时 | 一年 | 主站与独立域名并存 |
| OV 企业型 | 单域或通配符 | 1 至 3 个工作日 | 一年,需重新审核 | 有供应商审核或投标要求 |
| 自签证书 | 任意 | 即时 | 自定 | 仅内网测试,公网会告警 |
一个务实的结论:对外站点用免费 DV 加自动续期,把预算放到备份与安全加固上收益更高。证书只解决传输加密,不解决被入侵、被拖库的问题,那部分要靠WordPress 安全加固与木马清理里的手段。
SSL 与 HTTPS 常见五问
三种可能:页面里有 http 资源,属混合内容,锁图标会带感叹号;证书链不完整,部分浏览器不认;访问的域名不在证书覆盖范围内,只签了不带 www 的,客户用 www 就会告警。排查顺序是看控制台报错、查证书链、核对域名列表。
没有。搜索引擎判断的是”是否通过 HTTPS 提供内容”,不看你花了多少钱,加密强度也一样。付费证书的价值在企业身份核验与售后支持,属于商务与合规考虑,不是排名因素。
用对工具就不会。风险全部来自直接 SQL 替换破坏了序列化字符串的长度字段。用 WP-CLI 的 search-replace 或专业插件,它们会重算长度。操作前必备份,先用 --dry-run 看影响行数,跑完抽查构建器页面。
能,但要注意时序。浏览器按 max-age 记住这条策略,到期前你删掉响应头它仍会强制 HTTPS。不要一上来设一年,先用几分钟到几天的小值验证。真要回退,把 max-age 设成 0 并保留一段时间。
通常两层都要。用户到 CDN 用边缘侧托管的证书,CDN 回源到服务器用源站证书,形成全链路加密。只配一层的话回源仍是明文,合规检查会不通过。配置细节见CDN 加速配置。