我试图了解当涉及 CDN 时,客户端和原点之间的 TLS 是如何终止的。
我认为当客户端直接连接到源站时,这非常简单,可以为与源站关联的任意数量的证书/ SAN 成员建立握手。
但是如果我需要 CDN 怎么办?如果不上传相同的源证书并将其配置为从 CDN 呈现,是否无法在我的源前使用第三方 CDN?
我知道不同的 CDN 处理事情的方式不同。例如,Google CDN 似乎能够使用应用于上游 GCP LB 的证书正确终止 TLS。这是不是只有 GCDN 才能做到的特殊事情,因为它们与 GCP 紧密集成?
理想情况下,我希望能够在自己的源站托管自己的证书,并让 CDN 通过 TCP 直接到达源站,这样客户端和源站服务器就可以进行端到端认证和加密,而无需在 CDN 上进行任何额外配置,而 CDN 仍负责缓存部分。但这听起来似乎不可能?
client => cdn => origin(cert)
答案1
CDN 只不过是一个强化版的负载均衡器。当客户端发出请求时,将建立两个不同的 TLS 会话:
- 客户端 -> CDN
- CDN -> 原点
这意味着:
- 客户端只需信任 CDN 证书
- 如果 CDN 和源之间的通信使用 TLS,则 CDN 必须信任源证书。但是,此 TLS 连接不是必需的,并且如果 CDN 和源之间的链接未加密,则客户端对此一无所知。
也就是说,客户端和源之间没有真正的端到端加密,CDN 是一个 TLS 终止点。CDN 后面发生的任何事情对于客户端来说都是一个黑匣子。而且你无法在客户端检测或避免这种情况。CDN 必须能够访问 TLS 加密数据才能确定如何处理请求,例如在本地缓存中搜索、路由到最近的源等等。