浏览器地址栏那个小锁,背后是一张证书。这篇讲清楚它是什么、需不需要花钱、以及最常出事的两个地方。
它到底保护什么
HTTPS 做两件事:
加密。访客和你的服务器之间的数据是加密的,中间的人(比如公共 WiFi 的提供者)看不到内容。这一点对有登录、有表单、有支付的网站是必须的。
证明身份。证书证明这个域名确实是你控制的,访客访问的不是一个冒充的服务器。
它不保护的:你的网站程序本身。HTTPS 是运输过程的保护,不是内容的保护。一个有漏洞的网站加了 HTTPS 之后照样会被入侵——只是被入侵的过程也是加密的。
这个误解相当普遍:”我们上了 HTTPS,所以网站是安全的”,这句话只对了一半。
需要花钱吗
对绝大多数网站:不需要。
Let’s Encrypt 提供免费证书,自动签发、自动续期,加密强度和收费证书完全一样。绝大多数主机商和 CDN 都集成了它,通常点一下就开好。
付费证书的差别主要在两个地方:一是带企业身份验证的类型(地址栏会显示公司名),适合银行、大型电商这类需要额外可信度的场景;二是带赔偿保险。对一般的企业网站,这两点都用不上。
如果有人建议你买几百纽币一年的证书,问一下为什么——多数情况下这个钱可以省。
最容易出事的地方:到期
免费证书的有效期通常是 90 天,靠自动续期维持。这个设计是有意的:短周期强制自动化。
问题是自动续期本身也可能坏掉,而且坏掉的时候不会有人通知你。常见原因:服务器上的续期程序停了、配置改动之后续期脚本失效、域名验证方式变了、或者机器上跑续期的那个定时任务被误删。
后果很戏剧化:证书到期那一刻,所有访客看到的都是一个红色的安全警告页面,而不是你的网站。大多数人看到这个页面会直接关掉。
而你可能一整天都不知道,因为你自己的浏览器可能还缓存着旧的证书状态,或者你根本没访问自己的网站。
怎么防:
装一个到期监控。有免费服务可以在证书还有 30 天到期时给你发邮件。这件事花五分钟设置,能避免一次全站不可用。
如果你的网站有人维护,直接问一句:”证书是自动续期的吗?上一次续期是什么时候?有没有到期告警?”这三个问题的答案能说明很多。
另一个坑:显示安全但其实不加密
这个比较隐蔽,用 Cloudflare 之类的服务时特别容易踩。
访客到你网站的路径其实有两段:访客 → CDN,以及 CDN → 你的服务器。这两段的加密是分开配置的。
有一个叫 Flexible 的模式:第一段加密,第二段不加密。浏览器显示小锁,用户以为是安全的,但数据在 CDN 到你服务器那一段是明文传输的。
这比没有 HTTPS 更糟,因为它制造了虚假的安全感。用户看到锁,就会放心地填表单、输密码。
正确的设置是 Full (strict):两段都加密,而且验证你服务器的证书是有效的。只要你的服务器上有证书(现在都免费,没有理由没有),就应该用这个模式。
怎么查:在 CDN 后台看 SSL 模式设置。如果是 Flexible,改成 Full (strict),改之前确认服务器上确实有有效证书,否则会直接打不开。
混合内容
网站整体是 HTTPS,但页面里某个图片、脚本或者样式表的地址写的是 http://。
浏览器会拦截这些资源(或者显示警告),表现为图片不显示、样式错乱、某个功能失效。而且只在部分浏览器上出现,很难复现。
怎么查:打开开发者工具的控制台,混合内容会有明确的警告信息。或者直接在页面源代码里搜 http://。
这个问题最常出现在从 http 迁移到 https 之后,历史内容里的图片地址还是旧的。批量替换一下就好,但要记得也替换数据库里的内容,不只是模板文件。
需要做的四件事
总结成一个清单:
一、装上免费证书。现在没有理由不用 HTTPS。
二、确认 http 会自动跳转到 https。否则两个版本同时存在,搜索引擎会当成两个网站,权重分散。
三、CDN 的 SSL 模式设成 Full (strict)。不要用 Flexible。
四、设一个到期告警。这是唯一能防住”某天早上全站变成警告页”的手段。
我们托管的项目里证书是自动续期的,并且有到期监控。这一项不算增值服务,是基础配置——因为它出问题的后果是全站不可用,而不是某个功能不好用。