
有没有遇到过这种情况:一个前端项目部署在 CDN 上,接口跨域请求一切配置无误,HTTPS 证书也配置上了,但用户一打开页面,浏览器就蹦出一句话——“不安全的连接”?你可能会纳闷,SSL 都上了还不安全?CDN 也用上了,怎么还被警告?
答案可能就藏在这几个字里:证书不兼容、跨域未协商好 或者 CDN 配置不当。
别急,我们就来深挖一下,HTTPS 和跨域之间,到底有什么“地下关系”?CDN 又在其中扮演了什么角色?
为什么 CDN + HTTPS 跨域很容易踩坑?
表面看,HTTPS + CDN 是现代网站的“标配”。但一旦跨域,尤其是涉及多个二级域名(或更严重的多主域名)时,问题就开始像地雷一样遍地藏着:
浏览器会校验证书是否匹配请求的域名;
CDN 有时候只配置了泛域名证书,导致某些子域名失效;
某些旧浏览器或 IoT 设备无法正确识别 SAN(Subject Alternative Name)字段;
多个域名绑定在同一 CDN 节点上,但使用了不同的 SSL 证书,触发 SNI 不一致报错。
简单点说,跨域 HTTPS 就像在机场转机,航司安排得不好,证件不一致、通关慢、系统报错……用户体验就全毁了。
SSL 证书与多域名:到底怎么配?
首先我们得搞清楚,HTTPS 的安全依赖于啥?是证书。而证书跟域名一一对应(除非你用了多域名证书或泛域名证书)。
主流 SSL 类型分为三类:
| 证书类型 | 支持域名 | 优势 | 适用场景 |
|---|---|---|---|
| DV(域名验证) | 单域名或泛域名 | 快速签发,成本低 | 小型网站、测试环境 |
| OV(企业验证) | 多域名 | 较高信任度,包含公司名称 | 企业官网、业务系统 |
| EV(扩展验证) | 多域名 | 浏览器地址栏显示公司绿标 | 金融、电商等对信任要求极高的场景 |
是否使用了多个主域名(如
a.com和b.net)?是否使用多个子域名部署(如
api.a.com、cdn.a.com、static.b.net)?是否希望统一接入层 SSL ?
如果你都中招,那单一证书显然不够看,多域名 SAN 证书,甚至是自动化证书管理系统,就必须出场。
CDN 与 SSL 的“甜蜜合作”,怎么实现?
你可能会觉得,SSL 是 Web Server 层的事,CDN 只是中转,关它什么事?那你就错了。CDN 是终端用户的第一接触点,它承担了“第一个握手”的责任。
CDN 节点要支持 HTTPS,有三种配置方式:
CDN 统一终端 SSL:CDN 终端配置证书,源站是 HTTP。适合静态资源跨域,比如图片、JS、CSS;
CDN + 回源 HTTPS:CDN 和源站都走 HTTPS,双向加密,适合安全要求高的接口场景;
CDN 自动识别 SNI + 多证书切换:支持多个证书并智能匹配 SNI,适合多租户或 SaaS 平台。
你用的 CDN 如果不支持 SNI,或者证书只是泛域名 *.a.com,结果某个子域名是 login.api.a.com,对不起,SSL 直接翻车。
浏览器怎么识别 HTTPS 是否安全?
你以为浏览器只看有没有挂个 HTTPS?其实它在后台干了三件事:
证书链验证:证书是否来自受信 CA?中间证书和根证书齐不齐?
域名匹配验证:证书上写的域名是不是你访问的域名?
吊销检查:OCSP 或 CRL 看这个证书有没有被撤销?
所以别小看证书字段中的 SAN(Subject Alternative Name)配置。如果你的域名没包含在里面,那 HTTPS 无论怎么配置都是白搭。
多域 HTTPS 的配置建议
总结一些实战建议,避坑指南拿走不谢:
1. 尽量使用同一主域名体系
例如统一使用 *.a.com,避免多个主域名混用,减少 SSL 配置复杂度。
2. 启用 SAN 多域名证书或自动化 ACME 系统
用 Let's Encrypt + 自动续签脚本搞定证书统一,也可以上阿里云、腾讯云的托管型 SSL 服务。
3. 选择支持多证书切换的 CDN
很多高级 CDN(如腾讯云 CDN、阿里云 CDN)支持多证书并行配置,适合多域系统。
4. 统一 CDN 与源站的协议策略
CDN 用 HTTPS,源站也最好跟上。中间不能断链。
5. 注意 CORS 策略的 HEADERS 设置
跨域访问不是 SSL 配上就完事儿,Access-Control-Allow-Origin、Access-Control-Allow-Credentials、Vary 等头要配好。
一个真实场景案例:SaaS 多租户 HTTPS 配置
某企业开发了一个多租户 SaaS 平台,每个客户绑定自己的子域名:
client1.app.com client2.app.com client3.app.com
问题来了:客户 A 想用 custom.domainA.com 来访问系统,客户 B 则用 secure.domainB.net,怎么办?
他们最终的方案是:
各客户提供域名授权;
自动签发 Let's Encrypt 证书(每个域名);
CDN 使用支持 SNI 的 HTTPS 回源;
前端支持动态加载对应子域名证书;
后端对 TLS SNI 做路由匹配。
通过这一套配置,支持了完全跨域、全 HTTPS 安全部署,而且性能没妥协。
为什么你的网站 HTTPS 明明配了,用户还是提示“不安全”?
别再盯着前端代码了,多半是 CDN 节点上的证书不匹配。要么是泛域名证书不到位、要么是多域配置缺失、要么是证书链断了。
CDN 是“代理人”,它站在用户和你的网站中间,握手成不成功,看它“脸色”行事。别让 CDN 成为你安全策略的短板。