跳转到内容
搜索文档

部署自定义证书

最后更新 查看 MarkdownAgent 设置

Want to install a Cloudflare 证书的 Enterprise 客户可以选择将他们自己的根证书上传到 Cloudflare。此功能有时被称为“自带公钥基础设施(BYOPKI)”。Gateway 将使用您上传的证书来加密终端用户与 Gateway 之间的所有会话,从而启用以前需要 Cloudflare 证书的所有 HTTPS 检查功能。您可以向您的账户上传多个证书,但在任何给定时间只能有一个处于活动状态。您还需要上传私钥以拦截带有 JIT 证书的域名,并启用拦截页面

您可以上传根证书或完整的证书链(根证书加中间证书)。上传证书链允许终端用户设备仅安装根证书,这可以为较大型企业简化证书管理。

您最多可以上传五个自定义根证书。如果您的组织需要五个以上的证书,请联系您的账户团队。

生成自定义根 CA

  1. 打开终端。

  2. (可选)为根 CA 创建一个目录并进入该目录。

    mkdir -p /root/customca
    cd /root/customca

    您可以在任何目录中生成证书文件。此步骤有助于保持文件整洁。如果您跳过此步骤,文件将在您当前的工作目录中创建。

  3. 为根 CA 生成私钥。

    openssl genrsa -out <CUSTOM-ROOT-PRIVATE-KEY>.pem 2048

    2048 值指定了 RSA 密钥的大小(以位为单位)。您可以使用 4096 以获得更强的安全性,但代价是 TLS 握手速度会稍慢。

  4. 生成自签名的根证书。

    openssl req -x509 -sha256 -new -nodes \
      -key <CUSTOM-ROOT-PRIVATE-KEY>.pem \
      -days 365 \
      -out <CUSTOM-ROOT-CERT>.pem \
      -addext "basicConstraints=critical,CA:TRUE" \
      -addext "keyUsage=critical,keyCertSign,cRLSign"

    -addext 标志添加了 RFC 5280 对 CA 证书要求的 basicConstraintskeyUsage 扩展。如果没有这些扩展,某些 TLS 客户端可能会拒绝由您的自定义 CA 签名的证书。特别是 Python 3.13 及更高版本默认强制执行严格的 RFC 5280 合规性(ssl.VERIFY_X509_STRICT),当上传的 CA 不包含这些扩展时,会导致使用 Cloudflare One Client 的设备上的 HTTPS 请求失败。

    -days 365 值控制证书的有效期。较短的有效期可以在密钥泄露时降低风险,但需要更频繁地轮转。轮转已部署的 BYOPKI 证书是一项会中断服务的操作,因此请选择一个在安全性与运营开销之间取得平衡的到期时间。

    错误:Unknown cipher or option -addext

    如果您的系统运行的是早于 1.1.1 版本的 OpenSSL,则 -addext 标志不可用。请改用配置文件:

    openssl req -x509 -sha256 -new -nodes \
      -key <CUSTOM-ROOT-PRIVATE-KEY>.pem \
      -days 365 \
      -out <CUSTOM-ROOT-CERT>.pem \
      -config <(printf '[req]\ndistinguished_name=dn\n[dn]\n[v3_ca]\nbasicConstraints=critical,CA:TRUE\nkeyUsage=critical,keyCertSign,cRLSign') \
      -extensions v3_ca
  5. 验证所需的 RFC 5280 扩展是否存在:

    openssl x509 -in <CUSTOM-ROOT-CERT>.pem -noout -ext keyUsage,basicConstraints

    输出应包括:

    X509v3 Basic Constraints: critical
    		CA:TRUE
    X509v3 Key Usage: critical
    		Certificate Sign, CRL Sign

    如果缺少这些字段,请使用步骤 4 中的命令重新生成证书。

  6. 要查看私钥,请运行以下命令:

    openssl rsa -in <CUSTOM-ROOT-PRIVATE-KEY>.pem -text

    要查看证书,请运行以下命令:

    openssl x509 -in <CUSTOM-ROOT-CERT>.pem -text

准备上传证书和私钥时,请务必删除任何多余的字符,例如证书公用名中不匹配的子域。

部署自定义根证书

