知识卡片
CDN与HTTPS的根本冲突:CNAME透明转发与证书域名验证的错位
内容
HTTPS对连接安全性的核心保障之一是”验明身份”:客户端与服务器建立TCP连接、完成安全握手时,服务器需要向客户端出示X.509标准的证书,证书里包含服务器所声称的域名信息,客户端会拿这个证书域名和自己实际请求的域名做比对,只有两者匹配,客户端才会信任”我连接到的确实是我要访问的那个服务器”,之后才会协商出这次会话用的对称密钥、建立起真正安全可信的通道。而CDN的工作方式恰恰是”透明地”把用户请求转发到CDN自己的服务器上:几乎所有CDN厂商都是通过CNAME别名,在DNS解析这一步就把域名解析结果指向了CDN厂商的服务器,但从建立HTTPS连接的客户端(比如浏览器)视角看,它完全不知道这次转发的存在,它仍然以为自己在直接和客户的原始网站通信。这就产生了根本冲突:客户端拿着”客户网站”的域名去验证证书,但真正响应连接的却是CDN厂商的服务器——如果CDN服务器不能提供一份能够通过这个域名校验的”正确”证书,HTTPS的身份验证环节就会直接判定这次连接不合法。这个案例揭示了一条通用的架构冲突模式:一层设计目标是”让中间转发对用户完全透明”的基础设施(CDN),一旦叠加到另一层设计目标是”必须让通信双方身份可验证、不允许任何中间人存在”的安全机制(HTTPS)之上,两者的设计初衷会天然互相冲突,透明转发本身在安全验证的视角下和中间人攻击是难以区分的。
参考来源
- 位置:《高可用架构(第1卷)》第7章《安全与网络》"7.4 HTTPS环境使用第三方CDN的证书难题与最佳实践"节(源文件:_epub-src/OEBPS/Text/Chapter7_4.xhtml)
- 结论依据:原文说明"因为几乎所有的CDN厂商都使用CNAME别名方式,在DNS解析过程中,将请求转到CDN服务器上,因此对于建立HTTPS的实体(例如浏览器)来说,它认为它仍然在和原始网站通信,因此,如果CDN厂商的服务器不能返回'正确的'证书,那么HTTPS就能识别出该服务器是有问题的",直接支撑本卡片结论。
- 原始内容:因为几乎所有的CDN厂商都使用CNAME别名方式,在DNS解析过程中,将请求转到CDN服务器上,因此对于建立HTTPS的实体(例如浏览器)来说,它认为它仍然在和原始网站通信,因此,如果CDN厂商的服务器不能返回"正确的"证书,那么HTTPS就能识别出该服务器是有问题的。