CDN回源用HTTP还是HTTPS?证书、SNI和端口怎么选
网站接入CDN后,用户访问的是CDN边缘节点,但边缘节点仍然可能需要向源站获取页面、接口或未缓存的文件。这个过程就是“回源”。
不少网站在接入阶段会遇到这种情况:用户访问已经启用HTTPS,源站也安装了证书,可CDN一回源就出现502、TLS握手失败、证书域名不匹配,或者页面陷入反复跳转。问题通常不是“有没有证书”这么简单,而是回源协议、端口、SNI、HTTP Host和证书域名没有对齐。
对于正常运行的生产网站,优先建议使用:
CDN到源站采用HTTPS回源,使用443或厂商支持的HTTPS端口,开启严格证书校验,并确保回源SNI对应的域名包含在源站证书的SAN中。
HTTP回源并非完全不能使用,但如果CDN与源站之间经过公网,HTTP会让这段链路失去传输加密和源站身份验证。登录信息、Cookie、接口数据以及回源鉴权头都可能暴露在未加密链路上。
用户访问HTTPS,不代表CDN回源也是HTTPS
一次经过CDN的HTTPS访问,实际上可能包含两条独立连接:
用户浏览器
│
│ HTTPS:验证CDN边缘证书
▼
CDN边缘节点
│
│ HTTP或HTTPS:由CDN回源配置决定
▼
源站服务器第一条连接是用户与CDN之间的“边缘连接”,使用的是CDN为加速域名配置的边缘证书。
第二条连接是CDN与源站之间的“回源连接”,使用的是源站证书。即使浏览器地址栏显示安全锁,也不能据此判断回源链路是否加密。
因此,下列配置在技术上都可能存在:
用户到CDN | CDN到源站 | 实际情况 |
|---|---|---|
HTTPS | HTTPS | 两段链路均加密,推荐 |
HTTPS | HTTP | 浏览器到CDN加密,回源链路明文 |
HTTP | HTTPS | 较少使用,通常配合边缘跳转 |
HTTP或HTTPS | 跟随用户协议 | 回源协议随访客请求变化 |
如果希望配置简单、结果稳定,通常应在边缘将HTTP访问重定向到HTTPS,同时让CDN固定使用HTTPS回源,而不是让回源协议随着访客协议变化。
CDN回源应该选HTTP还是HTTPS
生产网站优先使用HTTPS回源
以下业务不应仅依赖HTTP回源:
登录、注册和用户中心;
电商订单与支付相关页面;
API接口及带有Token的请求;
使用Cookie维持会话的网站;
管理后台、企业内部系统;
涉及个人信息或业务敏感数据的页面;
源站与CDN节点之间经过公共网络的业务。
HTTPS回源除了加密数据,还能通过证书验证源站身份。如果CDN严格检查证书,就能降低流量被转发到错误服务器或中间节点的风险。
什么情况下可能使用HTTP回源
HTTP回源通常只适合以下有限场景:
源站确实不支持TLS,暂时处于迁移阶段;
CDN与源站之间使用受控专线、私有网络或加密隧道;
纯公开静态内容,且已经评估过回源链路风险;
内部测试环境,不承载真实用户数据。
即使源站位于私有网络,也应确认链路是否真正隔离,不能仅因为使用了内网IP就认定传输一定安全。HTTP回源更适合作为暂时兼容方案,而不是生产环境的默认选择。
先分清源站地址、回源Host和SNI
配置HTTPS回源时,最容易混淆的是下面三个值:
配置项 | 作用阶段 | 典型示例 |
|---|---|---|
源站地址 | 决定CDN连接哪台服务器 |
|
SNI | TLS握手时帮助源站选择证书 |
|
回源Host | TLS完成后,用于HTTP虚拟主机和应用路由 |
|
这三个值可以相同,也可以不同,具体取决于源站架构和CDN厂商提供的配置能力。
源站地址决定连接目标
源站地址可以是IP,也可以是专门的源站域名。例如:
源站地址:203.0.113.10
回源端口:443或者:
源站地址:origin.example.net
回源端口:443源站地址解决的是“CDN应该连接到哪里”。如果使用源站域名,应避免该域名再次解析回当前CDN,否则可能形成回源循环。
如需进一步区分边缘节点和真实源站,可以参考CDNChart的CDN节点IP和源站IP区别说明。
SNI决定源站返回哪张证书
同一个IP和443端口上可以部署多个HTTPS网站。TLS握手发生时,HTTP请求还没有发送,服务器无法根据HTTP Host选择站点,因此客户端会在握手阶段通过SNI告诉服务器准备访问哪个主机名。
RFC 6066对SNI的定义说明了客户端如何在TLS ClientHello中携带服务器名称,使同一地址上的多个虚拟主机能够选择相应证书。
例如源站同时托管多个网站:
203.0.113.10
├── www.example.com
├── api.example.com
└── static.example.com如果CDN回源时没有发送SNI,或者发送了错误的SNI,服务器可能返回默认站点的证书。此时端口虽然能够连接,TLS握手仍可能因为证书域名不匹配而失败。
回源Host决定请求进入哪个网站
TLS握手完成后,CDN才发送HTTP请求。请求中的Host决定Nginx、Apache、负载均衡器或应用网关把请求交给哪个虚拟主机。
因此可能出现:
源站地址:203.0.113.10
SNI:origin.example.net
Host:www.example.com这表示:
CDN连接
203.0.113.10:443;TLS握手使用
origin.example.net作为SNI;源站返回覆盖
origin.example.net的证书;TLS成功后,HTTP请求使用
Host: www.example.com;Web服务器把请求交给
www.example.com对应的站点。
并非所有CDN都允许SNI和回源Host分别设置。有些厂商默认让两者保持一致,有些会在修改Host时同步修改SNI,还有些需要单独创建回源规则。配置前必须查看当前厂商文档,不能假设所有CDN行为一致。
源站证书应该包含哪个域名
源站证书需要匹配CDN实际用于证书校验的名称,通常就是回源SNI或厂商定义的源站主机名。
例如:
回源SNI:origin.example.net那么源站证书的Subject Alternative Name,也就是SAN,至少应包含:
DNS:origin.example.netRFC 9525的服务身份验证规范明确强调,应通过证书的subjectAltName验证DNS名称,而不是只依赖证书Common Name。
检查时不要只看证书是否过期,还要核对:
证书是否在有效期内;
SAN是否包含回源校验域名;
中间证书链是否完整;
签发机构是否被CDN信任;
源站是否在目标端口返回了正确证书;
多源站环境中的每台服务器配置是否一致。
通配符证书也有边界。*.example.com通常可以覆盖origin.example.com,但不能覆盖根域名example.com,也不能覆盖a.origin.example.com这样的多级子域名。
公共CA证书还是CDN源站证书
源站通常可以使用以下证书:
证书类型 | 适用情况 | 需要注意 |
|---|---|---|
公共CA证书 | 多CDN、需要直接测试、希望便于迁移 | 注意自动续期和完整证书链 |
CDN厂商源站证书 | 源站只接受指定CDN回源 | 浏览器和其他CDN可能不信任 |
自签名证书 | 仅限厂商明确支持自定义信任或证书固定 | 不能默认认为CDN会接受 |
例如,Cloudflare的Full (strict)模式说明要求源站证书有效、域名匹配,并由受信任的公共CA或其Origin CA签发。 这属于Cloudflare的具体行为,其他CDN是否接受厂商源站证书、自签名证书或私有CA,需要分别确认。
如果未来可能切换CDN或使用多CDN,公共CA证书通常更容易迁移。厂商专用源站证书则适合源站只允许该厂商访问的架构,但不能把它当作所有客户端都能验证的普通公网证书。
回源端口应该选80、443还是8443
协议和端口是两个独立配置项,但常见对应关系如下:
回源协议 | 常用端口 | 建议 |
|---|---|---|
HTTP | 80 | 仅用于明确接受明文回源的场景 |
HTTPS | 443 | 生产环境首选 |
HTTP | 8080 | 仅在源站确实以HTTP监听时使用 |
HTTPS | 8443 | 需要确认CDN支持自定义HTTPS回源端口 |
自定义 | 其他端口 | 同时检查CDN限制、防火墙和监听协议 |
把端口改成8443并不会自动提高安全性。安全性来自TLS、证书验证、访问控制和正确的源站认证,而不是端口数字是否少见。
还要区分两个概念:
用户访问CDN使用的边缘端口;
CDN连接源站使用的目标端口。
用户通过443访问CDN,不代表CDN必须连接源站443;但如果把HTTPS回源配置成80,而源站80只接受普通HTTP,CDN发送TLS握手时就会失败。反过来,将HTTP协议发往只监听TLS的443端口,也会出现连接被重置、无有效响应或协议错误。
自定义端口上线前至少确认:
CDN支持该回源端口
源站服务正在该端口监听
监听协议与回源协议一致
防火墙允许CDN回源网络访问
证书在该端口正确加载
健康检查使用相同或兼容的协议一套更稳妥的生产配置
对于常规网站,可以从下面这套配置开始:
用户访问协议:HTTP自动跳转HTTPS
CDN回源协议:HTTPS Only
回源端口:443
源站地址:专用源站域名或源站负载均衡地址
回源SNI:源站证书覆盖的域名
回源Host:应用实际识别的业务域名
证书校验:严格验证
源站访问控制:限制CDN回源来源或启用回源认证如果源站证书覆盖www.example.com,Web服务器也以www.example.com作为虚拟主机,可以让SNI和Host都使用该域名。
如果源站使用独立域名,则可以采用:
源站地址:origin.example.net
回源SNI:origin.example.net
回源Host:www.example.com前提是CDN支持分别设置SNI和Host,并且源站证书覆盖origin.example.net。
不要把“忽略证书错误”作为长期配置。它虽然可能暂时让回源恢复,但会失去源站身份验证,使HTTPS只剩下加密而缺少可靠认证。
用curl直接验证HTTPS源站
测试源站时,不建议直接访问:
curl https://203.0.113.10/这种方式可能没有发送正确SNI,还会按照IP校验证书,无法真实模拟CDN的域名回源。
如果SNI和Host都应该是www.example.com,可以使用:
curl -sS -D - -o /dev/null \
--resolve www.example.com:443:203.0.113.10 \
https://www.example.com/--resolve只在本次请求中将www.example.com:443连接到指定IP,URL中的域名仍用于TLS SNI、证书校验和HTTP Host。curl官方手册对--resolve的定义也是为指定的主机名与端口临时设置连接地址。
重点观察:
是否成功完成TLS握手;
返回的HTTP状态码;
证书校验是否通过;
响应是否来自正确站点;
源站日志能否看到这次请求。
如果回源SNI和Host不同,可以分别模拟:
curl -sS -D - -o /dev/null \
--resolve origin.example.net:443:203.0.113.10 \
https://origin.example.net/ \
-H 'Host: www.example.com'这个命令使用origin.example.net建立TLS连接并校验证书,然后在HTTP请求中发送Host: www.example.com。
测试只应针对自己管理或已经获授权的源站。不要在公开文章、工单截图或聊天记录中暴露真实源站IP、内部域名、Cookie和认证Token。
用OpenSSL检查SNI和证书链
需要查看源站实际返回的证书时,可以执行:
openssl s_client \
-connect 203.0.113.10:443 \
-servername origin.example.net \
-verify_hostname origin.example.net \
-verify_return_error \
-showcerts </dev/null检查以下输出:
subject=
issuer=
X509v3 Subject Alternative Name
Verify return code正常情况下,SAN应包含origin.example.net,证书仍在有效期内,证书链完整,并且验证结果为成功。
如果不加-servername,共享IP上的服务器可能返回默认证书。这恰好可以帮助确认“CDN没有发送正确SNI时会发生什么”,但不能用这种结果直接判断源站证书配置错误。
不要依赖curl -k或openssl忽略验证错误来证明配置已经恢复。跳过校验只能用于定位“问题是否确实来自证书验证”,不能作为生产环境的修复方案。
不同测试结果分别说明什么
测试结果 | 更可能的问题 | 下一步检查 |
|---|---|---|
| 端口未监听或被主动拒绝 | 检查监听地址、服务状态和回源端口 |
连接超时 | 防火墙、路由或安全组未放行 | 查看源站网络日志和CDN回源地址范围 |
| HTTP与HTTPS协议、端口混用 | 核对源站端口实际监听协议 |
证书域名不匹配 | SNI错误或证书SAN缺少目标域名 | 对照CDN回源SNI和证书SAN |
| 中间证书链不完整或CA不受信任 | 安装完整证书链,确认CDN信任范围 |
TLS成功但返回404 | Host、虚拟主机或请求路径错误 | 对比回源Host和Web服务器站点配置 |
TLS成功但返回403 | 源站访问控制、WAF或鉴权拒绝 | 查看源站日志,不要直接关闭安全策略 |
CDN返回502 | 连接、TLS、协议或源站响应均可能异常 | 同时检查CDN错误日志和源站直连 |
反复301、302 | 回源协议识别或HTTPS跳转规则冲突 | 检查 |
不同CDN使用的错误码并不完全一致。例如,有些厂商会把源站TLS失败统一显示为502,有些会提供单独的握手或证书错误码。因此,不能只根据前台错误页下结论,还要查看CDN控制台中的回源错误原因。
为什么开启HTTPS回源后出现重定向循环
常见错误配置是:
用户通过HTTPS访问CDN;
CDN使用HTTP连接源站;
源站发现请求是HTTP,于是跳转到HTTPS;
CDN仍然以HTTP回源;
源站再次跳转。
还有一种情况是CDN已经使用HTTPS回源,但源站应用没有正确识别反向代理传递的协议,仍把请求判断成HTTP。
排查时可以查看:
curl -sS -I https://www.example.com/观察Location是否反复指向同一URL,并检查源站应用是否正确、可信地处理X-Forwarded-Proto或厂商提供的等效请求头。
只有来自受信任CDN或反向代理的转发头才能用于协议判断。不要允许任意公网客户端伪造转发头影响安全跳转或应用逻辑。
修改后怎样确认回源真正恢复
不要只测试一次首页。建议按下面的范围复查:
首页、静态资源和动态接口是否正常;
首次访问或缓存MISS时是否能够成功回源;
清理测试对象缓存后是否仍能重新获取;
不同源站、负载均衡后端是否返回同一套证书;
HTTP是否正确跳转到HTTPS;
API的Cookie、认证头和请求体是否正常传递;
CDN控制台是否仍记录TLS或连接错误;
源站日志中的Host、协议判断和状态码是否符合预期。
可以使用CDNChart的网站测速工具从公开用户路径观察不同地区的状态码和访问表现,但公开测速不能直接看到CDN内部使用的回源SNI和证书校验结果,这部分仍要结合CDN控制台、源站日志及定向命令判断。
如果尚未确认请求是否真正经过CDN,可以先通过CDN检测工具辅助查看域名解析、节点和厂商线索。证书链与公开端点的检查边界,则可以参考CDN安全评分中的TLS说明。
常见问题
用户访问已经是HTTPS,回源使用HTTP会影响浏览器安全锁吗?
浏览器可能仍然显示安全锁,因为浏览器验证的是用户到CDN边缘节点的连接。但是CDN到源站这一段仍然是明文,浏览器不会直接感知这段链路。因此,有安全锁不等于端到端两段链路都已加密。
源站使用IP作为回源地址,证书需要包含这个IP吗?
不一定。CDN可以连接源站IP,同时使用域名作为SNI和证书校验名称。只要厂商支持这种配置,证书覆盖SNI域名即可。如果CDN确实按照IP校验证书,则证书必须包含相应的IP地址标识,但公网证书和不同CDN对此支持有限,通常更适合配置明确的源站域名。
SNI和回源Host必须一样吗?
不必须。SNI在TLS握手阶段用于证书选择和身份校验,Host在TLS完成后的HTTP请求中用于站点路由。两者可以不同,但CDN和源站必须同时支持这种配置。若厂商会自动同步两者,就不能按照完全独立的字段来设计。
源站安装了证书,为什么CDN仍然返回502?
“安装了证书”只能说明源站具备TLS配置,不能证明证书有效。证书过期、SAN不匹配、中间链缺失、SNI错误、CA不被CDN信任、端口未监听以及TLS版本不兼容,都可能导致回源失败。部分CDN会把这些错误统一呈现为502。
HTTPS回源一定要使用443端口吗?
不一定,但443兼容性最好。使用8443或其他端口前,需要确认CDN允许该回源端口、源站实际以TLS监听、防火墙已经放行,并且健康检查与业务请求使用兼容的协议。更换端口本身不会提升加密强度。
能不能用自签名证书做HTTPS回源?
只有在CDN明确支持自签名证书、私有CA或证书固定,并且已经配置相应信任关系时才可以。否则严格校验会失败。不要通过长期关闭证书验证来兼容自签名证书。
HTTPS回源配置正确后,还需要限制源站访问吗?
需要。HTTPS负责加密和验证连接,不等于源站已经禁止绕过CDN访问。可以结合CDN回源地址限制、源站鉴权、厂商提供的认证回源或mTLS能力保护源站。配置访问控制时应保留管理和应急通道,避免因厂商地址范围变化导致整个源站不可达。
- CDN回源协议
- CDN源站证书
- CDN回源SNI
- CDN回源端口
- CDN回源失败
- HTTPS回源502