このトピックでは、NSX Advanced Load Balancer で使用可能な DataScript SSL 関数の仕様について説明します。

機能

説明

avi.ssl.cipher( [true] )

SSL 暗号と設定を返します。

avi.ssl.client_cert( [ [avi.CLIENT_CERT] [, avi.CLIENT_CERT_FINGERPRINT] [, avi.CLIENT_CERT_SUBJECT] [, avi.CLIENT_CERT_ISSUER] [, avi.CLIENT_CERT_SERIAL]] )

クライアントの証明書またはその一部を返します。

avi.ssl.protocol()

SSL バージョンを返します。

avi.ssl.server_name()

SNI 名フィールドを返します。

avi.ssl.set_ssl_profile()

この API を使用すると、クライアント IP アドレス、TLS サーバ名などのいくつかの要因に基づいて、SSL プロファイルを別のプロファイルに変更できます。

avi.ssl.set_ssl_certificate()

この API を使用すると、クライアント IP アドレス、TLS サーバ名などの要因に基づいて、SSL キーと証明書を別のオブジェクトに変更できます。

avi.ssl.set_pki_profile()

この API を使用して、クライアント IP アドレス、TLS サーバ名、HTTP ホストまたは URI などの要因に基づいて、初期または再ネゴシエーションされた TLS セッションの PKI プロファイルを変更できます。

avi.ssl.renegotiate()

この API は、クライアント IP アドレス、TLS サーバ名、HTTP ホストまたは URI などの要因に基づいて PKI プロファイル、モード、頻度を変更した後に、クライアントとの TLS 接続を再ネゴシエーションするために使用できます。

avi.ssl.clear_client_cert_verify_error()

この API は、クライアント証明書認証と CRL チェックの結果を取得するために使用されます。

avi.ssl.client_cert_verify_error_string()

この API は検証エラー コードを受け入れ、そのエラー コードに関連付けられているエラー文字列を返します。

avi.ssl.client_cert_verify_mode()

この API は、クライアント証明書認証モードを取得するために使用されます。

avi.ssl.client_cert_verified()

この API は、クライアント証明書の検証が完了しているかどうかを確認するために使用されます。

avi.ssl.clear_client_cert_verify_error()

この API は、TLS 接続で SSL クライアント証明書検証エラーをクリアするために使用されます。

avi.ssl.log_client_cert_verify_error()

この API は、クライアント証明書認証の失敗をログに記録するために使用されます。このエラーは、重要なログとしてアプリケーション ログに追加されます。

avi.ssl.remove_session()

この API は、TLS 接続の SSL セッション キャッシュ エントリをクリアするために使用されます。

datascript-avi-ssl-client-cert-verify-error()

この API は、クライアント証明書認証と CRL チェックの結果を取得するために使用されます。

avi.ssl.cipher_len()

この API は、クライアントと仮想サービス間の SSL または TLS 接続についてネゴシエートされる暗号スイートの長さを決定するために使用されます。

avi.ssl.client_cert()

この API は、確立された SSL 接続の PEM 形式でクライアント証明書を取得するために使用されます。

avi.ssl.cipher

機能

avi.ssl.cipher( [true] )

説明

クライアントと仮想サービス間の SSL/TLS 接続のためにネゴシエートされる暗号スイートの名前を返します。必要に応じて、バージョン、キー交換方法 (Kx)、認証方法 (Au)、暗号化方法 (Enc)、選択した MAC (Mac) を含めることができます。返される暗号スイート情報は OpenSSL 形式です。OpenSSL 形式の暗号スイートの例については、www.openssl.org/docs/manmaster/apps/ciphers.html を参照してください。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

オプションのブール値 true。このパラメータが指定されていない場合は、暗号スイート名のみが返されます。true フラグが設定されている場合、この関数は暗号スイート、バージョン、認証方法、暗号化方法、および選択した MAC を返します。これらの値は、スペース区切りの文字列として表示されます。

