乐闻世界logo
搜索文章和话题

CDN 如何配置 HTTPS?有哪些 HTTPS 模式?

2月21日 16:59

CDN HTTPS 配置的重要性

HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 的安全版本,通过 SSL/TLS 协议加密通信内容。在 CDN 上配置 HTTPS 不仅可以保护数据传输安全,还能提升 SEO 排名和用户信任度。

CDN HTTPS 配置方式

1. 自定义证书上传

将自有 SSL 证书上传到 CDN:

步骤

  1. 购买或申请 SSL 证书
  2. 下载证书文件(.crt)和私钥文件(.key)
  3. 在 CDN 控制台上传证书和私钥
  4. 配置 HTTPS 监听端口(通常是 443)

优点

  • 完全控制证书
  • 支持通配符证书和 EV 证书
  • 适合企业级应用

缺点

  • 需要手动管理证书续期
  • 需要购买证书(部分 CDN 提供免费证书)

2. CDN 提供的免费证书

使用 CDN 服务商提供的免费 SSL 证书:

特点

  • Let's Encrypt:大多数主流 CDN 支持
  • 自动续期:无需手动操作
  • 通配符支持:部分 CDN 支持 *.example.com

配置示例(Cloudflare):

bash
# 通过 API 启用 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":"flexible"}'

3. SNI(Server Name Indication)支持

SNI 允许在同一 IP 地址上托管多个 HTTPS 网站:

工作原理

  • 客户端在 SSL 握手时发送目标域名
  • 服务器根据域名返回对应的证书
  • CDN 自动处理 SNI 请求

兼容性

  • 现代浏览器完全支持
  • 旧版浏览器(如 IE6)不支持

HTTPS 模式选择

1. Flexible 模式

流程:用户 → CDN(HTTPS)→ 源站(HTTP)

优点

  • 配置简单,源站无需 SSL 证书
  • 适合快速部署

缺点

  • CDN 到源站不加密,存在安全风险
  • 不适合敏感数据传输

适用场景

  • 静态内容分发
  • 测试环境
  • 临时解决方案

2. Full 模式

流程:用户 → CDN(HTTPS)→ 源站(HTTPS)

优点

  • 端到端加密
  • 安全性高

缺点

  • 源站需要配置 SSL 证书
  • 证书必须与 CDN 配置匹配

适用场景

  • 生产环境
  • 敏感数据传输
  • 符合合规要求

3. Full (Strict) 模式

流程:用户 → CDN(HTTPS)→ 源站(HTTPS,严格验证)

特点

  • 验证源站证书的有效性
  • 检查证书链完整性
  • 验证证书与域名匹配

优点

  • 最高安全性
  • 防止中间人攻击

缺点

  • 配置复杂
  • 证书问题会导致连接失败

适用场景

  • 金融、医疗等高安全要求行业
  • 政府机构
  • 企业核心业务

HTTPS 配置最佳实践

1. 强制 HTTPS 重定向

自动将 HTTP 请求重定向到 HTTPS:

http
# 配置示例 HTTP/1.1 301 Moved Permanently Location: https://example.com$request_uri

实现方式

  • CDN 页面规则
  • 源站配置
  • HSTS(HTTP Strict Transport Security)

2. HSTS 配置

HSTS 强制浏览器使用 HTTPS:

http
Strict-Transport-Security: max-age=31536000; includeSubDomains

参数说明

  • max-age:HSTS 有效期(秒)
  • includeSubDomains:包含所有子域名
  • preload:加入 HSTS 预加载列表

注意事项

  • 一旦启用,短期内无法禁用
  • 确保所有子域名都支持 HTTPS

3. 优化 SSL/TLS 配置

选择合适的加密套件和协议:

推荐的协议和加密套件

nginx
# 仅支持 TLS 1.2 和 TLS 1.3 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_session_timeout 10m;

4. OCSP Stapling

OCSP Stapling 提高 SSL 握手性能:

nginx
ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /path/to/chain.pem;

优点

  • 减少 SSL 握手时间
  • 减轻 CA 服务器负载
  • 提高用户隐私保护

5. 证书自动续期

使用 Let's Encrypt 等自动续期服务:

bash
# 使用 certbot 自动续期 certbot renew --quiet --post-hook "systemctl reload nginx"

定时任务

cron
# 每天凌晨 2 点检查证书续期 0 2 * * * certbot renew --quiet --post-hook "systemctl reload nginx"

HTTPS 性能优化

1. 启用 HTTP/2

HTTP/2 在 HTTPS 基础上提供性能提升:

nginx
listen 443 ssl http2;

优势

  • 多路复用:减少连接数
  • 头部压缩:减少传输数据量
  • 服务器推送:主动推送资源

2. 会话缓存和复用

减少 SSL 握手次数:

nginx
ssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off;

3. 优化证书链

使用完整的证书链:

  • 主证书:域名证书
  • 中间证书:CA 中间证书
  • 根证书:CA 根证书(通常不需要)

验证证书链

bash
openssl s_client -connect example.com:443 -showcerts

常见问题及解决方案

问题 1:混合内容警告

原因:HTTPS 页面包含 HTTP 资源

解决方案

  • 将所有资源改为 HTTPS
  • 使用相对路径
  • 使用 CSP(Content Security Policy)
http
Content-Security-Policy: upgrade-insecure-requests

问题 2:证书链不完整

原因:缺少中间证书

解决方案

  • 上传完整的证书链
  • 使用正确的证书顺序

证书链顺序

shell
域名证书 → 中间证书 → 根证书

问题 3:SSL 握手慢

原因

  • 未启用会话缓存
  • 未启用 OCSP Stapling
  • 使用了弱加密套件

解决方案

  • 启用会话缓存和复用
  • 启用 OCSP Stapling
  • 使用强加密套件

问题 4:证书过期

原因:忘记续期证书

解决方案

  • 使用自动续期工具
  • 设置过期提醒
  • 使用 CDN 的免费证书(自动续期)

HTTPS 监控指标

1. 证书状态

  • 证书有效期:距离过期时间
  • 证书链完整性:是否完整
  • 证书匹配度:是否与域名匹配

2. SSL 握手性能

  • 握手时间:平均 SSL 握手耗时
  • 握手成功率:SSL 握手成功比例
  • 会话复用率:会话复用的比例

3. 加密套件使用

  • 加密套件分布:各加密套件的使用比例
  • 协议版本分布:TLS 1.2 vs TLS 1.3
  • 弱加密套件:是否使用了弱加密套件

面试要点

回答这个问题时应该强调:

  1. 了解不同的 HTTPS 配置方式及其优缺点
  2. 能够根据业务需求选择合适的 HTTPS 模式
  3. 掌握 HTTPS 配置的最佳实践
  4. 了解 HTTPS 性能优化方法
  5. 有实际配置和故障排查经验
标签:CDN