相互TLS
相互TLS (mTLS) 認証 ↗は、クライアントとサーバー間のトラフィックが双方向で安全かつ信頼できることを保証します。これは、アイデンティティプロバイダー(IoTデバイスなど)でログインしないリクエストが、特定のリソースに到達できることを示すことを可能にします。クライアント証明書認証は、アイデンティティプロバイダー(IdP)でログインし、かつ有効なクライアント証明書を提示するチームメンバーにとってのセキュリティの第二の層でもあります。
ルート証明書機関(CA)が設定されている場合、Accessは対応するクライアント証明書を持つデバイスからのリクエストのみを許可します。リクエストがアプリケーションに到達すると、Accessはクライアントに証明書を提示するよう要求します。デバイスが証明書を提示できない場合、リクエストは進行できません。クライアントが証明書を持っている場合、Accessはキー交換を完了して確認します。

Zero Trust ↗からmTLS認証を強制するには:
-
Access > Service Auth > Mutual TLSに移動します。
-
Add mTLS Certificateを選択します。
-
ルートCAに任意の名前を付けます。
-
ca.pemファイルの内容をCertificate contentフィールドに貼り付けます。- The CA certificate can be from a publicly trusted CA or self-signed.
- In the certificate
Basic Constraints, the attributeCAmust be set toTRUE. - The certificate must use one of the signature algorithms listed below:
Allowed signature algorithms
x509.SHA1WithRSAx509.SHA256WithRSAx509.SHA384WithRSAx509.SHA512WithRSAx509.ECDSAWithSHA1x509.ECDSAWithSHA256x509.ECDSAWithSHA384x509.ECDSAWithSHA512 -
Associated hostnamesに、この証明書を使用する完全修飾ドメイン名(FQDN)を入力します。
これらのFQDNは、Accessポリシーで保護されるリソースに使用されるホスト名です。保護されるアプリケーションが使用するFQDNにルートCAを関連付ける必要があります。
-
Saveを選択します。
ゾーンがルート証明書に加えて中間証明書を使用している場合は、全体のチェーンをアップロードします。
-
次に、Access > Applicationsに移動します。
-
mTLSを強制したいアプリケーションを見つけてEditを選択します。アプリケーションはステップ5のAssociated hostnamesリストに含まれている必要があります。
-
新しい(または既存の)Accessポリシーを作成します。
IdPを通じてログインする必要のないクライアントの場合、ポリシーのActionを_Service Auth_に設定します。
-
次のセレクタを使用してmTLS認証ルールを追加します:
Selector Description Common Name 特定のコモンネームを持つクライアント証明書のみが進行を許可されます。 Valid Certificate ルートCAで認証できる任意のクライアント証明書が進行を許可されます。 -
ポリシーを保存します。
mTLSポリシーで保護されたアプリケーションをテストするには:
-
まず、クライアント証明書なしでサイトにcurlを試みます。 このcurlコマンドの例は、
https://auth.example.comに対して設定されたAccessポリシーを持つサイトexample.com用です:Terminal window curl -sv https://auth.example.comリクエストにクライアント証明書が含まれていない場合、
403 forbiddenの応答が表示され、サイトにアクセスできません。 -
次に、リクエストにクライアント証明書情報を追加します:
Terminal window curl -sv https://auth.example.com --cert example.pem --key key.pem
認証プロセスが成功裏に完了すると、応答にCF_Authorization Set-Cookieヘッダーが返されます。
Cloudflareのオープンソースツールを使用して、Cloudflare AccessのmTLS機能をテストできます。このガイドでは、ルートクライアント認証機関(CA)を生成し、Cloudflareダッシュボードに追加し、ルートCAに対して認証できるクライアント証明書を発行するプロセスを詳述します。
このプロセスには、CloudflareのPKIツールキットから2つのパッケージが必要です:
cf-sslcfssljson
これらのパッケージは、Cloudflare SSL GitHubリポジトリ ↗からインストールできます。Goの動作するインストールが必要で、バージョン1.12以上が必要です。あるいは、パッケージを直接ダウンロード ↗することもできます。 インストールの下の指示に従ってツールキットをインストールし、ツールキット内のすべてのユーティリティプログラムをインストールしてください。
-
ルートCAを保存するための新しいディレクトリを作成します。
-
そのディレクトリ内に2つの新しいファイルを作成します:
-
CSR。
ca-csr.jsonという名前のファイルを作成し、次のJSONブロブを追加してファイルを保存します。{"CN": "Access Testing CA","key": {"algo": "rsa","size": 4096},"names": [{"C": "US","L": "Austin","O": "Access Testing","OU": "TX","ST": "Texas"}]} -
config。
ca-config.jsonという名前のファイルを作成し、次のJSONブロブを追加してファイルを保存します。{"signing": {"default": {"expiry": "8760h"},"profiles": {"server": {"usages": ["signing", "key encipherment", "server auth"],"expiry": "8760h"},"client": {"usages": ["signing", "key encipherment", "client auth"],"expiry": "8760h"}}}}
-
-
次に、次のコマンドを実行して、これらのファイルを使用してルートCAを生成します。
Terminal window cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
ディレクトリ内で、その内容を確認して出力が成功したことを確認します。
Terminal window ls出力は次の内容を返すはずです:
Terminal window ca-config.json ca-csr.json ca-key.pem ca.csr ca.pem
ターミナルに戻り、アップロードされたルートCAに対して認証するクライアント証明書を生成します。
-
client-csr.jsonという名前のファイルを作成し、次のJSONブロブを追加します:{"CN": "James Royal","hosts": [""],"key": {"algo": "rsa","size": 4096},"names": [{"C": "US","L": "Austin","O": "Access","OU": "Access Admins","ST": "Texas"}]} -
次に、Cloudflare PKIツールキットを使用してクライアント証明書を生成するために、次のコマンドを使用します:
Terminal window cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client -
次の
cURLコマンドでクライアント証明書をテストできます。Terminal window curl -v --cert client.pem --key client-key.pem https://iot.widgetcorp.tech
ここでの指示は、macOSを実行しているコンピュータでの使用をカバーしています。
- 同じ作業ディレクトリで、次のコマンドを実行してクライアント証明書をmacOSのキーチェーンに追加します。
open client.pemsecurity import client-key.pem -k ~/Library/Keychains/login.keychain-db- キーチェーンリストで証明書を選択して、証明書を信頼するように設定します。証明書がMy Certificatesにリストされていることを確認します。
Cloudflare PKIツールキットを使用して、証明書失効リスト(CRL)を生成することもできます。このリストには、失効されたクライアント証明書が含まれます。
-
以前に生成したクライアント証明書からシリアル番号を取得します。そのシリアル番号、または失効させたい他の番号を、テキストファイルに16進数形式で追加します。この例では、
serials.txtという名前のファイルを使用します。 -
次のコマンドでCRLを作成します。
Terminal window cfssl gencrl serials.txt ../mtls-test/ca.pem ../mtls-test/ca-key.pem | base64 -D > ca.crl
CRLをサーバーに追加するか、Cloudflare Workerで失効を強制する必要があります。例のWorkerスクリプトは、Cloudflare GitHubリポジトリ ↗で見つけることができます。
In addition to enforcing mTLS authentication for your host, you can also forward a client certificate to your origin server as an HTTP header. This setup is often helpful for server logging.
The most common approach to forwarding a certificate is to use the Cloudflare API to update an mTLS certificate’s hostname settings.
curl --request PUT \https://api.cloudflare.com/client/v4/zones/{zone_id}/access/certificates/settings \--header "X-Auth-Email: <EMAIL>" \--header "X-Auth-Key: <API_KEY>" \--header "Content-Type: application/json" \--data '{ "settings": [ { "hostname": "<HOSTNAME>", "china_network": false, "client_certificate_forwarding": true } ]}'Once client_certificate_forwarding is set to true, the first request of an mTLS connection will now include the following headers:
Cf-Client-Cert-Der-Base64Cf-Client-Cert-Sha256
You can also modify HTTP response headers using Managed Transforms to pass along TLS client auth headers.
Additionally, Workers can provide details around the client certificate.
const tlsHeaders = { 'X-CERT-ISSUER-DN': request.cf.tlsClientAuth.certIssuerDN, 'X-CERT-SUBJECT-DN': request.cf.tlsClientAuth.certSubjectDN, 'X-CERT-ISSUER-DN-L': request.cf.tlsClientAuth.certIssuerDNLegacy, 'X-CERT-SUBJECT-DN-L': request.cf.tlsClientAuth.certSubjectDNLegacy, 'X-CERT-SERIAL': request.cf.tlsClientAuth.certSerial, 'X-CERT-FINGER': request.cf.tlsClientAuth.certFingerprintSHA1, 'X-CERT-VERIFY': request.cf.tlsClientAuth.certVerify, 'X-CERT-NOTBE': request.cf.tlsClientAuth.certNotBefore, 'X-CERT-NOTAF': request.cf.tlsClientAuth.certNotAfter};mTLSは現在、次のトラフィックには対応していません:
相互TLS証明書が期限切れになる前に通知を受け取るためのアラートを設定できます。
Access mTLS Certificate Expiration Alert
Who is it for?Access customers that use client certificates for mutual TLS authentication. This notification will be sent 30 and 14 days before the expiration of the certificate.
Other options / filtersNone.
Included withPurchase of Access and/or Cloudflare for SaaS.
What should you do if you receive one?Upload a renewed certificate.
Refer to Cloudflare Notifications for more information on how to set up an alert.