戻り値

SSL/TLS 接続の暗号情報を含む文字列値。true フラグを設定すると、値はスペース区切りの文字列として返されます。

例 1

サポートされていない暗号を使用して接続しているクライアントを拒否します。

cipher_name = avi.ssl.cipher() 
if cipher_name == "RC4-SHA" then
   avi.http.response(200, {content_type="text/html"}, 
      "Upgrade your client to use modern and secure ciphers."
   )
end

例 2

クライアントとネゴシエートされたキー交換方法を示すヘッダーをサーバに挿入します。

cipher = avi.ssl.cipher(true)
   ­­-- get the key exchange method from the cipher detail using pattern matching
   ­­-- %w matches alphanumeric characters
kx = string.match(cipher, "Kx=(%w+)")

if kx then
   avi.http.add_header("X-­KeyExchange", kx)
end

avi.ssl.client_cert

新しい API の引数

avi.ssl.client_cert( [[avi.CLIENT_CERT] [, avi.CLIENT_CERT_FINGERPRINT] [, avi.CLIENT_CERT_SUBJECT] [, avi.CLIENT_CERT_ISSUER] [, avi.CLIENT_CERT_SERIAL][, avi.CLIENT_CERT_NOTVALIDBEFORE] [, avi.CLIENT_CERT_NOTVALIDAFTER] [, avi.CLIENT_CERT_VERSION][, avi.CLIENT_CERT_SIGALG] ] )

説明

確立された SSL 接続のクライアント証明書を PEM 形式で返します。オプションのパラメータは、クライアント証明書から返されたフィールドをフィルタリングします。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

引数や avi.CLIENT_CERT が指定されていない場合に、クライアントから仮想サービスへの確立された SSL 接続用の PEM 形式のクライアント証明書を返します。最初の行を除く各行の先頭にタブ文字を付加します。

  • avi.CLIENT_CERT_NOTVALIDBEFORE:クライアント証明書から有効開始日を返します。

  • avi.CLIENT_CERT_NOTVALIDAFTER:クライアント証明書から有効終了日を返します。

  • avi.CLIENT_CERT_VERSION:クライアント証明書のバージョン番号を返します。

  • avi.CLIENT_CERT_SIGALG:クライアント証明書の署名アルゴリズムを返します。

  • avi.CLIENT_CERT_SUBJECT:サブジェクト識別名の文字列を返します。

  • avi.CLIENT_CERT_ISSUER:発行者識別名の文字列を返します。

  • avi.CLIENT_CERT_SERIAL:シリアル番号を返します。

  • avi.CLIENT_CERT_FINGERPRINT:証明書の SHA1 フィンガープリント(ハッシュ)を返します。

戻り値

クライアント証明書とそのフィールドに関連する最大 9 つの引数。

例 1

証明書の発行者が正しくない場合は、発行者をヘッダーに追加し、検疫サーバ プールに転送します。

 if avi.ssl.client_cert(avi.CLIENT_CERT_ISSUER) ~=
    "/C=US/O=foo/OU=www.foo.com/CN=www.foo.com/[email protected]" then
    avi.http.add_header("client_cert_issuer", 
       avi.ssl.client_cert(avi.CLIENT_CERT_ISSUER))
    avi.pool.select("Quarantine-Pool")
 end 

例 2

SSL 接続のクライアント証明書属性をログに記録します。

if avi.http.secure() then -- test if the connection is secure
   fingerprint = avi.ssl.client_cert(avi.CLIENT_CERT_FINGERPRINT)
   avi.vs.log(fingerprint)
end

avi.ssl.protocol

機能

avi.ssl.protocol()

説明

確立された SSL 接続のプロトコルを返します。たとえば、TLSv1.1 です。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

なし

戻り値

SSL/TLS のバージョンまたは unknown の文字列を返します

