5月27日 22:21

CDN 如何配置 HTTPS?三种回源模式有什么区别?

直接回答

CDN 配置 HTTPS 主要有三种方式:自定义证书上传、CDN 免费证书、SNI 多域名证书。HTTPS 回源模式分三档:Flexible(仅客户端加密)、Full(全链路加密但不验证源站证书)、Full Strict(全链路加密且严格验证源站证书),生产环境应选 Full Strict。

HTTPS 配置方式

自定义证书上传:购买或申请 SSL 证书后,在 CDN 控制台上传 .crt 证书和 .key 私钥。优点是完全可控,支持通配符和 EV 证书;缺点是需手动续期。

CDN 免费证书:主流 CDN 支持 Let's Encrypt 等免费证书,自动签发和续期,适合中小站点。Cloudflare 的 Universal SSL 就属此类。

SNI 方式:CDN 在同一 IP 上通过 SNI 区分不同域名的证书,客户端握手时携带域名,服务端返回对应证书。现代浏览器均支持。

bash
# Cloudflare 启用 Universal SSL 示例 curl -X PATCH "https://api.cloudflare.com/client/v4/zones/{zone_id}/settings/ssl" \ -H "Authorization: Bearer {api_token}" \ -H "Content-Type: application/json" \ -d '{"value":"strict"}'

三种 HTTPS 回源模式

这是面试核心,务必理解三者区别:

Flexible:用户→CDN 走 HTTPS,CDN→源站走 HTTP。源站无需证书,但回源链路明文传输,存在中间人风险。仅适合测试环境或纯静态内容。

Full:全链路 HTTPS,但 CDN 不验证源站证书是否合法(自签名证书也接受)。比 Flexible 安全,但无法防御源站侧的证书伪造攻击。

Full Strict:全链路 HTTPS + 严格证书验证,要求源站证书由受信 CA 签发且域名匹配。安全性最高,证书异常会直接拒绝连接。金融、政务等场景必选。

关键配置实践

强制 HTTPS 跳转和 HSTS 是标配:

nginx
# Nginx 强制跳转 server { listen 80; return 301 https://$host$request_uri; } # HSTS 响应头 add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

SSL 协议只保留 TLS 1.2 和 1.3,禁用弱加密套件。启用 OCSP Stapling 减少握手延迟,配置会话缓存复用 SSL 连接:

nginx
ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_session_cache shared:SSL:10m; ssl_stapling on; ssl_stapling_verify on;

常见坑

无限重定向循环:CDN 开启强制 HTTPS,源站又把 HTTPS 重定向回 HTTP,形成死循环。解决办法是源站只监听 80 端口或正确识别 CDN 传递的 X-Forwarded-Proto 头。

混合内容警告:HTTPS 页面加载了 HTTP 资源,浏览器会拦截。用 CSP 头自动升级:Content-Security-Policy: upgrade-insecure-requests

证书链不完整:只上传了域名证书缺少中间证书,导致客户端无法验证。解决:按域名证书→中间证书的顺序拼接后上传。

追问方向

  • SNI 在什么场景下会失效?老旧客户端(IE6/Windows XP)不支持 SNI,CDN 如何兼容?
  • 如果源站证书过期,Full Strict 模式下会发生什么?如何做到零停机续期?
  • CDN 开启 HSTS 后源站切换回 HTTP 会有什么后果?
标签:CDN