コンテンツにスキップ

相互TLS

相互TLS (mTLS) 認証は、クライアントとサーバー間のトラフィックが双方向で安全かつ信頼できることを保証します。これは、アイデンティティプロバイダー(IoTデバイスなど)でログインしないリクエストが、特定のリソースに到達できることを示すことを可能にします。クライアント証明書認証は、アイデンティティプロバイダー(IdP)でログインし、かつ有効なクライアント証明書を提示するチームメンバーにとってのセキュリティの第二の層でもあります。

ルート証明書機関(CA)が設定されている場合、Accessは対応するクライアント証明書を持つデバイスからのリクエストのみを許可します。リクエストがアプリケーションに到達すると、Accessはクライアントに証明書を提示するよう要求します。デバイスが証明書を提示できない場合、リクエストは進行できません。クライアントが証明書を持っている場合、Accessはキー交換を完了して確認します。

mTLS ハンドシェイク図

Access構成にmTLS認証を追加する

Zero TrustからmTLS認証を強制するには:

  1. Access > Service Auth > Mutual TLSに移動します。

  2. Add mTLS Certificateを選択します。

  3. ルートCAに任意の名前を付けます。

  4. ca.pemファイルの内容をCertificate contentフィールドに貼り付けます。

    • The CA certificate can be from a publicly trusted CA or self-signed.
    • In the certificate Basic Constraints, the attribute CA must be set to TRUE.
    • The certificate must use one of the signature algorithms listed below:

    Allowed signature algorithms

    x509.SHA1WithRSA

    x509.SHA256WithRSA

    x509.SHA384WithRSA

    x509.SHA512WithRSA

    x509.ECDSAWithSHA1

    x509.ECDSAWithSHA256

    x509.ECDSAWithSHA384

    x509.ECDSAWithSHA512

  5. Associated hostnamesに、この証明書を使用する完全修飾ドメイン名(FQDN)を入力します。

    これらのFQDNは、Accessポリシーで保護されるリソースに使用されるホスト名です。保護されるアプリケーションが使用するFQDNにルートCAを関連付ける必要があります。

  6. Saveを選択します。

    ゾーンがルート証明書に加えて中間証明書を使用している場合は、全体のチェーンをアップロードします。

  7. 次に、Access > Applicationsに移動します。

  8. mTLSを強制したいアプリケーションを見つけてEditを選択します。アプリケーションはステップ5のAssociated hostnamesリストに含まれている必要があります。

  9. 新しい(または既存の)Accessポリシーを作成します。

    IdPを通じてログインする必要のないクライアントの場合、ポリシーのActionを_Service Auth_に設定します。

  10. 次のセレクタを使用してmTLS認証ルールを追加します:

    SelectorDescription
    Common Name特定のコモンネームを持つクライアント証明書のみが進行を許可されます。
    Valid CertificateルートCAで認証できる任意のクライアント証明書が進行を許可されます。
  11. ポリシーを保存します。

cURLを使用してmTLSをテストする

mTLSポリシーで保護されたアプリケーションをテストするには:

  1. まず、クライアント証明書なしでサイトにcurlを試みます。 このcurlコマンドの例は、https://auth.example.comに対して設定されたAccessポリシーを持つサイトexample.com用です:

    Terminal window
    curl -sv https://auth.example.com

    リクエストにクライアント証明書が含まれていない場合、403 forbiddenの応答が表示され、サイトにアクセスできません。

  2. 次に、リクエストにクライアント証明書情報を追加します:

    Terminal window
    curl -sv https://auth.example.com --cert example.pem --key key.pem

認証プロセスが成功裏に完了すると、応答にCF_Authorization Set-Cookieヘッダーが返されます。

Cloudflare PKIを使用してmTLSをテストする

Cloudflareのオープンソースツールを使用して、Cloudflare AccessのmTLS機能をテストできます。このガイドでは、ルートクライアント認証機関(CA)を生成し、Cloudflareダッシュボードに追加し、ルートCAに対して認証できるクライアント証明書を発行するプロセスを詳述します。

1. 依存関係をインストールする

このプロセスには、CloudflareのPKIツールキットから2つのパッケージが必要です:

  • cf-ssl
  • cfssljson

これらのパッケージは、Cloudflare SSL GitHubリポジトリからインストールできます。Goの動作するインストールが必要で、バージョン1.12以上が必要です。あるいは、パッケージを直接ダウンロードすることもできます。 インストールの下の指示に従ってツールキットをインストールし、ツールキット内のすべてのユーティリティプログラムをインストールしてください。

2. ルートCAを生成する

  1. ルートCAを保存するための新しいディレクトリを作成します。

  2. そのディレクトリ内に2つの新しいファイルを作成します:

    • CSRca-csr.jsonという名前のファイルを作成し、次のJSONブロブを追加してファイルを保存します。

      {
      "CN": "Access Testing CA",
      "key": {
      "algo": "rsa",
      "size": 4096
      },
      "names": [
      {
      "C": "US",
      "L": "Austin",
      "O": "Access Testing",
      "OU": "TX",
      "ST": "Texas"
      }
      ]
      }
    • configca-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"
      }
      }
      }
      }
  3. 次に、次のコマンドを実行して、これらのファイルを使用してルートCAを生成します。

    Terminal window
    cfssl gencert -initca ca-csr.json | cfssljson -bare ca
  4. ディレクトリ内で、その内容を確認して出力が成功したことを確認します。

    Terminal window
    ls

    出力は次の内容を返すはずです:

    Terminal window
    ca-config.json ca-csr.json ca-key.pem ca.csr ca.pem

3. クライアント証明書を生成する

ターミナルに戻り、アップロードされたルートCAに対して認証するクライアント証明書を生成します。

  1. 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"
    }
    ]
    }
  2. 次に、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
  3. 次のcURLコマンドでクライアント証明書をテストできます。

    Terminal window
    curl -v --cert client.pem --key client-key.pem https://iot.widgetcorp.tech

ブラウザでテストする

ここでの指示は、macOSを実行しているコンピュータでの使用をカバーしています。

  1. 同じ作業ディレクトリで、次のコマンドを実行してクライアント証明書をmacOSのキーチェーンに追加します。
Terminal window
open client.pem
security import client-key.pem -k ~/Library/Keychains/login.keychain-db
  1. キーチェーンリストで証明書を選択して、証明書を信頼するように設定します。証明書がMy Certificatesにリストされていることを確認します。

CRLを作成する

Cloudflare PKIツールキットを使用して、証明書失効リスト(CRL)を生成することもできます。このリストには、失効されたクライアント証明書が含まれます。

  1. 以前に生成したクライアント証明書からシリアル番号を取得します。そのシリアル番号、または失効させたい他の番号を、テキストファイルに16進数形式で追加します。この例では、serials.txtという名前のファイルを使用します。

  2. 次のコマンドで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リポジトリで見つけることができます。

Forward a client certificate

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.

Cloudflare API

The most common approach to forwarding a certificate is to use the Cloudflare API to update an mTLS certificate’s hostname settings.

Request
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-Base64
  • Cf-Client-Cert-Sha256

Managed Transforms

You can also modify HTTP response headers using Managed Transforms to pass along TLS client auth headers.

Cloudflare Workers

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証明書のアラートを設定する

相互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 / filters

None.

Included with

Purchase 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.