Cloudflare 証明書 をインストールしたくない Enterprise のお客様は、独自のルート証明書を Cloudflare にアップロードできます。この機能は、Bring Your Own Public Key Infrastructure(BYOPKI)と呼ばれることもあります。Gateway は、アップロードした証明書を使ってエンドユーザーと Gateway のあいだのすべてのセッションを暗号化し、これまで Cloudflare 証明書が必要だった HTTPS 検査機能をすべて使えるようにします。アカウントには複数の証明書をアップロードできますが、同時にアクティブにできるのは 1 つだけです。JIT 証明書でドメインを傍受する場合と、ブロックページ を有効にする場合は、秘密鍵もアップロードする必要があります。
ルート証明書、または証明書チェーン全体(ルート証明書と中間証明書)のいずれかをアップロードできます。証明書チェーンをアップロードすると、エンドユーザーデバイスにはルート証明書だけをインストールすればよくなり、大規模な組織では証明書管理を簡素化できます。
カスタムルート証明書は最大 5 つまでアップロードできます。5 つより多く必要な場合は、アカウントチームに問い合わせてください。
-
ターミナルを開きます。
-
(任意)ルート 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フラグは、CA 証明書向けに RFC 5280 ↗ が求める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システムの OpenSSL が 1.1.1 より古い場合、
-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 を選びます。
これで、生成したカスタムルート証明書を検査に 使えるようになります。
-
Upload mTLS certificate エンドポイント を使い、証明書と秘密鍵を Cloudflare にアップロードします。証明書は ルート CA または証明書チェーン である必要があり、改行を
\nに置き換えた 1 つの文字列としてフォーマットします。
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 形式ですべての証明書を含めます。この欄を整えるには、ルート証明書を先頭にし、続けて中間証明書を連結します。 -
Activate a Zero Trust certificate エンドポイント で、証明書を検査に使える状態にします。これにより、証明書が 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の binding ステータスを返します。例:{ "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" } } -
Get Zero Trust certificate details エンドポイント で、証明書の binding ステータスが
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 または 手動 で確認します。
-
Patch Zero Trust account configuration エンドポイント で、検査に使う証明書を有効にします。例:
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 Response Code: 526 を返す場合は、エラー 526 のドキュメント を参照してください。
Python 3.13 以降は、デフォルトで ssl.VERIFY_X509_STRICT を有効にし、CA 証明書が RFC 5280 ↗ に準拠することを求めます。BYOPKI 証明書を keyUsage と basicConstraints 拡張なしで生成している場合、Cloudflare One Client が有効なときに Python の HTTPS リクエストは失敗します。解決するには、新しいカスタムルート CA を生成 し、Cloudflare にアップロードしてください。