if avi.ssl.protocol() == "TLSv1.0" then
   avi.http.response(404, {content_type="text/html"},
   "Your browser's SSL version, " .. avi.ssl.protocol() .. " is old. Upgrade your browser and try again.")
end

avi.ssl.server_name

機能

avi.ssl.protocol()

説明

確立された SSL 接続のプロトコルを返します。たとえば、TLSv1.1 です。

イベント

HTTP_REQ

HTTP_RESP

パラメータ

なし

戻り値

要求された SNI 名の文字列。

クライアントによって要求された SNI 名を宣言するヘッダーを挿入します。

avi.http.add_header("X-SNI ", avi.ssl.server_name())

avi.ssl.set_ssl_profile

機能

avi.ssl.set_ssl_profile(<SSL Profile Name>)

説明

この関数は、クライアント IP アドレス、TLS サーバ名などのいくつかの要因に基づいて、SSL プロファイルを別のプロファイルに変更するために使用されます。

イベント

VS_DATASCRIPT_EVT_CLIENT_SSL_PRE_CONNECTVS_DATASCRIPT_EVT_CLIENT_SSL_CLIENT_HELLO

パラメータ

SSL パラメータの名前

戻り値

なし

if avi.ssl.server_name() == "legacy.example.com" then
 avi.ssl.set_ssl_profile("legacy_ssl_profile") end

avi.ssl.server_name()legacy.example.com をポイントしている場合、これらの TLS 接続のプロファイルは legacy_ssl_profile に変更されます。

avi.ssl.set_ssl_certificate

機能

avi.ssl.set_ssl_certificate(<SSLKeyAndCertificate>)

説明

この機能は、クライアント IP アドレス、TLS サーバ名などの要因に基づいて、SSL キーと証明書を別のオブジェクトに変更するために使用されます。

イベント

VS_DATASCRIPT_EVT_CLIENT_SSL_PRE_CONNECTVS_DATASCRIPT_EVT_CLIENT_SSL_CLIENT_HELLO

パラメータ

SSL キーと証明書オブジェクトの名前。

戻り値

なし

if avi.ssl.server_name() == "legacy.example.com" then 
    avi.ssl.set_ssl_certificate("RSACertificate")
    avi.ssl.set_ssl_certificate("ECCertificate")
end

avi.ssl.set_pki_profile

機能

avi.ssl.set_pki_profile{(<Mode>[<pkiprofilename><frequency>)

説明

この関数は、クライアント IP アドレス、TLS サーバ名、HTTP ホストまたは URI などの要因に基づいて、初期または再ネゴシエーションされた TLS セッションの PKI プロファイルを変更するために使用されます。

  • avi.CLIENT_VERIFY_DISABLE は、API 呼び出しで PKI プロファイル名と頻度パラメータなしで使用する必要があります。

  • avi.CLIENT_VERIFY_REQUEST は、API 呼び出しで PKI プロファイル名と頻度パラメータなしで使用できます。

  • avi.CLIENT_VERIFY_REQUIRE は、API 呼び出しで PKI プロファイル名と、必要に応じて頻度パラメータとともに使用できます。

DataScript からの PKI 構成は、アプリケーション プロファイルからの構成よりも優先されます。

イベント

VS_DATASCRIPT_EVT_CLIENT_SSL_PRE_CONNECT​VS_DATASCRIPT_EVT_CLIENT_SSL_CLIENT_HELLO​​VS_DATASCRIPT_EVT_HTTP_REQVS_DATASCRIPT_EVT_HTTP_REQ_DATA

パラメータ

現在、アプリケーション プロファイルには 2 つのノブがあります。1 つのノブがモードを制御し、もう 1 つのノブが PKI プロファイル オブジェクトを制御します。

API は、プロファイル名(オプション)と認証の頻度(オプション)パラメータを持つモード(必須)です。サポートされている 3 つのモードは次のとおりです。

  • クライアント認証モード:avi.CLIENT_VERIFY_NONEavi.CLIENT_VERIFY_REQUESTavi.CLIENT_VERIFY_REQUIRE

  • PKI プロファイル オブジェクトの名前

  • 認証の頻度 avi.AUTHENTICATE_ONLY_ONCEavi.AUTHENTICATE_ONLY_ALWAYS

戻り値

なし

To disable client certificate authentication

if avi.ssl.server_name() == "legacy.example.com" then 
    avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_DISABLE) 
end

ここで、PKI プロファイルのクライアント検証は、この TLS サーバ接続で無効になっています。クライアント証明書の認証設定を変更するには、次のように指定します。

if avi.ssl.server_name() == "secure.example.com" then 
    avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-crl", avi.AUTHENTICATE_ONLY_ONCE) 
else
    avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUEST) 
