3.4 HTTPS:免费 SSL 证书申请与自动续期

为什么必须上 HTTPS

网站刚上线那几天,朋友用手机打开网站,浏览器地址栏赫然写着不安全。HTTP 明文传输,密码和表单内容裸奔,运营商还能往页面里塞东西。对做生意的企业官网来说,没有小锁头等于没有信任——客户连门都不敢进,更别提留电话了。

好在 DV 证书现在可以免费申请,操作也不复杂,这一节属于投入小、回报大的典型。花一小时配好,此后每年续一次,网站就一直是可信状态。另外别被“免费”两个字误导,HTTPS 的加密强度和证书价钱没有关系,免费的 DV 证书在加密层面和付费的是同一套标准。

先认一下三种证书类型,免得在控制台里挑花眼:

类型 验证什么 适合谁
DV 只验证域名所有权 个人、小微企业官网
OV 验证企业身份 需要展示公司名的中大型企业
EV 严格审核,地址栏显示公司名 金融、支付类业务

企业官网用 DV 就够了:浏览器认的是加密,不是你的营业执照。等朋友公司做大了、需要在网站上挂企业认证标识,再考虑 OV 也不迟。不过有一点要提前说清楚:免费证书不等于不管事,DV 该有的加密强度一样不少,差的只是身份背书,对普通企业官网这个差别几乎没有实际影响。

申请免费 DV 证书

腾讯云 SSL 证书提供免费 DV 证书,个人和企业都能申请,一次有效期一年,到期可以再申请。流程是在 SSL 证书控制台点申请免费证书,选 DV 类型,填域名(比如 www.example.com),然后做域名验证——一般是自动加一条 TXT 解析,等几分钟就通过,接着证书就能下载了。整个流程不用提交企业资料,DV 证书只验证域名所有权,审核速度很快。

一个细节:免费 DV 证书通常一张绑一个域名。要同时保护 www 和裸域名,最省事的办法是各申请一张,或者干脆把站点统一到带 www 的域名上——3.3 节里我们就已经把 www 当作主域名了。朋友一开始想省钱只保护裸域名,被我说服了两张都申请:反正免费,为什么不。不过要注意免费证书一般有申请数量上限,一个账号不能无限张,具体以控制台当时显示的额度为准,别一通乱申请把额度用光。

部署到轻量应用服务器

证书下载下来是一个压缩包,里面有 Nginx 要用的证书文件和私钥。下载之后先别急着传:私钥文件丢了或者泄露都是大事,我习惯在本地留一份加密压缩的备份,服务器上只放运行需要的那一份。部署有两种路子:面板方式和手动方式。面板方式是跟着 WordPress 应用镜像自带的管理入口走,直接上传证书、一键开启 HTTPS,适合不想碰命令行的读者;手动方式要把证书传到服务器上改 Nginx 配置,可控性更强,我两台机器都试过,小服务器上两者差别不大。

手动方式的关键片段长这样:

server {
    listen 443 ssl;
    server_name www.example.com;

    ssl_certificate     /usr/local/nginx/conf/ssl/example.com.crt;
    ssl_certificate_key /usr/local/nginx/conf/ssl/example.com.key;

    # 其余保持原有反代 WordPress 的配置
}

改完先 nginx -t 测语法,再 reload 生效。reload 和 restart 不一样:restart 会短暂断开正在访问的用户,reload 不会,线上务必用 reload。验证证书是否真的装对了,可以用 openssl 直连看证书信息:

# 查看证书的域名和有效期
openssl s_client -connect www.example.com:443 -servername www.example.com </dev/null 2>/dev/null | openssl x509 -noout -subject -dates

看到输出里的域名和自己的对上、到期时间是正好一年后,这步才算踏实。如果输出为空或者证书域名对不上,说明 Nginx 里配置的文件路径有误,回去检查 ssl_certificate 那两行。另外有两件事别忘了:轻量防火墙放行 443 端口(控制台 → 防火墙 → 添加规则),以及把 80 端口的流量重定向到 443。80 到 443 的跳转也写在 Nginx 配置里,访问 http 的用户会被自动转到 https。跟着轻量应用服务器文档操作最稳,里面每一步都有截图。

WordPress 里强制 HTTPS

证书装好只是半步,WordPress 还要做三件事才彻底切换:

步骤 操作 不做的后果
改站点地址 设置 → 常规,把 WordPress 地址和站点地址都改成 https 开头 后台进不去或样式错乱
强制跳转 Nginx 里把 80 重定向到 443 用户还能通过 http 访问
清混合内容 文章和主题里的 http 链接全改成 https 浏览器报警,小锁头变感叹号

改站点地址前一定要确认证书已经部署好,否则可能把后台锁死在门外——这事我干过,保存的瞬间页面就打不开了,最后只能登录服务器去数据库里把域名配置改回来救场。经验:改之前在另一个浏览器标签里先确认 https 版本的后台能打开,再点保存。改完之后清一下浏览器缓存和缓存插件,否则前台可能还显示旧的 http 版本,看着像没生效其实只是缓存。

混合内容:小锁头前面的感叹号

切完 HTTPS 朋友发来截图:锁头是绿的,但带个感叹号。F12 打开控制台,清一色的 Mixed Content 报错——旧文章里插图用的是 http 地址,浏览器拒绝加载这些不安全资源。

处理办法由浅入深:

  1. 手动改:就几张图的话,编辑文章把链接前缀换成 https,最快最安全。
  2. 批量换:在数据库里执行一次字符串替换,把站点域名的 http 前缀统一换成 https。操作前一定先备份,5.2 节的脚本备份就是为这种时候准备的。替换语句写成只换自己域名的字符串,千万别写成替换所有 http,会把别人文章里的外链也弄坏。
  3. 治本:主题和插件里写死 http 的地方,在子主题或配置里改掉;以后新上传的图片会自动跟着当前协议走。

有些主题还提供强制 HTTPS 的开关,配合 Nginx 跳转做双保险。更多证书和部署的疑难杂症,可以先翻 服务器常见问题。

混合内容里最隐蔽的一类是图片以外的东西:主题里引入的字体文件、统计代码、社交媒体按钮,都可能还写着 http。这类资源不报错则已,一报错就是一堆,建议切完 HTTPS 当天就在控制台里逐页过一眼,别等朋友发截图。朋友那句“怎么有个感叹号”至今还是我心里的阴影。

到期提醒与续期

免费证书一年有效,快到期时控制台会有提醒,我还在日历里设了一个提前一个月的闹钟——证书这东西,平时没人想它,过期那天才会突然成为全站事故。续期就是重新走一遍申请流程:申请、验证、下载、替换服务器上的旧证书、reload。只要新的证书路径和文件名保持不变,Nginx 配置一行都不用动。替换前顺手打一次实例快照(见 5.1 节),万一翻车可以整个回滚,也就是回退到换证前的状态,十秒钟的事。

一年的节奏一旦熟悉,续期就是十分钟的例行公事,属于一次性学会、终身受用的技能。说到底,证书可以免费、域名很便宜,这个站唯一真金白银的开销就是服务器本身——我给朋友选的是轻量应用服务器活动套餐,2 核 2G4M 99 元/年起,一年算下来比请客户吃顿饭还便宜。

HTTPS 之后就可以接 CDN 了,那边还有一套缓存和刷新的玩法,见第四篇。多域名、通配符证书等进阶需求,可以参考 腾讯云实战手记。证书装好之后,建议第二天再从头到尾验一遍,因为有些缓存类问题第一次访问时发现不了。

延伸阅读