您可以上传单个根证书或完整的证书链。通过仪表板、API 或 Terraform 上传证书链时,请将根证书和任何中间证书连接为 PEM 格式,并将根证书排在首位。

  1. Cloudflare 仪表板中,前往 Zero Trust > Traffic policies(流量策略) > Traffic settings(流量设置) > Certificates(证书)

  2. 选择 Upload certificate(上传证书)

  3. 输入您生成的私钥和 SSL 证书,或选择 **Paste certificate from file(从文件粘贴证书)**从文件上传它们。如果上传证书链,请以 PEM 格式粘贴所有证书(根证书和中间证书),并将根证书排在首位。

  4. 选择 Upload custom certificate(上传自定义证书)

    您现在可以使用生成的自定义根证书进行检查。

  1. 使用 上传 mTLS 证书端点 将证书和私钥上传到 Cloudflare。该证书必须为 root CA or certificate chain,格式化为单字符串,并用 \n 替换换行符。

    Required API token permissions

    At least one of the following token permissions is required:
    • Account: SSL and Certificates Write
    Upload mTLS certificatebash
    curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/mtls_certificates" \
    	--request POST \
    	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
    	--json '{
    		"name": "example_ca_cert",
    		"certificates": "-----BEGIN CERTIFICATE-----\nXXXXX\n-----END CERTIFICATE-----",
    		"private_key": "-----BEGIN PRIVATE KEY-----\nXXXXX\n-----END PRIVATE KEY-----",
    		"ca": true
    	}'

    响应将返回该证书的 UUID。例如:

    {
      "success": true,
      "errors": [],
      "messages": [],
      "result": {
        "id": "2458ce5a-0c35-4c7f-82c7-8e9487d3ff60",
        "name": "example_ca_cert",
        "issuer": "O=Example Inc.,L=California,ST=San Francisco,C=US",
        "signature": "SHA256WithRSA",
        ...
      }
    }

    当上传证书链时,certificates 字段应包含所有 PEM 格式的证书。为了格式化该字段,请先排列根证书,然后连接所有中间证书。

  2. 使用 激活 Zero Trust 证书端点 将证书设置为可用于检查。这将在 Cloudflare 全球网络中部署该证书。

    Activate a Zero Trust certificatebash
    curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/certificates/$CERTIFICATE_ID/activate" \
    	--request POST \
    	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"

    响应将返回证书和 pending_deployment 绑定状态。例如:

    {
    	"errors": [],
    	"messages": [],
    	"success": true,
    	"result": {
    		"in_use": false,
    		"id": "f174e90a-fafe-4643-bbbc-4a0ed4fc8415",
    		"certificate": "-----BEGIN CERTIFICATE-----\\n ... \\n-----END CERTIFICATE-----\\n",
    		"issuer_org": "Example Inc.",
    		"issuer_raw": "O=Example Inc.,L=California,ST=San Francisco,C=US",
    		"fingerprint": "E9:19:49:AA:DD:D8:1E:C1:20:2A:D8:22:BF:A5:F8:FC:1A:F7:10:9F:C7:5B:69:AB:0:31:91:8B:61:B4:BF:1C",
    		"binding_status": "pending_deployment",
    		"type": "custom",
    		"updated_at": "2014-01-01T05:20:00.12345Z",
    		"uploaded_on": "2014-01-01T05:20:00.12345Z",
    		"created_at": "2014-01-01T05:20:00.12345Z",
    		"expires_on": "2014-01-01T05:20:00.12345Z"
    	}
    }
  3. 使用 获取 Zero Trust 证书详情端点 来验证证书的绑定状态是否已设置为 available

    Get Zero Trust certificate detailsbash
    curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/certificates/$CERTIFICATE_ID" \
    	--request GET \
    	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"
    {
    	"errors": [],
    	"messages": [],
    	"success": true,
    	"result": {
    		"in_use": false,
    		"id": "f174e90a-fafe-4643-bbbc-4a0ed4fc8415",
    		"certificate": "-----BEGIN CERTIFICATE-----\\n ... \\n-----END CERTIFICATE-----\\n",
    		"issuer_org": "Example Inc.",
    		"issuer_raw": "O=Example Inc.,L=California,ST=San Francisco,C=US",
    		"fingerprint": "E9:19:49:AA:DD:D8:1E:C1:20:2A:D8:22:BF:A5:F8:FC:1A:F7:10:9F:C7:5B:69:AB:0:31:91:8B:61:B4:BF:1C",
    		"binding_status": "available",
    		"type": "custom",
    		"updated_at": "2014-01-01T05:20:00.12345Z",
    		"uploaded_on": "2014-01-01T05:20:00.12345Z",
    		"created_at": "2014-01-01T05:20:00.12345Z",
    		"expires_on": "2014-01-01T05:20:00.12345Z"
    	}
    }
  4. (可选)使用 Cloudflare One Client手动验证证书是否已安装在用户的设备上。

  5. 使用 修改 Zero Trust 账户配置端点 来启用用于检查的证书。例如:

Patch Zero Trust account configurationbash
curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/configuration" \
	--request PATCH \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"settings": {
				"certificate": {
						"id": "{certificate_id}",
						"in_use": true
				}
		}
	}'

一旦 in-use 设置为 true,Gateway 将使用自定义根证书和私钥对您的流量进行签名。如果您关闭或停用自定义证书,Gateway 将恢复为为您的 Zero Trust 账户生成的下一个可用 Cloudflare 证书。

使用自定义根证书

要使用您生成并上传到 Cloudflare 的自定义根证书,请参阅激活根证书

故障排查

Error 526: Invalid SSL certificate(无效的 SSL 证书)(无效的 SSL 证书)(无效的 SSL 证书)

如果在部署自定义证书后 Gateway 返回 HTTP 状态码:526,请参阅 Error 526 文档

带有 Cloudflare One Client 的 Python 3.13+ SSL 错误

Python 3.13 及更高版本默认启用了 ssl.VERIFY_X509_STRICT,这要求 CA 证书符合 RFC 5280 规范。如果您的 BYOPKI 证书在生成时没有包含 keyUsagebasicConstraints 扩展,则在 Cloudflare One Client 处于活动状态时,Python HTTPS 请求将失败。要解决此问题,请生成一个新的自定义根 CA 并将其上传到 Cloudflare。

这篇文档对您有帮助吗?