Want to install a Cloudflare 证书的 Enterprise 客户可以选择将他们自己的根证书上传到 Cloudflare。此功能有时被称为“自带公钥基础设施(BYOPKI)”。Gateway 将使用您上传的证书来加密终端用户与 Gateway 之间的所有会话,从而启用以前需要 Cloudflare 证书的所有 HTTPS 检查功能。您可以向您的账户上传多个证书,但在任何给定时间只能有一个处于活动状态。您还需要上传私钥以拦截带有 JIT 证书的域名,并启用拦截页面。
您可以上传根证书或完整的证书链(根证书加中间证书)。上传证书链允许终端用户设备仅安装根证书,这可以为较大型企业简化证书管理。
您最多可以上传五个自定义根证书。如果您的组织需要五个以上的证书,请联系您的账户团队。
-
打开终端。
-
(可选)为根 CA 创建一个目录并进入该目录。
mkdir -p /root/customca cd /root/customca您可以在任何目录中生成证书文件。此步骤有助于保持文件整洁。如果您跳过此步骤,文件将在您当前的工作目录中创建。
-
为根 CA 生成私钥。
openssl genrsa -out <CUSTOM-ROOT-PRIVATE-KEY>.pem 20482048值指定了 RSA 密钥的大小(以位为单位)。您可以使用4096以获得更强的安全性,但代价是 TLS 握手速度会稍慢。 -
生成自签名的根证书。
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 证书要求的basicConstraints和keyUsage扩展。如果没有这些扩展,某些 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 -
验证所需的 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 中的命令重新生成证书。
-
要查看私钥,请运行以下命令:
openssl rsa -in <CUSTOM-ROOT-PRIVATE-KEY>.pem -text要查看证书,请运行以下命令:
openssl x509 -in <CUSTOM-ROOT-CERT>.pem -text
准备上传证书和私钥时,请务必删除任何多余的字符,例如证书公用名中不匹配的子域。
您可以上传单个根证书或完整的证书链。通过仪表板、API 或 Terraform 上传证书链时,请将根证书和任何中间证书连接为 PEM 格式,并将根证书排在首位。
-
在 Cloudflare 仪表板 ↗中,前往 Zero Trust > Traffic policies(流量策略) > Traffic settings(流量设置) > Certificates(证书)。
-
选择 Upload certificate(上传证书)。
-
输入您生成的私钥和 SSL 证书,或选择 **Paste certificate from file(从文件粘贴证书)**从文件上传它们。如果上传证书链,请以 PEM 格式粘贴所有证书(根证书和中间证书),并将根证书排在首位。
-
选择 Upload custom certificate(上传自定义证书)。
您现在可以使用生成的自定义根证书进行检查。
使用 上传 mTLS 证书端点 将证书和私钥上传到 Cloudflare。该证书必须为 root CA or certificate chain,格式化为单字符串,并用
\n替换换行符。
At least one of the following token permissions is required:Required API token permissions
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 格式的证书。为了格式化该字段,请先排列根证书,然后连接所有中间证书。-
使用 激活 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" } } -
使用 获取 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" } } -
(可选)使用 Cloudflare One Client 或手动验证证书是否已安装在用户的设备上。
-
使用 修改 Zero Trust 账户配置端点 来启用用于检查的证书。例如:
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 的自定义根证书,请参阅激活根证书。
如果在部署自定义证书后 Gateway 返回 HTTP 状态码:526,请参阅 Error 526 文档。
Python 3.13 及更高版本默认启用了 ssl.VERIFY_X509_STRICT,这要求 CA 证书符合 RFC 5280 ↗ 规范。如果您的 BYOPKI 证书在生成时没有包含 keyUsage 和 basicConstraints 扩展,则在 Cloudflare One Client 处于活动状态时,Python HTTPS 请求将失败。要解决此问题,请生成一个新的自定义根 CA 并将其上传到 Cloudflare。