本主题将详细介绍 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()

根据客户端 IP、TLS 服务器名称、HTTP 主机或 URI 等因素,在更改 PKI 配置文件、模式和频率后,可以使用此 API 重新协商与客户端的 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] ] )

描述

以 PEM 格式返回建立的 SSL 连接的客户端证书。可选参数将筛选从客户端证书返回的字段。

事件

HTTP_REQ

HTTP_RESP

参数

在未指定参数或 avi.CLIENT_CERT 时,以 PEM 格式返回从客户端到虚拟服务的已建立 SSL 连接的客户端证书,除第一行外,每一行前面都附加制表符。

  • avi.CLIENT_CERT_NOTVALIDBEFORE:从客户端证书返回此时间之前无效的证书。

  • avi.CLIENT_CERT_NOTVALIDAFTER:从客户端证书返回此时间之后无效的证书。

  • avi.CLIENT_CERT_VERSION:返回客户端证书的版本号。

  • avi.CLIENT_CERT_SIGALG:返回客户端证书的签名算法。

  • avi.CLIENT_CERT_SUBJECT:返回主体 DN 字符串。

  • avi.CLIENT_CERT_ISSUER:返回颁发者 DN 字符串。

  • 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 配置文件。

  • 在 API 调用中没有 PKI 配置文件名称和频率参数的情况下,必须使用 avi.CLIENT_VERIFY_DISABLE

  • 在 API 调用中没有 PKI 配置文件名称和频率参数的情况下,可以使用 avi.CLIENT_VERIFY_REQUEST

  • 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

参数

目前,在应用程序配置文件中,有两个控制项。一个控制项控制模式,另一个控制项控制 PKI 配置文件对象。

API 是一种具有配置文件名称(可选)和身份验证频率(可选)参数的模式(必需)。以下是支持的三种模式:

  • 客户端身份验证模式: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

此处,在此 TLS 服务器连接上禁用对 PKI 配置文件的客户端验证。要更改客户端证书身份验证设置,请执行以下操作。

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,并进行一次身份验证。如果要从客户端请求证书并在其他事件(如 HTTP 请求)中记录详细信息,请仅将 avi.ssl.set_pki_profileavi.CLIENT_VERIFY_REQUEST 结合使用。

注:

由于 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()

返回

此 DataScript 函数根据 OpenSSL 验证文档中的验证错误代码返回错误字符串,以了解 SSL 堆栈返回的这些错误代码的具体含义。

示例

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 表示客户端证书身份验证处于 activateddeactivated 状态。

  • 1 表示客户端证书身份验证处于 REQUIRE 模式

  • 2 表示客户端证书身份验证处于 REQUEST 模式,并且使用 PKI 配置文件

  • 3 表示客户端证书身份验证处于 REQUEST 模式,并且不使用 PKI 配置文件

示例

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 表示客户端证书身份验证处于 REQUEST 模式,并且使用 PKI 配置文件

  • 3 表示客户端证书身份验证处于 REQUEST 模式,并且不使用 PKI 配置文件

示例

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)
注:

事件 SSL_PRECONNECTSSL_CLIENTHELLO 不支持此 API。

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 将返回两个值:

  1. 第一个返回值:

    1. 0 - 表示客户端未提供证书

    2. 1 - 表示客户端的证书有效

    3. 2 - 表示客户端的证书无效

  2. 第二个返回值适用于特定的错误代码。如果第一个返回值为 2,请参阅 OpenSSL 验证文档,以了解 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] ] )

描述

以 PEM 格式返回建立的 SSL 连接的客户端证书。可选参数将筛选从客户端证书返回的字段。

事件

  • HTTP_REQ

  • HTTP_RESP

  • SSL_HANDSHAKE_DONE

  • HTTP LB Done

参数

如果无参数或指定 avi.CLIENT_CERT,将以 PEM 格式返回从客户端到虚拟服务的已建立 SSL 连接的客户端证书,除第一行外,每一行前面都附加制表符。

  • avi.CLIENT_CERT_NOTVALIDBEFORE:从客户端证书返回此时间之前无效的证书。

  • avi.CLIENT_CERT_NOTVALIDAFTER:从客户端证书返回此时间之后无效的证书。

  • avi.CLIENT_CERT_VERSION:返回客户端证书的版本号。

  • avi.CLIENT_CERT_SIGALG:返回客户端证书的签名算法。

  • avi.CLIENT_CERT_SUBJECT:返回主体 DN 字符串。

  • avi.CLIENT_CERT_ISSUER:返回颁发者 DN 字符串。

  • avi.CLIENT_CERT_SERIAL:返回序列号。

  • avi.CLIENT_CERT_FINGERPRINT:返回证书的 SHA1 指纹(哈希)。

  • avi.CLIENT_CERT_ESCAPED:返回编码的 PEM 证书。

  • avi.CLIENT_CERT_SAN_EXTENSIONS:返回客户端证书中的主体备用名称 (Subject Alternative Name, 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

示例 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)
注:

事件 SSL_PRECONNECTSSL_CLIENTHELLO 不支持此 API。

avi.utils.get_ip_reputation

可以通过 Lua 函数在 L7 DataScript 中使用 Webroot 数据库进行 IP 信誉检查。

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

is_good 的第一个返回值为 true/false。此值指示给定 IP 的信誉是否良好。

第二个返回的值为 IP 信誉类型的位图,只有在 is_goodfalse 才有效。例如,值 1 表示垃圾邮件源(第 0 位集合),值 17 表示垃圾邮件源和扫描程序(第 0 位和第 4 位集合)。

有关更多信息,请参阅《VMware NSX Advanced Load Balancer WAF 指南》中的“IP 信誉”主题。

该函数将使用为虚拟服务 DataScript 集合配置的 IP 信誉数据库。

注:

您可以使用 API 或 CLI 将 VSDataScriptSet 配置为使用 IPReputationDB

Lua 函数将接受 IPv4 和 IPv6 地址。但是,它将始终为 IPv6 地址返回 true,因为 IP 信誉数据库当前仅包含 IPv4 地址信息。

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