====== 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 安全 证书}}