独立站HTTPS配置:SSL证书、HSTS与混合内容修复
一、证书选型与自动续期:不要买OV证书,也不要手工续期
很多独立站第一年买付费SSL证书,第二年忘了续,直接被浏览器打红色警告。反直觉的结论是:对绝大多数B2B独立站,Let’s Encrypt的免费DV证书完全够用,OCSP stapling和A+评级都能拿,付费OV证书多出来的企业名称显示对转化率没有可测量的影响。
证书选型只有两个硬指标:一是密钥算法,选ECDSA P-256而不是RSA 2048,握手体积小40%,移动端首次加载快约80毫秒;二是续期方式,必须用certbot或acme.sh做自动续期,crontab每天检查一次,绝不手工续。证书过期的事故,90%是因为责任人离职或忘了。
| 证书类型 | 年成本 | 浏览器显示 | 适合场景 | 建议 |
|---|---|---|---|---|
| Let’s Encrypt DV ECDSA | 0元 | 安全锁,无企业名 | 绝大多数B2B独立站 | 默认选择,自动续期 |
| Let’s Encrypt DV RSA | 0元 | 安全锁,无企业名 | 老设备兼容需求 | 仅当有IE11流量时用 |
| 付费OV证书 | 2000至8000元/年 | 绿色企业名 | 金融、支付、高客单 | 非必要不买 |
| 付费EV证书 | 5000至20000元/年 | EV标识(多数浏览器已取消) | 几乎无场景 | 不建议 |
场景示例:一个杭州的SaaS出海站,用acme.sh申请Let’s Encrypt证书,crontab里配0 3 * * 1 /root/.acme.sh/acme.sh –renew -d example.com,每周一凌晨3点自动检查续期。同时在监控里加一条规则:证书剩余有效期小于15天就发企业微信告警。这种配置一次写好,之后两年不用再碰。
多域名和泛域名怎么处理,和CDN全球加速的节点证书策略要一起规划。CDN厂商通常自带边缘证书,源站证书和边缘证书要分开管,不要让边缘证书的续期依赖源站。
二、HSTS:渐进升级,不要一步到位
HSTS(HTTP Strict Transport Security)是让浏览器强制走HTTPS的响应头。它的反直觉之处在于:max-age设得越长越安全,但也越危险。如果第一次就直接设max-age=31536000,你的测试环境、staging子域名、内部管理后台,一年内都没法用HTTP访问,一旦证书出问题全站瘫痪。
正确的升级节奏是三档:第一周max-age=300(5分钟),观察有没有用户反馈和业务异常;第二到四周max-age=86400(1天),确认无异常;一个月后才升到max-age=31536000(1年)并加上includeSubDomains。preload列表提交要更晚,建议稳定运行3个月后再提交chromium preload。
| 阶段 | HSTS头写法 | 观察期 | 风险点 |
|---|---|---|---|
| 第一档 | Strict-Transport-Security: max-age=300 | 1周 | 几乎无风险,可随时回退 |
| 第二档 | max-age=86400 | 1个月 | 个别老浏览器可能不兼容 |
| 第三档 | max-age=31536000; includeSubDomains | 3个月 | 子域名HTTPS必须全部就绪 |
| 最终档 | 加preload指令,提交到hstspreload.org | 长期 | 提交后移除成本极高 |
场景示例:一个工业装备出海站,主站example.com配了HTTPS,但legacy.example.com还是HTTP。直接上includeSubDomains会把legacy子域名的用户锁死。正确做法是先把所有子域名HTTPS化,再逐步推主站HSTS到一年期。子域名清单可以在SSL Labs测试报告里看到。
HSTS和出海站合规底座里的传输安全要求是一致的:GDPR对个人数据传输的加密要求,HSTS是最直接的技术落地。
三、混合内容:自动升级加人工清洗两道工序
混合内容指HTTPS页面里加载了http://协议的资源,分两类:被动混合内容(图片、视频、字体)浏览器会自动拦截但不报错;主动混合内容(<script>、<iframe>、fetch、XHR)会直接让页面变红,浏览器拒绝加载,功能直接废掉。
修复分两步走。第一步加响应头Content-Security-Policy: upgrade-insecure-requests;,浏览器会自动把页面里所有http://资源请求改成https://,这一步能解决80%的问题。第二步用Chrome DevTools的Console面板跑一遍,把剩下的硬编码http://从代码和数据库里清掉——尤其是WordPress的wp_options表里的siteurl和home,以及历史文章里<img src=”http://…”>这种老数据。
| 混合内容类型 | 浏览器行为 | 修复优先级 | 修复方式 |
|---|---|---|---|
| http://<script>或<iframe> | 直接拦截,页面报错 | P0,立即修 | 改源地址为https,或换CDN |
| http:// XHR/fetch 请求 | 控制台报错,功能失效 | P0,立即修 | 代码里改相对协议或https |
| http://<img>图片 | 部分浏览器自动升级 | P1,一周内修 | upgrade-insecure-requests兜底 |
| http://字体或CSS背景图 | 静默失败,样式丢失 | P1,一周内修 | CDN换https链接 |
| http://<a href>链接 | 跳转HTTP,不报错但泄露 | P2,月度清理 | 站点地图里批量替换 |
WordPress站最常见的坑是历史文章里的图片链接写死了http://。不要直接在数据库里用SQL批量替换——先备份,再用Search Replace DB工具做序列化安全替换,否则会把PHP序列化数据写坏。备份怎么做见网站备份与恢复演练。
混合内容清洗和Core Web Vitals优化是联动的:被拦截的脚本会阻塞LCP,被拒绝加载的图片会造成CLS。洗完混合内容,这两个指标通常会自动改善。
四、验收清单与月度巡检
HTTPS配置不是上线一次就完事。证书会过期、子域名会新加、历史内容会重新引入http链接。必须建一张月度巡检表,每月跑一次,5到10分钟就能做完。
| 检查项 | 工具/方法 | 合格线 | 不合格处理 |
|---|---|---|---|
| SSL Labs评级 | ssllabs.com/ssltest | A或A+ | 调TLS配置,禁用旧协议 |
| 证书剩余有效期 | openssl s_client | ≥15天 | 立即触发续期 |
| HTTP跳转HTTPS | curl -I http://example.com | 301到https | 补rewrite规则 |
| HSTS头存在 | curl -I看响应头 | max-age≥86400 | 补响应头配置 |
| 混合内容数 | Chrome DevTools Console | 0条 | 定位并替换http硬编码 |
| TLS版本 | SSL Labs报告 | 仅TLS 1.2/1.3 | 关闭TLS 1.0/1.1 |
巡检自动化怎么做,见站点监控与告警里的证书到期和可用性监控章节。被黑之后HTTPS配置往往会被破坏,清理流程见网站被黑之后的清理与重新收录。
反直觉提醒:HSTS preload不要轻易提交。一旦你的域名进了浏览器内置preload列表,未来想去掉要走专门的移除流程,几个月内老用户浏览器仍然强制HTTPS。如果你的业务还在频繁调整子域名和测试环境,preload至少等主站稳定运行半年再考虑。
FAQ 常见问题
免费Let’s Encrypt证书够不够用,要不要买付费OV?
HSTS第一次就设max-age=31536000行不行?
混合内容怎么批量修复,有没有一键工具?
证书自动续期怎么配,最怕什么坑?
HTTPS对SEO有影响吗,必须全站HTTPS吗?
TLS版本要怎么配,TLS 1.0和1.1要不要关?
写在最后
HTTPS配置这件事,容易被当成”装个证书就完事”,实际上它是独立站安全和SEO的底座。证书过期、HSTS缺失、混合内容残留,这三类问题每一类都会直接让浏览器打红色警告,买家看到警告框就关掉页面,SEO权重也会被打折扣。一次配好,每月巡检一次,成本很低,但收益是全站可见的。
落地三步:先用Let’s Encrypt自动续期把证书这关过掉,SSL Labs跑到A以上;再按三档节奏把HSTS从5分钟升到一年期;最后用upgrade-insecure-requests加人工清洗把混合内容降到0。这三步做完,HTTPS才算真正配完。日常维护清单见官网维护期每月六件事,把HTTPS巡检固定进去。
一句可以记住的话:HTTPS不是装个证书就完事,证书自动续期、HSTS渐进升级、混合内容清零,三层都过了才算真正的HTTPS——差一层,浏览器的红色警告就会替你把买家赶走。