end

TLS サーバ名が secure.example.com で PKI プロファイルが必須の場合、クライアント検証は必須としてマークされ、PKI プロファイルは CRL としてマークされ、1 回認証されます。クライアントから証明書を要求し、HTTP 要求などのイベントで詳細をログに記録する場合は、avi.CLIENT_VERIFY_REQUEST だけで avi.ssl.set_pki_profile を使用します。

注:

PKI 構成はアプリケーション プロファイルと DataScript を介して実行できるため、実行中は、DataScript を介して構成された PKI プロファイルがアプリケーション プロファイルを介して行われた構成よりも優先されます。

たとえば、証明書を必須としてマークするように PKI プロファイルが構成されているが、DataScript を介して特定のサーバ名の PKI プロファイルが無効としてマークされている場合、アプリケーション プロファイルの構成がオーバーライドされます。

avi.ssl.renegotiate

機能

avi.ssl.renegotiate()

説明

この関数は、クライアント IP アドレス、TLS サーバ名、HTTP ホストまたは URI などの要因に基づいて PKI プロファイル、モード、頻度を変更した後に、クライアントとの TLS 接続を再ネゴシエーションします。再ネゴシエーション API 呼び出しの前にクライアント証明書認証が有効になっている場合、PKI 設定が SSL セッションの再ネゴシエーションに適用されます。HTTP 要求は、再ネゴシエーションが完了するまで停止されます。

SSL 再ネゴシエーションにより、接続で SSL セッションの再開が無効になります。

注:

接続で PKI 設定を変更した後に再ネゴシエーションを使用する場合、ユーザーのスクリプトはクライアント認証の結果を処理する必要があります。そうしないと、TLS 接続に対する後続の要求が失敗する可能性があります。スクリプトは、エラーをクリアするか、接続を終了するかを選択できます。

イベント

VS_DATASCRIPT_EVT_HTTP_REQ

VS_DATASCRIPT_EVT_HTTP_REQ_DATA

パラメータ

なし

戻り値

なし

クライアント証明書認証を無効にするには、次の手順を実行します。

if string.contains(avi.http.get_uri(), \"secure\") then 
   avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE) 
   avi.ssl.renegotiate() 
   verify_err, error_code = avi.ssl.client_cert_verify_error()
    if  verify_err == 0 or (verify_err == 2 and error_code ~= 0) then
       avi.http.close_connection()
 end 
end 

ここでは、特定の URI を確認してから、PKI 属性を変更し、SSL 再ネゴシエーションを実行します。次に、エラーが発生した場合は、接続を終了します。

注意:
  • エラーが発生したが、接続を終了しないことを決定した場合は、エラーを修正します。エラーをクリアしない場合、後続の要求は DataScript が考慮されないパスに入り、エラーが原因でネイティブ要求フローが接続を終了することがあります。

  • 再ネゴシエーションは、HTTP2 プロトコルと TLS1.3 プロトコルでは機能しません。

avi.ssl.clear_client_cert_verify_error

機能

avi.ssl.clear_client_cert_verify_error()

説明

