🧽

Cloudflare Gateway - Custom Root CA のアップロードと切り替え

2025/02/02に公開

Cloudflare Gateway の TLS ディクリプションにユーザー持ち込みのルート CAを利用します(Custom Root CA)。2025 年 2 月時点では Enterprise Plan のみの機能です。

Custom Root CA を作成し、証明書と秘密鍵をアップロード

作成

CLI で作成します。
Dev docs には OpenSSL を用いた方法が書いてありますが、ここでは cfssl を使い、もっと簡単に作成します。

サンプルになりますが、下記をよしなに調整してください。

  • 証明書作成 cfssl gencert のパラメータ(ヒアドキュメントで指定の部分)
    ca:true, 約30年, テストでいくつか作成したため識別用に日時で目印。
  • Cloudflare API のアカウント ID や認証情報
macOS
NUM=`date +%y%m%d%H%M` && cfssl gencert -initca - << HERE | cfssljson -bare $NUM
{
    "CN": "01 TEST CA $NUM",
    "key": {
        "algo": "ecdsa",
        "size": 256
    },
    "names": [
        {
            "C": "JP",
            "O": "iMyMeMine"
        }
    ],
    "ca": {
        "expiry": "262800h"
    }
}
HERE

うまくいけばファイルが作成されます。秘密鍵、CSR、証明書。

2502021751-key.pem
2502021751.csr
2502021751.pem

アップロード

ダッシュボードで実施します。

設定 > リソース

管理 > 証明書をアップロード


秘密鍵と証明書を投入します。

アップロードができました。

CLI のワンライナーで

上記の手順を API を使って CLI 一行で実行する場合は下記で。
楽チンです。

API の場合

tee >(cfssljson -bare $NUM) はファイルをローカルに保存する場合のオプション

コマンド
NUM=`date +%y%m%d%H%M` && \
cfssl gencert -initca - << HERE | tee >(cfssljson -bare $NUM) |jq '{name: "ca_'$NUM'", certificates: .cert, private_key: .key, ca: true}' | curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/mtls_certificates" -H "X-Auth-Email: $EMAIL" -H "X-Auth-Key: $API_KEY" -H "Content-Type: application/json" --data @- -s | jq '.' 
{
    "CN": "01 TEST CA $NUM",
    "key": {
        "algo": "ecdsa",
        "size": 256
    },
    "names": [
        {
            "C": "JP",
            "O": "iMyMeMine"
        }
    ],
    "ca": {
        "expiry": "262800h"
    }
}
HERE

結果の出力
.result.id は後で使うので、メモするか変数に入れておきます。

レスポンス
2025/02/02 13:00:37 [INFO] generating a new CA key and certificate from CSR
2025/02/02 13:00:37 [INFO] generate received request
2025/02/02 13:00:37 [INFO] received CSR
2025/02/02 13:00:37 [INFO] generating key: ecdsa-256
2025/02/02 13:00:37 [INFO] encoded CSR
2025/02/02 13:00:37 [INFO] signed certificate with serial number 438420828139645132510656596096096740199818726975
{
  "success": true,
  "errors": [],
  "messages": [],
  "result": {
    "id": "...",
    "name": "ca_2502021300",
    "issuer": "CN=01 TEST CA 2502021300,O=iMyMeMine,C=JP",
    "signature": "ECDSAWithSHA256",
    "serial_number": "438420828139645132510656596096096740199818726975",
    "certificates": "-----BEGIN CERTIFICATE-----\n...\n-----END CERTIFICATE-----\n",
    "ca": true,
    "uploaded_on": "2025-02-02T04:00:37.577834Z",
    "updated_at": "2025-02-02T04:00:37.577834Z",
    "expires_on": "2055-01-26T03:56:00Z",
    "type": "custom"
  }
}

作成されています。

証明書のアクティベート

ダッシュボードで実施します。

INACTIVE 状態の証明書から Activate を選びます。

PENDING から AVAILABLE に遷移します。

API の場合

API docs

コマンド
CID=作成された証明書のID && \
curl -X POST "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/certificates/$CID/activate" -H "X-Auth-Email: $EMAIL" -H "X-Auth-Key: $API_KEY" -s | jq '.'
レスポンス
{
  "result": {
    "in_use": false,
    "id": "...",
    :
    "binding_status": "pending_deployment",
    :
}

TLS クライアント側のルート CA 追加

2025 年 2 月時点では Windows, macOS, Linux(Debian 系) については Install Certificate with WARP を利用していれば自動でインストールされます。いくつか注意点があるのでドキュメントを参照ください。
iOS, Android, ChromeOS や MDM、各種アプリケーションについては、個別に手順に従ってインストールします。

証明書の利用(切り替え)

ダッシュボードで実施します。

AVAILABLE になったら Mark as in-use します。

警告が出ます

日本語選択時

Confirm and turn on certificate します。
IN-USE になり、切り替わります。

API の場合

API docs

コマンド
CID=作成された証明書のID && \
curl -X PATCH "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/configuration" -H "X-Auth-Email: $EMAIL" -H "X-Auth-Key: $API_KEY" -H "Content-Type: application/json" --data @- << HERE -s | jq '.'
{
  "settings": {
    "certificate": {
      "enabled": true,
      "id": "$CID"
    }
  }
}
HERE
レスポンス
{
  "result": {
    "settings": {
      :
      "certificate": {
        "id": "...",
        :
        "binding_status": "active",
        :
      },
 :
}

確認

TLS ディクリプションされているブラウザーでルート証明書の切り替わりを確認します。

Discussion