ADC

高度なポリシー表現:SSL 証明書の解析

SSL 証明書と SSL クライアント hello メッセージを解析するための高度なポリシー式があります。

SSL 証明書を解析する

X.509 Secure Sockets Layer (SSL) クライアント証明書を評価するには、高度なポリシー式を使用できます。クライアント証明書は、ユーザーの ID を認証するために使用できる電子文書です。クライアント証明書には、(少なくとも) バージョン情報、シリアル番号、署名アルゴリズム ID、発行者名、有効期間、サブジェクト (ユーザー) 名、公開鍵、および署名が含まれます。

SSL 接続とクライアント証明書内のデータの両方を調べることができます。たとえば、強度の低い暗号を使用する SSL 要求を特定の負荷分散仮想サーバーファームに送信できます。次のコマンドは、要求内の暗号強度を解析し、40 以下の暗号強度を照合するコンテンツスイッチングポリシーの例です。

add cs policy p1 -rule "client.ssl.cipher_bits.le(40)"

もう 1 つの例として、要求にクライアント証明書が含まれるかどうかを決定するポリシーを設定できます。

add cs policy p2 -rule "client.ssl.client_cert exists"

また、クライアント証明書内の特定の情報を検査するポリシーを構成することもできます。たとえば、次のポリシーは、証明書の有効期限が 1 日以上前であることを検証します。

add cs policy p2 -rule "client.ssl.client_cert exists && client.ssl.client_cert.days_to_expire.ge(1)"

JA3 フィンガープリントの使用例:

add ssl policy ja3_pol -rule "CLIENT.SSL.JA3_FINGERPRINT.EQ(bb4c15a90e93a25ddc16274395bce4c6)" -action reset

あるいは、patset での JA3 フィンガープリントの使用例:

add policy patset pat1
bind policy patset pat1 bb4c15a90e93a25ddc16274395bce4c6 -index 1
bind policy patset pat1 cd3c15a90e93a25ddc16274395bce6b4 -index 2
add ssl policy ssl_ja3_pol -rule CLIENT.SSL.JA3_FINGERPRINT.contains_any("pat1") -action reset
<!--NeedCopy-->

証明書の日付と時刻の解析については、「 式内の日付と時刻のフォーマット」およびSSL 証明書の日付の式」を参照してください。

テキストベースの SSL および証明書データのプレフィックス

次の表に、SSL トランザクションとクライアント証明書でテキストベースの項目を識別する式プレフィックスについて説明します。

表1. SSL およびクライアント証明書データのテキストまたはブール値を返すプレフィックス

説明
CLIENT.SSL.CLIENT_CERT 現在の SSL トランザクションの SSL クライアント証明書を返します。
CLIENT.SSL.CLIENT_CERT.TO_PEM SSL クライアント証明書をバイナリ形式で返します。
CLIENT.SSL.CIPHER_EXPORTABLE SSL 暗号がエクスポート可能な場合は、ブール型 (Boolean) の TRUE を返します。
CLIENT.SSL.CIPHER_NAME SSL 接続から呼び出された場合は SSL Cipher の名前を返し、非 SSL 接続から呼び出された場合は NULL 文字列を返します。
CLIENT.SSL.IS_SSL 現在の接続が SSL ベースの場合は、ブール型 (Boolean) の TRUE を返します。
CLIENT.SSL.JA3_FINGERPRINT 設定された JA3 フィンガープリントがクライアント hello メッセージの JA3 フィンガープリントと一致する場合、ブール型 TRUE を返します。注: この式は、リリース 13.1 ビルド 12.x 以降で使用できます。

SSL 証明書の数値データのプレフィックス

次の表では、SSL 証明書の日付以外の数値データを評価するプレフィックスについて説明します。これらのプレフィックスは、 [式接頭辞の基本操作と数値の複合演算で説明されている操作で使用できます](/ja-jp/citrix-adc/current-release/appexpert/policies-and-expressions/adv-policy-expressions-getting-started/compound-advanced-policy-expressions.html)

表2. SSL 証明書の日付以外の数値データを評価するプレフィックス

説明
CLIENT.SSL.CLIENT_CERT.DAYS_TO_EXPIRE 証明書が有効な日数を返します。期限切れの証明書の場合は -1 を返します。
CLIENT.SSL.CLIENT_CERT.PK_SIZE 証明書で使用されている公開鍵のサイズを返します。
CLIENT.SSL.CLIENT_CERT.VERSION 証明書のバージョン番号を返します。接続が SSL ベースでない場合は、ゼロ (0) を返します。
CLIENT.SSL.CIPHER_BITS 暗号鍵のビット数を返します。接続が SSL ベースでない場合は 0 を返します。
CLIENT.SSL.VERSION SSL プロトコルのバージョンを表す数値 (0) を返します。トランザクションは SSL ベースではありません:0x002。トランザクションは SSLv2:0x300 です。トランザクションは SSLv3:0x301 です。トランザクションは TLSv1:0x302 です。トランザクションは TLS 1.1:0x303 です。トランザクションは TLS 1.2:0x304 です。トランザクションは TLS 1.3 です。

証明書の有効期限に関連する式については、「 SSL 証明書日付の式」を参照してください。

SSL 証明書の式

SSL 証明書を解析するには、次のプレフィックスを使用する式を設定します。

CLIENT.SSL.CLIENT_CERT

ここでは、証明書に対して構成できる式について説明します。ただし、証明書の有効期限を調べる式は除きます。時間ベースの操作については、「 高度なポリシー式:日付、時刻、および数字の操作」を参照してください。

次の表に、CLIENT.SSL.CLIENT_CERT プレフィックスに指定できる操作を示します。