この関数は、TLS 接続で SSL クライアント証明書検証エラーをクリアするために使用されます。内部的に、API は TLS 接続の verify_result に「X509_V_OK」を設定します。

イベント

VS_DATASCRIPT_EVT_SSL_HANDSHAKE_DONE

VS_DATASCRIPT_EVT_HTTP_REQ

VS_DATASCRIPT_EVT_HTTP_REQ_DATA

パラメータ

なし

戻り値

値なし

if avi.ssl.server_name() == "secure.example.com" && avi.ssl.get_client_cert_verify_mode() == 0 then ​

   avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE)​

   avi.ssl.renegotiate()​

   verify_err, err_code = avi.ssl.client_cert_verify_error()​

   if err_code ~= 0 and avi.ssl.client_cert_verify_error_string(err_code) == 'X509_V_ERR_CRL_HAS_EXPIRED' then ​

         avi.ssl.clear_client_cert_verify_error()​

   end​

end​

avi.ssl.client_cert_verify_error_string

機能

avi.ssl.clear_client_cert_verify_error_string()

説明

この API は検証エラー コードを受け入れ、そのエラー コードに関連付けられたエラー文字列を返します

イベント

VS_DATASCRIPT_EVT_SSL_HANDSHAKE_DONE

VS_DATASCRIPT_EVT_HTTP_REQ

VS_DATASCRIPT_EVT_HTTP_REQ_DATA

パラメータ

client cert verify error() としての 1 つの整数引数

戻り値

この DataScript 関数は、SSL スタックによって返されるこれらのエラー コードの特定の意味を理解するために、OpenSSL の verify ドキュメントから特定の verify エラー コードのエラー文字列を返します。

if avi.ssl.server_name() == "secure.example.com" then 
    avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE)
    avi.ssl.renegotiate()
    verify_err, error_code = avi.ssl.client_cert_verify_error()
    if  verify_err == 0 or (verify_err == 2 and avi.ssl.client_cert_verify_error_string(error_code) ~= 'X509_V_OK') then
        avi.http.close_connection()   
    end
end

avi.ssl.client_cert_verify_mode

機能

avi.ssl.get_client_cert_verify_mode()

説明

この DataScript 関数は、クライアント証明書認証モードを取得するために使用されます

イベント

VS_DATASCRIPT_EVT_SSL_HANDSHAKE_DONE

VS_DATASCRIPT_EVT_HTTP_REQ

VS_DATASCRIPT_EVT_HTTP_REQ_DATA

パラメータ

なし

戻り値

この DataScript 関数は、次のいずれかの値を返します。

  • 0 は、クライアント証明書認証が activated でないか、deactivated であることを示します。

  • 1 は、クライアント証明書認証が REQUIRE モードであることを示します

  • 2 は、クライアント証明書認証が PKI プロファイルを使用した REQUEST モードであることを示します

  • 3 は、クライアント証明書認証が PKI プロファイルなしの REQUEST モードであることを示します

if avi.ssl.server_name() == "secure.example.com" && avi.ssl.get_client_cert_verify_mode() == 0 then
     avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE)
     avi.ssl.renegotiate()
end

avi.ssl.client_cert_verified

機能

avi.ssl.client_cert_verified()

説明

この DataScript 関数は、クライアント証明書の検証が完了したかどうかを確認するために使用されます。

イベント

VS_DATASCRIPT_EVT_SSL_HANDSHAKE_DONE

VS_DATASCRIPT_EVT_HTTP_REQ

VS_DATASCRIPT_EVT_HTTP_REQ_DATA

パラメータ

なし

戻り値

この DataScript 関数は、次のいずれかの値を返します。

  • 0 は次のことを示します

    • 接続が SSL に対応していません。

    • NSX Advanced Load Balancer はクライアント証明書を要求しませんでした。

    • クライアントが証明書を提示しませんでした。

    • クライアント証明書の検証に失敗しました。

  • 1 は、クライアント証明書の検証に合格したことを示します。

