CDN配了HTTPS证书,源站还要不要开443端口

这个问题在实际接入CDN时很常见。很多人以为CDN上已经上传了HTTPS证书,用户访问也是https://域名,那源站就不用管443了。这里容易混淆两个位置:用户到CDN节点这一段,和CDN节点到源站这一段。

CDN上的HTTPS证书,只负责浏览器到CDN边缘节点的TLS握手。浏览器看到的证书、锁标识、TLS版本,都是CDN节点在处理。至于CDN再去源站取内容时,是走HTTP还是HTTPS,要看CDN里的“回源协议”怎么配置。

把访问链路拆开看就清楚了

一次完整访问大概是这样:

用户浏览器 → CDN边缘节点 → 源站服务器

前半段是“客户端到CDN”,后半段是“CDN到源站”。HTTPS证书可以分别存在于这两段。

如果用户访问https://www.example.com,浏览器只会和CDN节点做TLS握手。CDN节点拿着你在CDN控制台配置的证书返回给浏览器。这个阶段,源站是否开放443端口,浏览器并不知道。

CDN拿到请求后,再根据回源配置去源站取资源。如果回源协议是HTTP,CDN会访问源站的80端口,或者你配置的其他HTTP端口。这个时候源站不需要开放443。

如果回源协议是HTTPS,CDN会访问源站的443端口,或者你配置的HTTPS回源端口。这个时候源站就必须开放443,并且Web服务要能正常处理HTTPS请求。

常见配置对应关系

实际排查时,可以直接按下面这类场景判断:

场景:用户访问HTTPS,CDN回源HTTP。源站需要开放80端口,不需要开放443。适合静态站、普通内容分发、源站和CDN之间走内网或可信网络的场景。

场景:用户访问HTTPS,CDN回源HTTPS。源站需要开放443端口。适合登录、支付、后台接口、会员系统、API、合规要求较高的业务。

场景:用户访问HTTP和HTTPS都支持,CDN回源跟随协议。用户HTTP访问时CDN用HTTP回源,用户HTTPS访问时CDN用HTTPS回源。源站通常80和443都要开,不然一部分请求会失败。

场景:CDN只做HTTPS入口,但源站只监听8080。可以在CDN里把回源端口配置成8080,源站不一定要开443,前提是CDN支持自定义回源端口,且协议配置匹配。

CDN证书和源站证书不是同一个概念

这里补充一点,CDN上配置了证书,不代表源站也自动有证书。CDN证书安装在CDN边缘节点,源站证书安装在源站Nginx、Apache、IIS、Tomcat或负载均衡上。

如果CDN使用HTTPS回源,源站也需要能完成TLS握手。也就是说,源站443端口要监听,证书要配置,域名SNI最好也要匹配。

有些CDN支持“HTTPS回源但不校验证书”,这种情况下源站证书即使用自签证书也可能能跑起来。但实际使用中发现,这种配置后期容易埋坑:换CDN、开严格校验、接入安全扫描、API网关联动时,经常突然报证书错误。

更稳的做法是源站也配置有效证书。可以用公网CA证书,也可以用平台签发的源站证书。证书域名建议和回源Host保持一致,避免SNI不匹配。

什么时候源站可以不开443

如果CDN回源协议明确设置为HTTP,源站只提供HTTP服务,那源站可以不开443。很多图片站、下载站、展示型官网会这么做。

这种模式的好处是配置简单,源站Nginx只要监听80,证书续期只在CDN侧处理。源站压力也会少一点,TLS握手由CDN节点承担。

但要注意,用户到CDN是HTTPS,不代表全链路都是HTTPS。CDN到源站这一段如果是HTTP,链路中间的数据是明文传输。对于普通静态资源问题不大,但如果有Cookie、Authorization Header、用户资料、订单数据,就不建议这样配。

还有一个容易忽略的点:如果源站程序里强制跳转HTTPS,比如Nginx写了return 301 https://$host$request_uri;,但CDN回源走HTTP,有时会出现回源301循环。浏览器看起来像访问一直跳,实际上是CDN和源站之间协议判断没处理好。

