Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

カスタム証明書を導入する

最終更新 Markdown で表示Agent セットアップ

Cloudflare 証明書 をインストールしたくない Enterprise のお客様は、独自のルート証明書を Cloudflare にアップロードできます。この機能は、Bring Your Own Public Key Infrastructure(BYOPKI)と呼ばれることもあります。Gateway は、アップロードした証明書を使ってエンドユーザーと Gateway のあいだのすべてのセッションを暗号化し、これまで Cloudflare 証明書が必要だった HTTPS 検査機能をすべて使えるようにします。アカウントには複数の証明書をアップロードできますが、同時にアクティブにできるのは 1 つだけです。JIT 証明書でドメインを傍受する場合と、ブロックページ を有効にする場合は、秘密鍵もアップロードする必要があります。

ルート証明書、または証明書チェーン全体(ルート証明書と中間証明書)のいずれかをアップロードできます。証明書チェーンをアップロードすると、エンドユーザーデバイスにはルート証明書だけをインストールすればよくなり、大規模な組織では証明書管理を簡素化できます。

カスタムルート証明書は最大 5 つまでアップロードできます。5 つより多く必要な場合は、アカウントチームに問い合わせてください。

カスタムルート 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 フラグは、CA 証明書向けに RFC 5280 が求める 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

    システムの 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
  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. Upload mTLS certificate エンドポイント を使い、証明書と秘密鍵を Cloudflare にアップロードします。証明書は ルート CA または証明書チェーン である必要があり、改行を \n に置き換えた 1 つの文字列としてフォーマットします。

    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. 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"
    	}
    }
  3. 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"
    	}
    }
  4. (任意)ユーザーのデバイスに証明書がインストールされていることを、Cloudflare One Client または 手動 で確認します。

  5. Patch Zero Trust account configuration エンドポイント で、検査に使う証明書を有効にします。例:

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-usetrue にすると、Gateway はカスタムルート証明書と秘密鍵でトラフィックに署名します。カスタム証明書をオフにするか無効にすると、Gateway は Zero Trust アカウント向けに生成された、次に利用可能な Cloudflare 証明書へ戻します。

カスタムルート証明書を使う

生成して Cloudflare にアップロードしたカスタムルート証明書を使う手順は、ルート証明書を有効にする を参照してください。

トラブルシューティング

エラー 526: Invalid SSL certificate

カスタム証明書の導入後に Gateway が HTTP Response Code: 526 を返す場合は、エラー 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 にアップロードしてください。

役に立ちましたか?