🐥

Cloudflare Gateway TLS インスペクションと不正なサーバー証明書

2024/05/27に公開

はじめに

Cloudflare Gateway で TLS インスペクションをする時の話です。
HTTP ポリシーの Allow アクションに Untrusted certificate action というオプションがあります。
これは TLS インスペクションしようとした接続先のサーバー証明書が不正だった場合の動作を定義します。

設定オプション

Error Block Pass through のいずれかで動作させることができます。

  • Error: Gateway のエラーページ 526 を表示(デフォルトと同じ)
  • Block: Gateway の Block ページを表示
  • Pass through: エラーや警告なくコンテンツを表示

設定手順

  • カスタムルート CA の導入(Pass through を使う場合のみ)
    • カスタムルート CA の作成と Gateway へのアップロード
    • WARP デバイスにカスタムルート証明書を展開
    • TLS インスペクトに利用する CA をカスタムルート CA に切り替え
  • Gateway HTTP ポリシーの定義
    • Allow のオプションで Untrusted certificate action を切り替え

カスタムルート CA の作成と Gateway へのアップロード

Devdocs では openssl を使っていますが、cfssl を使うとより楽に Cloudflare API 指定のボディ形式に格納できそうです。👉API Endpoint
作成した CA はアップロードするまでにしておきます。

# CSR 準備
$ cat csr.json
{
    "CN": "Gateway Signer for Untrusted Certificates",
    "key": {
        "algo": "ecdsa",
        "size": 256
    },
    "names": [
        {
            "C":  "JP",
            "O":  "MyMyMy"
        }
    ]

# CA 作成とアップロード
$ cfssl genkey -initca csr.json | \
tee >(cfssljson -bare ca) | \
jq '{name: "alt_ca_for_badssl", 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 '.'

## 応答の ID をメモ
{
  "success":true,
  "errors":[],
  "messages":[],
  "result":{
    "id":"910c209e-3568-4a03-8a4d-17b901778b2d",
    "name":"alt_ca_for_badssl",
    "issuer"
    :

## 作成された ca.pem は WARP デバイスに展開
$ ls
ca-key.pem	ca.csr		ca.pem		csr.json

WARP デバイスにカスタムルート証明書を展開

WARP デバイスにカスタムルート証明書(ca.pem)を展開します。
(ご利用の MDM や Active Directory GPO 、手動など)

TLS インスペクトに利用する CA をカスタムルート CA に切り替え

アップロードしたカスタムルート CA の ID を custom_certificate で有効化します("enabled": true, PATCH)。👉API Endpoint

$ curl "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 '{
 "settings": {
    "custom_certificate": {
      "enabled": true,
      "id": "910c209e-3568-4a03-8a4d-17b901778b2d"
      }
    }
  }' -X PATCH

Gateway HTTP ポリシーの設定

ポリシーを設定します。
badssl.com に不正な証明書を持ったサーバーが用意されているので対象にします。
Action を Allow にし、Untrusted certificate action を切り替えます。

テスト

Error

デフォルトと同じ状態で、Gateway のエラー(526)が表示されます。

Block

Pass through

アップロードしたカスタムルート CA で署名されています。信頼できる証明書ストアに登録されているため警告はでません。

試しに証明書ストアからカスタムルート証明書を消すとブラウザーが警告が出ました。

以上

Discussion