目录
Cloudflare SSL/TLS 配置指南
本文介绍如何在 Cloudflare 上为域名配置 SSL/TLS 加密,涵盖三种加密模式的差异、Origin CA 证书的生成与部署,以及 nginx 反向代理的完整链。
为什么需要配置 SSL/TLS
当域名托管在 Cloudflare 并开启代理(橙色云)时,流量路径为:
用户 ↔ Cloudflare(HTTPS)↔ 源服务器(HTTP 或 HTTPS)
用户到 Cloudflare 段默认使用 Cloudflare 的边缘证书加密。但 Cloudflare 到源服务器这段是否加密,取决于 SSL/TLS 加密模式 的选择。
三种加密模式对比
| 模式 | Cloudflare → 源服务器 | 源服务器是否需要证书 | 安全性 |
|---|---|---|---|
| Flexible | 明文 HTTP | 不需要 | 低——源服务器到 Cloudflare 段明文传输 |
| Full | HTTPS | 需要证书(可自签名) | 中——加密传输,但不验证证书合法性 |
| Full (Strict) | HTTPS | 需要 Cloudflare Origin CA 签发的证书 | 高——加密且验证证书 |
推荐场景:
- Flexible:仅用于开发/测试环境,或源服务器无法配置证书的场景
- Full:源服务器使用自签名证书时的折中方案
- Full (Strict):生产环境首选,Cloudflare 官方推荐模式
使用 Origin CA 证书配置 Full (Strict)
Cloudflare 提供免费的 Origin CA 证书,专用于 Cloudflare 到源服务器之间的加密。该证书由 Cloudflare 自己签发,有效期最长 15 年,无需像 Let's Encrypt 那样每 90 天续期。
步骤一:在 Cloudflare Dashboard 生成证书
- 登录 Cloudflare,进入目标域名的 SSL/TLS → Origin Server
- 点击 Create Certificate
- 私钥类型选择 RSA(2048),主机名保持默认(自动包含裸域和通配符)——建议保留通配符 `*.example.com`,方便将来添加子域名
- 证书有效期选择 15 年
- 点击 Create
步骤二:保存证书和私钥
生成后 Cloudflare 会展示:
- Origin Certificate:以 `—–BEGIN CERTIFICATE—–` 开头
- Private Key:以 `—–BEGIN PRIVATE KEY—–` 开头
关键注意事项:
- 私钥只在此刻展示一次,关闭页面后将无法再次获取
- 将证书内容保存到 `example.com.crt`,私钥保存到 `example.com.key`
- 私钥是敏感信息,传输和存储务必加密,绝不提交到版本控制
步骤三:上传证书到源服务器
将证书文件通过安全渠道(SCP/SFTP 等)上传到源服务器,存放在 `/etc/ssl/` 目录:
# 示例(请替换为实际路径) scp example.com.crt user@server:/etc/ssl/ scp example.com.key user@server:/etc/ssl/
设置私钥权限,仅允许 Web 服务器读取:
chown root:www-data /etc/ssl/example.com.key chmod 640 /etc/ssl/example.com.key # 文件应为 -rw-r----- 权限
步骤四:配置 Nginx
在 nginx 站点配置中同时处理 HTTP 和 HTTPS:
# HTTP → HTTPS 自动跳转 server { listen 80; listen [::]:80; server_name example.com www.example.com; return 301 https://$host$request_uri; } # HTTPS server { listen 443 ssl; listen [::]:443 ssl; server_name example.com www.example.com; ssl_certificate /etc/ssl/example.com.crt; ssl_certificate_key /etc/ssl/example.com.key; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; # 根据实际需求修改以下反代配置 location / { proxy_pass http://127.0.0.1:3000; # 替换为实际后端地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # WebSocket 支持(可选) proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
步骤五:重载 Nginx
nginx -t # 测试配置语法 nginx -s reload # 重载配置
步骤六:开放防火墙端口
如果服务器启用了防火墙(如 ufw),需要放行 80 和 443 端口:
ufw allow 80/tcp comment 'HTTP' ufw allow 443/tcp comment 'HTTPS'
步骤七:回到 Cloudflare 选择加密模式
在 Cloudflare Dashboard → SSL/TLS,将加密模式改为 Full (Strict)。Cloudflare 会验证源服务器返回的证书是否为有效的 Origin CA 证书。
验证配置是否正确
方法一:curl 测试
curl -sI https://example.com | grep -i 'HTTP/' # 应返回 HTTP/2 301 或 200
方法二:查看 nginx 访问日志
tail -f /var/log/nginx/access.log # 正常请求应显示 HTTP 2xx 状态码
方法三:浏览器检查
在浏览器地址栏点击锁形图标,查看证书信息。如果配置正确,应显示由 Cloudflare 签发的证书,连接状态为「安全」。
常见错误排查
| 错误码 | 含义 | 解决方法 |
|---|---|---|
| 521 | Web 服务器拒绝连接 | 检查 nginx 是否正常运行,端口是否监听 |
| 522 | 连接超时 | 检查防火墙是否放行端口,源服务器是否可达 |
| 523 | 源服务器不可达 | DNS 解析存在问题,确认源服务器 IP 正确 |
| 525 | SSL 握手失败 | 检查 nginx SSL 配置,证书路径是否正确 |
| 526 | 无效的 SSL 证书 | 开启了 Full (Strict) 但证书不是 Origin CA 签发。改用 Full 或更换为有效的 Origin CA 证书 |
总结
一套完整的 Cloudflare SSL/TLS 配置链为:
Cloudflare(Full Strict) ↔ 源服务器(Origin CA 证书 + nginx SSL 反代 + 防火墙放行)
配置完成后,用户到 Cloudflare 和 Cloudflare 到源服务器两段均为加密传输,且来源服务器的身份由 Cloudflare 验证。整个过程不需要云平台 API、不需要证书自动化工具,仅通过 Cloudflare Dashboard 的网页操作 + 几步服务器命令即可完成。