表3. CLIENT.SSL.CLIENT_CERT プレフィックスで指定できる操作

SSL 証明書の操作 説明
<certificate>.EXISTS クライアントが SSL 証明書を持っている場合は、ブール型 TRUE を返します。
<certificate>.ISSUER 証明書内の発行者の識別名 (DN) を名前と値のリストとして返します。等号 (「=」) は名前と値の区切り文字で、スラッシュ (「/」) は名前と値のペアを区切る区切り文字です。返される DN の例を以下に示します。 /C=US/O=myCompany/OU=www.mycompany.com/CN=www.mycompany.com/emailAddress=myuserid@mycompany.com
<certificate>.ISSUER. IGNORE_EMPTY_ELEMENTS Issuer を返し、名前/値リスト内の空の要素は無視します。例えば, 次を考えてみましょう: Cert-Issuer: /c=in/st=kar//l=bangelore //o=mycompany/ou=sales/ /emailAddress=myuserid@mycompany.com。次の Rewrite アクションは、前の発行者の定義に基づいて 6 のカウントを返します。sh rewrite action insert_ssl_header Name: insert_ssl Operation: insert_http_header Target:Cert-Issuer Value:CLIENT.SSL.CLIENT_CERT.ISSUER.COUNT。ただし、値を次のように変更すると、返されるカウントは 9 です。CLIENT.SSL.CLIENT_CERT.ISSUER.IGNORE_EMPTY_ELEMENTS.COUNT
<certificate>. SERIALNUMBER 証明書のシリアル番号を、先頭にゼロを含まない大文字の 16 進文字列で返します。たとえば、証明書のシリアル番号が 04daa1e44bd2e7769638a0058b4964bd の場合、次の式はシリアル番号との照合に役立ちますCLIENT.SSL.CLIENT_CERT.SERIALNUMBER.SET_TEXT_MODE(IGNORECASE).CONTAINS(\"4daa1e44bd2e7769638a0058b4964bd\")
  • <certificate>.extensions.has_object
クライアント証明書に一致するOIDの拡張がある場合、ブール値 TRUE を返します。たとえば、クライアント証明書の拡張子が OID 2.16.756.5.4.2.1.2.13.2.7 の場合、この式 client.ssl.client_cert.extensions.has_object (2.16.756.5.4.2.1.2.13.2.7)はTRUE を返します。
  • <certificate>.extensions.object(OID).has_value(value)

クライアント証明書に OID と値が一致するエクステンションがある場合、ブール値 TRUE を返します。たとえば、クライアント証明書の拡張子が OID 2.16.756.5.4.2.1.2.13.2.7 で、値XBが指定されている場合、この式client.ssl.client_cert.extensions.object(“2.16.756.5.4.2.1.2.13.2.7”).has_value(“XB”)はTRUEを返します。
メモ
-指定された OID の拡張機能に IA5 または整数以外のタイプの値がある場合、ポリシー評価の結果、未定義 (UNDEF) イベントが発生する。
<certificate>.extensions.count クライアント証明書で受信されたエクステンションの数。たとえば、クライアント証明書の拡張子の数が 16 の場合、expression client.ssl.client_cert.extensions.count.eq(16)はTRUE を返します

注:

標準拡張では、OID の代わりによく知られた短縮名を使用できます。たとえば、Netscape コメント拡張には OID 2.16.840.1.113730.1.13 とショートネームnsCommentがあります。拡張では2.16.840.1.113730.1.13

```の代わりにnsCommentを使えます

  • client.ssl.client_cert.extensions.has_object(nscomment).
  • client.ssl.client_cert.extensions.object(“nscomment”).has_value(“OpenSSL Generated Client Certificate”).

```

SSL クライアントを解析するこんにちは

SSL クライアントの hello メッセージを解析するには、次のプレフィックスを使用する式を設定します。

説明
CLIENT.SSL.CLIENT_HELLO.CIPHERS.HAS_HEXCODE 式で指定された 16 進コードを、クライアント hello メッセージで受け取った暗号スイートの 16 進コードと照合します。
CLIENT.SSL.CLIENT_HELLO.CLIENT_VERSION クライアントの hello メッセージヘッダーで受け取ったバージョン。
CLIENT.SSL.CLIENT_HELLO.IS_RENEGOTIATE クライアントまたはサーバーがセッション再ネゴシエーションを開始した場合は true を返します。
CLIENT.SSL.CLIENT_HELLO.IS_REUSE client-hello メッセージで受信した 0 以外のセッション ID に基づいて、アプライアンスが SSL セッションを再利用する場合は true を返します。
CLIENT.SSL.CLIENT_HELLO.IS_SCSV シグナリング暗号スイート値 (SCSV) 機能がクライアントの hello メッセージでアドバタイズされている場合は true を返します。フォールバック SCSV の 16 進コードは 0x5600 です。
CLIENT.SSL.CLIENT_HELLO.IS_SESSION_TICKET 長さが 0 以外のセッションチケット拡張が client-hello メッセージでアドバタイズされた場合、true を返します。
CLIENT.SSL.CLIENT_HELLO.LENGTH クライアントの hello メッセージヘッダーで受信した長さ。
CLIENT.SSL.CLIENT_HELLO.SNI クライアントの hello メッセージのサーバ名拡張で受け取ったサーバ名を返します。
CLIENT.SSL.CLIENT_HELLO.ALPN.HAS_NEXTPROTOCOL クライアントの hello メッセージで受信した ALPN 拡張のアプリケーションプロトコルが、式で指定されたプロトコルと一致する場合に true を返します。

これらの式は CLIENTHELLO_REQ バインドポイントで使用できます。詳細については、 SSL ポリシーバインディングを参照してください

高度なポリシー表現:SSL 証明書の解析