if avi.ssl.server_name() == "secure.example.com" && avi.ssl.client_cert_verified() == 0 then 
   avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE)
   avi.ssl.renegotiate()
end

avi.ssl.clear_client_cert_verify_error

機能

avi.ssl.clear_client_cert_verify_error()

説明

この関数は、TLS 接続で SSL クライアント証明書検証エラーをクリアするために使用されます。内部的に、API は TLS 接続の verify_result に「X509_V_OK」を設定します。

イベント

VS_DATASCRIPT_EVT_SSL_HANDSHAKE_DONE

VS_DATASCRIPT_EVT_HTTP_REQ

VS_DATASCRIPT_EVT_HTTP_REQ_DATA

パラメータ

なし

戻り値

値なし

if avi.ssl.server_name() == "secure.example.com" && avi.ssl.get_client_cert_verify_mode() == 0 then ​

   avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE)​

   avi.ssl.renegotiate()​

   verify_err, err_code = avi.ssl.client_cert_verify_error()​

   if err_code ~= 0 and avi.ssl.client_cert_verify_error_string(err_code) == 'X509_V_ERR_CRL_HAS_EXPIRED' then ​

         avi.ssl.clear_client_cert_verify_error()​

   end​

end​

avi.ssl.log_client_cert_verify_error

機能

avi.ssl.log_client_cert_verify_error()

説明

この DataScript 関数は、クライアント証明書認証の失敗をログに記録するために使用されます。このエラーは、重要なログとしてアプリケーション ログに追加されます。

例:クライアント証明書の検証に失敗しました。クライアントの x509 証明書の検証に失敗しました。

イベント

VS_DATASCRIPT_EVT_SSL_HANDSHAKE_DONE

VS_DATASCRIPT_EVT_HTTP_REQ

VS_DATASCRIPT_EVT_HTTP_REQ_DATA

パラメータ

なし

戻り値

なし

if avi.ssl.server_name() == "secure.example.com" &&
avi.ssl.get_client_cert_verify_mode() ~= 0 then
     avi.ssl.log_client_cert_verify_error()
end

avi.ssl.remove_session

機能

avi.ssl.remove_session()

説明

この API は、TLS 接続の SSL セッション キャッシュ エントリをクリアするために使用されます。

イベント

VS_DATASCRIPT_EVT_SSL_HANDSHAKE_DONEVS_DATASCRIPT_EVT_HTTP_REQVS_DATASCRIPT_EVT_HTTP_REQ_DATA

パラメータ

なし

戻り値

なし

if string.contains(avi.http.get_uri(), \"logout.html\") then 
          avi.ssl.remove_session()
end

avi.ssl.get_client_cert_verify_mode

機能

avi.ssl.get_client_cert_verify_mode()

イベント

VS_DATASCRIPT_EVT_SSL_HANDSHAKE_DONEVS_DATASCRIPT_EVT_HTTP_REQVS_DATASCRIPT_EVT_HTTP_REQ_DATA

パラメータ

なし

戻り値

この DataScript 関数は、次のいずれかの値を返します。

  • 0 は、クライアント証明書認証が有効でないか、無効になっていることを示します。

  • 1 は、クライアント証明書認証が REQUIRE モードであることを示します

  • 2 は、クライアント証明書認証が PKI プロファイルを使用した REQUEST モードであることを示します

  • 3 は、クライアント証明書認証が PKI プロファイルなしの REQUEST モードであることを示します

if avi.ssl.server_name() == "secure.example.com" && avi.ssl.get_client_cert_verify_mode() == 0 then
     avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUIRE, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE)
     avi.ssl.renegotiate()
end

avi.ssl.cipher_len

機能

avi.ssl.cipher_len()

説明

クライアントと仮想サービス間の SSL/TLS 接続についてネゴシエートされる暗号スイートの長さを返します。

パラメータ

なし