什么时候源站必须开443

CDN回源协议设置成HTTPS时,源站必须开443,除非你在CDN里显式配置了其他HTTPS回源端口,比如8443。

另外,如果CDN配置了“协议跟随”,也要看用户侧请求。如果用户HTTPS访问会触发HTTPS回源,那源站443也得通。很多故障就是这里来的:测试HTTP正常,一切资源都能打开;切到HTTPS后,CDN报502、回源失败、SSL handshake failed。

还有一些云厂商CDN会把“强制HTTPS回源”“强制校验证书”“SNI回源”分开配置。只开443还不够,证书链不完整、域名不匹配、源站不支持SNI,都可能导致失败。

实战里最容易踩的配置问题

安全组只放了80,CDN回源改成了HTTPS

这个很常见。CDN控制台里把回源协议从HTTP改成HTTPS后,源站云服务器安全组没放行443,系统防火墙也没放行443。结果用户访问CDN直接502。

排查时不要只看Nginx配置,要同时看云服务器安全组、iptables/firewalld、宝塔面板防火墙、主机商后台防火墙。有些高防服务器还有单独的端口策略,也要放行。

源站开了443,但证书域名不匹配

比如CDN回源Host是www.example.com,但源站443上配置的证书是origin.example.com。CDN如果开启严格证书校验,就会报证书不匹配。

解决方式通常有两种:要么给源站证书加上CDN回源使用的域名,要么调整CDN回源Host和源站证书一致。不要只看浏览器访问CDN正常,浏览器看到的是CDN证书,不是源站证书。

源站只对某个域名监听443

Nginx里多个server块时,如果default_server没配好,CDN带着某个Host回源,可能落到错误站点。表现出来就是源站本机curl正常,CDN回源异常。

可以在源站上测试:

curl -vk --resolve www.example.com:443:源站IP https://www.example.com/

这个命令能模拟CDN用指定Host访问源站443,比直接curl https://源站IP更接近真实情况。

CDN回源端口不是默认443

有些业务源站HTTPS监听在8443、9443,CDN支持配置HTTPS回源端口。这个时候源站不一定要开放443,但必须开放你配置的那个端口。

不过从运维习惯看,公网业务还是建议用标准端口80和443,排障成本低。非标准端口在安全组、WAF、高防、CDN回源规则里多绕一层,后面接手的人容易误判。

HTTP回源和HTTPS回源怎么选

如果只是图片、CSS、JS、安装包下载,且源站和CDN之间没有敏感数据,HTTP回源能用,配置也省事。

如果涉及用户登录、管理后台、API接口、支付回调、Cookie鉴权、Token传输,建议HTTPS回源。别只盯着浏览器地址栏那把锁,真正敏感的数据也会从CDN回到源站。

从性能上看,HTTPS回源会有TLS开销,但现在服务器CPU性能和CDN连接复用能力都已经比较成熟。实际瓶颈更多出现在源站带宽、数据库、PHP-FPM、Node进程、磁盘IO,而不是HTTPS本身。

实际使用中发现,很多站点开启HTTPS回源后,源站CPU变化不明显,反而是源站线路质量影响更大。比如国内用户访问海外源站,如果源站线路绕路严重,CDN回源慢,用户侧也会感觉慢。源站放在香港CN2、美国CMIN2、GIA这类精品线路上,回源稳定性会明显好一些。

如果你也在找这种适合做CDN源站、海外业务入口或者回国访问优化的服务器,可以看看129云。比如香港精品CN2-B型适合华南、国内访问香港业务,4C 4G、70G SSD、50Mbps峰值、1TB双向流量;美国精品网-E型走CMIN2,16C 16G、100Mbps峰值,更适合需要高速回国和稳定网络的业务。需要确认线路、带宽和防护策略时,也可以直接打客服热线400-9177118。

源站只开80时,HTTPS跳转要特别处理

很多网站会在源站Nginx里写强制跳转:

http://example.com → https://example.com

