老赵写字的地方

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 签发的证书 高——加密且验证证书

推荐场景:

  1. Flexible:仅用于开发/测试环境,或源服务器无法配置证书的场景
  2. Full:源服务器使用自签名证书时的折中方案
  3. Full (Strict):生产环境首选,Cloudflare 官方推荐模式

使用 Origin CA 证书配置 Full (Strict)

Cloudflare 提供免费的 Origin CA 证书,专用于 Cloudflare 到源服务器之间的加密。该证书由 Cloudflare 自己签发,有效期最长 15 年,无需像 Let's Encrypt 那样每 90 天续期。

步骤一:在 Cloudflare Dashboard 生成证书

  1. 登录 Cloudflare,进入目标域名的 SSL/TLS → Origin Server
  2. 点击 Create Certificate
  3. 私钥类型选择 RSA(2048),主机名保持默认(自动包含裸域和通配符)——建议保留通配符 `*.example.com`,方便将来添加子域名
  4. 证书有效期选择 15 年
  5. 点击 Create

步骤二:保存证书和私钥

生成后 Cloudflare 会展示:

  1. Origin Certificate:以 `—–BEGIN CERTIFICATE—–` 开头
  2. Private Key:以 `—–BEGIN PRIVATE KEY—–` 开头

关键注意事项:

  1. 私钥只在此刻展示一次,关闭页面后将无法再次获取
  2. 将证书内容保存到 `example.com.crt`,私钥保存到 `example.com.key`
  3. 私钥是敏感信息,传输和存储务必加密,绝不提交到版本控制

步骤三:上传证书到源服务器

将证书文件通过安全渠道(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 的网页操作 + 几步服务器命令即可完成。

zh/cloudflare/ssl_tls/start.txt · 最后更改: 由 tom