イベント

  • SSL_HANDSHAKE_DONE

  • L4_REQUEST

  • HTTP_AUTH

  • HTTP_POST_AUTH

  • HTTP_REQ

  • HTTP_REQ_BODY

  • LB_DONE

  • HTTP_RESP

  • HTTP_RESP_FAILED

  • HTTP_RESP_BODY

-- Cipher selected is ECDHE-RSA-AES128-GCM-SHA256
cipher_len = avi.ssl.cipher_len()

-- cipher_len = 128
avi.vs.log("Cipher length: "..cipher_len)
注:

この API は、イベント SSL_PRECONNECT および SSL_CLIENTHELLO でサポートされていません。

datascript-avi-ssl-client-cert-verify-error

機能

avi.ssl.client_cert_verify_error()

説明

この API を使用して、クライアント証明書認証と CRL チェックの結果を取得できます。

パラメータ

なし

イベント

  • VS_DATASCRIPT_EVT_SSL_HANDSHAKE_DONE

  • VS_DATASCRIPT_EVT_HTTP_REQ

  • VS_DATASCRIPT_EVT_HTTP_REQ_DATA

戻り値

この API は、次の 2 つの値を返します。

  1. 最初の戻り値:

    1. 0 - クライアントが証明書を提示しなかったことを示します

    2. 1 - クライアントの証明書が有効であることを示します

    3. 2 - クライアントの証明書が無効であることを示します

  2. 2 番目の戻り値は、特定のエラー コード用です。最初の戻り値が 2 の場合は、OpenSSL で verify ドキュメントを参照して、SSL スタックによって返されるこれらのエラー コードの具体的な意味を確認します。

if avi.ssl.server_name() == "secure.example.com" then 
    avi.ssl.set_pki_profile(avi.CLIENT_VERIFY_REQUEST, "pkiprofile-ca", avi.AUTHENTICATE_ONLY_ONCE)
    avi.ssl.renegotiate()
    verify_err, error_code = avi.ssl.client_cert_verify_error()
    if  verify_err == 0 or (verify_err == 2 and error_code ~= 0) then
        avi.http.close_connection()
    end
end

avi.ssl.client_cert

機能

avi.ssl.client_cert( [[avi.CLIENT_CERT] [, avi.CLIENT_CERT_FINGERPRINT] [, avi.CLIENT_CERT_SUBJECT] [, avi.CLIENT_CERT_ISSUER] [, avi.CLIENT_CERT_SERIAL][, avi.CLIENT_CERT_NOTVALIDBEFORE] [, avi.CLIENT_CERT_NOTVALIDAFTER] [, avi.CLIENT_CERT_VERSION][, avi.CLIENT_CERT_SIGALG][, avi.CLIENT_CERT_ESCAPED] avi.CLIENT_CERT_SAN_EXTENSION] [, avi.CLIENT_CERT_X509_EXTENSIONS] ] )

説明

確立された SSL 接続のクライアント証明書を PEM 形式で返します。オプションのパラメータは、クライアント証明書から返されたフィールドをフィルタリングします。

イベント

  • HTTP_REQ

  • HTTP_RESP

  • SSL_HANDSHAKE_DONE

  • HTTP LB Done

パラメータ