如果CDN到源站走HTTP,源站看到的请求协议就是HTTP。程序如果不知道前面有CDN,就可能一直认为请求不安全,然后不断返回跳转。

这种场景要让源站识别X-Forwarded-Proto或者类似Header。CDN一般会传:

X-Forwarded-Proto: https

源站应用根据这个Header判断用户原始访问协议,而不是只看本地连接是不是HTTP。Nginx、Laravel、Django、Spring Boot、WordPress都能处理,只是配置方式不同。

WordPress站点尤其容易出问题。后台地址、站点地址、反向代理Header没配置好,会出现后台进不去、静态资源混合内容、无限301。CDN侧证书没问题,但源站应用层还在用HTTP视角生成链接。

开443不等于暴露源站给全网

有些人担心源站开443后会被直接扫到,绕过CDN访问源站。这个担心是对的,但处理方式不是简单关掉443,而是做源站访问控制。

常见做法是源站防火墙只允许CDN回源IP访问80和443。用户不能直接访问源站IP,只能经过CDN。这样既可以HTTPS回源,也能减少源站被扫、被打、被绕过WAF的风险。

如果CDN回源IP段经常变化,要定期同步白名单。有些CDN提供回源IP列表API,可以写脚本同步到安全组或iptables。高防场景下还要确认清洗节点、WAF节点、CDN节点的回源地址是不是同一批。

多说一句,源站IP不要随便写在DNS记录、邮件头、报错页面、Git仓库配置里。源站开不开443只是端口层面的事,真正被绕过CDN,很多时候是IP泄露。

用502和525快速判断问题方向

不同CDN的错误码不完全一样,但大概可以按现象判断。

如果CDN报502、504,可能是源站端口不通、源站服务没启动、安全组拦截、回源超时。先测端口连通性。

如果报SSL handshake failed、525、526、源站证书错误,大概率是HTTPS回源阶段出问题。看源站443、证书链、SNI、TLS版本。

如果浏览器提示证书错误,但CDN回源正常,那通常是CDN边缘证书配置问题,比如证书过期、证书没有覆盖当前域名、没有部署到对应CDN加速域名。

排查时可以分三段测:

浏览器访问CDN域名,看用户到CDN是否正常。

从公网机器curl源站80或443,看源站端口是否正常。

带Host和SNI测试源站HTTPS,看CDN真实回源方式是否能成功。

推荐的源站配置习惯

生产环境里,如果业务不是纯静态下载,源站同时开80和443更省心。80可以只用于跳转或健康检查,443承载真实回源。

Nginx可以这样规划:80监听保留,返回301或给CDN健康检查用;443配置有效证书,开启HTTP/2可选;CDN回源使用HTTPS,回源Host和证书域名保持一致。

如果担心源站安全,配合CDN回源IP白名单。这样443虽然开放,但不是对全网开放。再加上源站隐藏、SSH改端口或只允许固定管理IP、管理后台加访问控制,整体会稳很多。

带宽型业务还要看源站出口。CDN能挡住用户侧并发,但缓存未命中、动态请求、刷新预热、回源大文件,都会压到源站。如果源站只有5Mbps、10Mbps,CDN配置再漂亮也容易回源慢。类似大文件分发、游戏补丁、跨境访问,可以考虑129云的美国精品大宽带-B型,4C 4G、80G SSD、1Gbps峰值、1.5TB流量,适合做海外源站或下载源站,前面再挂CDN分发。

直接判断源站要不要开443

看CDN回源协议。

CDN回源HTTP:源站不用开443,开80或配置的HTTP端口即可。

CDN回源HTTPS:源站必须开443,或者开CDN里指定的HTTPS回源端口。

CDN回源跟随协议:只要用户HTTPS访问会触发HTTPS回源,源站就要开443。

有安全、合规、登录态、API、后台、支付这类场景:建议源站开443,并配置HTTPS回源。

源站开443后,别忘了安全组、防火墙、Nginx监听、证书链、SNI、回源Host、CDN回源IP白名单这些位置一起检查。