CDN HTTPS 配置的重要性
HTTPS(Hypertext Transfer Protocol Secure)是 HTTP 的安全版本,通过 SSL/TLS 协议加密通信内容。在 CDN 上配置 HTTPS 不仅可以保护数据传输安全,还能提升 SEO 排名和用户信任度。
CDN HTTPS 配置方式
1. 自定义证书上传
将自有 SSL 证书上传到 CDN:
步骤:
- 购买或申请 SSL 证书
- 下载证书文件(.crt)和私钥文件(.key)
- 在 CDN 控制台上传证书和私钥
- 配置 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:
httpStrict-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 握手性能:
nginxssl_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 基础上提供性能提升:
nginxlisten 443 ssl http2;
优势:
- 多路复用:减少连接数
- 头部压缩:减少传输数据量
- 服务器推送:主动推送资源
2. 会话缓存和复用
减少 SSL 握手次数:
nginxssl_session_cache shared:SSL:50m; ssl_session_timeout 1d; ssl_session_tickets off;
3. 优化证书链
使用完整的证书链:
- 主证书:域名证书
- 中间证书:CA 中间证书
- 根证书:CA 根证书(通常不需要)
验证证书链:
bashopenssl s_client -connect example.com:443 -showcerts
常见问题及解决方案
问题 1:混合内容警告
原因:HTTPS 页面包含 HTTP 资源
解决方案:
- 将所有资源改为 HTTPS
- 使用相对路径
- 使用 CSP(Content Security Policy)
httpContent-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
- 弱加密套件:是否使用了弱加密套件
面试要点
回答这个问题时应该强调:
- 了解不同的 HTTPS 配置方式及其优缺点
- 能够根据业务需求选择合适的 HTTPS 模式
- 掌握 HTTPS 配置的最佳实践
- 了解 HTTPS 性能优化方法
- 有实际配置和故障排查经验