Cloudflare Gateway - Custom Root CA のアップロードと切り替え
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 や認証情報
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 の場合
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 の場合
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