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 连接:
nginxssl_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 会有什么后果?