====== 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 的网页操作 + 几步服务器命令即可完成。
{{tag>Cloudflare SSL TLS nginx 安全 证书}}