引数または avi.CLIENT_CERT が指定されていない場合、クライアントから仮想サービスへの確立された SSL 接続のクライアント証明書を PEM 形式で返します。最初の行を除く各行の先頭にタブ文字が付加されます。

  • avi.CLIENT_CERT_NOTVALIDBEFORE:クライアント証明書から有効開始日を返します。

  • avi.CLIENT_CERT_NOTVALIDAFTER:クライアント証明書から有効終了日を返します。

  • avi.CLIENT_CERT_VERSION:クライアント証明書のバージョン番号を返します。

  • avi.CLIENT_CERT_SIGALG:クライアント証明書の署名アルゴリズムを返します。

  • avi.CLIENT_CERT_SUBJECT:サブジェクト識別名の文字列を返します。

  • avi.CLIENT_CERT_ISSUER:発行者識別名の文字列を返します。

  • avi.CLIENT_CERT_SERIAL:シリアル番号を返します。

  • avi.CLIENT_CERT_FINGERPRINT:証明書の SHA1 フィンガープリント(ハッシュ)を返します。

  • avi.CLIENT_CERT_ESCAPED:エンコードされた PEM 証明書を返します。

  • avi.CLIENT_CERT_SAN_EXTENSIONS:クライアント証明書のサブジェクトの代替名 (SAN) 拡張機能を返します。

  • avi.CLIENT_CERT_X509_EXTENSIONS:クライアント証明書内のすべての x509 拡張機能を返します。

戻り値

クライアント証明書とそのフィールドに関連する最大 9 つの引数。

例 1

証明書の発行者が正しくない場合は、発行者をヘッダーに追加し、検疫サーバ プールに転送します。

if avi.ssl.client_cert(avi.CLIENT_CERT_ISSUER) ~=
    "/C=US/O=foo/OU=www.foo.com/CN=www.foo.com/[email protected]" then
    avi.http.add_header("client_cert_issuer", 
       avi.ssl.client_cert(avi.CLIENT_CERT_ISSUER))
    avi.pool.select("Quarantine-Pool")
 end 

例 2

SSL 接続のクライアント証明書属性をログに記録します。

if avi.http.secure() then -- test if the connection is secure
   fingerprint = avi.ssl.client_cert(avi.CLIENT_CERT_FINGERPRINT)
   avi.vs.log(fingerprint)
end

Example 3

HTTP 要求でクライアント証明書を送信すると、クライアントがエスケープした証明書が DS/HTTP ポリシー ヘッダーに表示されます。

 escaped_cert = avi.ssl.client_cert(avi.CLIENT_CERT_ESCAPED)
  avi.vs.log(escaped_cert)
  avi.http.add_header("escaped_client_cert",escaped_cert)
注:

この API は、イベント SSL_PRECONNECT および SSL_CLIENTHELLO でサポートされていません。

avi.utils.get_ip_reputation

Lua 関数を使用した、L7 DataScript の IP レピュテーション チェックに Webroot DB を使用できます。

is_good, reputation_type = avi.utils.get_ip_reputation(ip_addr) 

is_good の最初の戻り値は true/false です。これは、指定された IP アドレスのレピュテーションが良好かどうかを示します。

2 番目の戻り値は IP レピュテーション タイプのビットマップで、is_goodfalse の場合にのみ有効です。たとえば、値 1 はスパムの送信元(ビット 0 セット)を示し、値 17 はスパムの送信元とスキャナ(ビット 0 および 4 セット)を示します。

詳細については、『VMware NSX Advanced Load Balancer WAF ガイド』の「IP レピュテーション」のトピックを参照してください。

この関数は、仮想サービス DataScript セット用に構成された IP レピュテーション データベースを使用します。

注:

API または CLI を使用して、IPReputationDB を使用するように VSDataScriptSet を構成できます。

Lua 関数は、IPv4 と IPv6 の両方のアドレスを受け入れます。ただし、IP レピュテーション データベースには現在 IPv4 アドレスの情報のみが含まれているため、IPv6 アドレスの場合は常に true が返されます。

ip_addr パラメータの形式は、avi.vs.client_ip() によって返されるものと想定されます。これは、たとえば 1.2.3.4 などの表示形式です。

message VSDataScriptSet {
  ...
  optional string ip_reputation_db_uuid = 58 [
    (refers_to) = "IPReputationDB",
    ...
  ]
  ...
}

構成のワークフロー

スクリプトが新しい avi.utils.get_ip_reputation(ip_addr) 関数を使用する場合、VSDataScriptSet レベルで IPReputationDB を構成する必要があります。