本主题将详细介绍 NSX Advanced Load Balancer 上提供的 DataScript SSL 函数的规范。
函数 |
描述 |
---|---|
返回 SSL 密码和设置。 |
|
返回客户端的证书或其中的一部分。 |
|
返回 SSL 版本。 |
|
返回 SNI 名称字段。 |
|
此 API 可用于根据客户端 IP、TLS 服务器名称等一些因素,将 SSL 配置文件更改为不同的配置文件。 |
|
此 API 可用于根据客户端 IP、TLS 服务器名称等因素,将 SSL 密钥和证书更改为不同的对象。 |
|
此 API 可用于根据客户端 IP、TLS 服务器名称、HTTP 主机或 URI 等因素,更改初始或重新协商的 TLS 会话的 PKI 配置文件。 |
|
根据客户端 IP、TLS 服务器名称、HTTP 主机或 URI 等因素,在更改 PKI 配置文件、模式和频率后,可以使用此 API 重新协商与客户端的 TLS 连接。 |
|
此 API 用于获取客户端证书身份验证和 CRL 检查的结果。 |
|
此 API 接受验证错误代码,并返回与该错误代码关联的错误字符串。 |
|
此 API 用于获取客户端证书身份验证模式。 |
|
此 API 用于确定客户端证书验证是否完成。 |
|
此 API 用于清除 TLS 连接上的 SSL 客户端证书验证错误。 |
|
此 API 用于记录客户端证书身份验证失败。该错误将作为重要日志添加到应用程序日志中。 |
|
此 API 用于清除 TLS 连接的 SSL 会话缓存条目。 |
|
此 API 用于获取客户端证书身份验证和 CRL 检查的结果。 |
|
此 API 用于确定为客户端与虚拟服务之间的 SSL 或 TLS 连接协商的密码套件的长度。 |
|
此 API 用于获取已建立的 SSL 连接的 PEM 格式的客户端证书。 |
avi.ssl.cipher
函数 |
|
描述 |
返回为客户端与虚拟服务之间的 SSL/TLS 连接协商的密码套件的名称,并且可以选择包括版本、密钥交换方法 (Kx)、身份验证方法 (Au)、加密方法 (Enc) 和选定的 MAC (Mac)。返回的密码套件信息采用 OpenSSL 格式。有关 OpenSSL 格式的密码套件示例,请参阅 www.openssl.org/docs/manmaster/apps/ciphers.html。 |
事件 |
|
参数 |
可选的布尔值 |
返回 |
包含 SSL/TLS 连接的密码信息的字符串值。设置 |
示例 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 连接的客户端证书。可选参数将筛选从客户端证书返回的字段。 |
事件 |
|
参数 |
在未指定参数或 avi.CLIENT_CERT 时,以 PEM 格式返回从客户端到虚拟服务的已建立 SSL 连接的客户端证书,除第一行外,每一行前面都附加制表符。
|
返回 |
最多 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。 |
事件 |
|
参数 |
无 |
返回 |
返回 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 配置文件更改为不同的配置文件。 |
事件 |
|
参数 |
SSL 参数的名称 |
返回 |
无 |
示例 |
if avi.ssl.server_name() == "legacy.example.com" then avi.ssl.set_ssl_profile("legacy_ssl_profile") end 如果 |
avi.ssl.set_ssl_certificate
函数 |
avi.ssl.set_ssl_certificate(<SSLKeyAndCertificate>) |
描述 |
此函数用于根据客户端 IP 地址、TLS 服务器名称等因素,将 SSL 密钥和证书更改为不同的对象。 |
事件 |
|
参数 |
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
函数 |
|
描述 |
此函数用于根据客户端 IP 地址、TLS 服务器名称、HTTP 主机或 URI 等因素,更改初始或重新协商的 TLS 会话的 PKI 配置文件。
DataScript 中的 PKI 配置优先于应用程序配置文件中的配置。 |
事件 |
|
参数 |
目前,在应用程序配置文件中,有两个控制项。一个控制项控制模式,另一个控制项控制 PKI 配置文件对象。 API 是一种具有配置文件名称(可选)和身份验证频率(可选)参数的模式(必需)。以下是支持的三种模式:
|
返回 |
无 |
示例 |
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 服务器名称为 |
由于 PKI 配置可以通过应用程序配置文件和 DataScript 完成,因此在执行期间,通过 DataScript 配置的 PKI 配置文件优先于通过应用程序配置文件进行的配置。
例如,如果将 PKI 配置文件配置为将证书标记为必需,但如果通过 DataScript 将特定服务器名称的 PKI 配置文件标记为禁用,则会覆盖应用程序配置文件配置。
avi.ssl.renegotiate
函数 |
|
描述 |
在根据客户端 IP、TLS 服务器名称、HTTP 主机或 URI 等因素,更改 PKI 配置文件、模式和频率后,可使用此函数重新协商与客户端的 TLS 连接。如果在重新协商 API 调用之前启用了客户端证书身份验证,则将 PKI 设置应用于 SSL 会话重新协商。HTTP 请求将被锁定,直至重新协商完成。 SSL 重新协商将在连接上禁用 SSL 会话恢复。
注:
如果在更改连接的 PKI 设置后使用重新协商,则用户的脚本必须处理客户端身份验证的结果。否则,TLS 连接的后续请求可能会失败。脚本可以选择清除错误或关闭连接。 |
事件 |
|
参数 |
无 |
返回 |
无 |
示例 |
要禁用客户端证书身份验证,请执行以下操作: 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
函数 |
|
描述 |
此函数可用于清除 TLS 连接上的 SSL 客户端证书验证错误。在内部,API 为 TLS 连接上的 |
事件 |
|
参数 |
无 |
返回 |
无值 |
示例 |
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
函数 |
|
描述 |
此 API 接受验证错误代码,并返回与该错误代码关联的错误字符串 |
事件 |
|
参数 |
一个整数参数作为 |
返回 |
此 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
函数 |
|
描述 |
此 DataScript 函数用于获取客户端证书身份验证模式 |
事件 |
|
参数 |
无 |
返回 |
此 DataScript 函数将返回以下值之一:
|
示例 |
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
函数 |
|
描述 |
此 DataScript 函数用于确定客户端证书验证是否已完成。 |
事件 |
|
参数 |
无 |
返回 |
此 DataScript 函数将返回以下值之一:
|
示例 |
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
函数 |
|
描述 |
此函数可用于清除 TLS 连接上的 SSL 客户端证书验证错误。在内部,API 为 TLS 连接上的 verify_result 设置“ |
事件 |
|
参数 |
无 |
返回 |
无值 |
示例 |
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
函数 |
|
描述 |
此 DataScript 函数用于记录客户端证书身份验证失败。该错误将作为重要日志添加到应用程序日志中。 例如,客户端证书验证失败:客户端 x509 证书验证失败。 |
事件 |
|
参数 |
无 |
返回 |
无 |
示例 |
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
函数 |
|
描述 |
此 API 用于清除 TLS 连接的 SSL 会话缓存条目。 |
事件 |
|
参数 |
无 |
返回 |
无 |
示例 |
if string.contains(avi.http.get_uri(), \"logout.html\") then avi.ssl.remove_session() end |
avi.ssl.get_client_cert_verify_mode
函数 |
|
事件 |
|
参数 |
无 |
返回 |
此 DataScript 函数将返回以下值之一:
|
示例 |
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
函数 |
|
描述 |
返回为客户端与虚拟服务之间的 SSL/TLS 连接协商的密码套件的长度。 |
参数 |
无 |
事件 |
|
示例 |
-- 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_PRECONNECT
和 SSL_CLIENTHELLO
不支持此 API。
datascript-avi-ssl-client-cert-verify-error
函数 |
|
描述 |
此 API 可用于获取客户端证书身份验证和 CRL 检查的结果。 |
参数 |
无 |
事件 |
|
返回 |
此 API 将返回两个值:
|
示例 |
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
函数 |
|
描述 |
以 PEM 格式返回建立的 SSL 连接的客户端证书。可选参数将筛选从客户端证书返回的字段。 |
事件 |
|
参数 |
如果无参数或指定 avi.CLIENT_CERT,将以 PEM 格式返回从客户端到虚拟服务的已建立 SSL 连接的客户端证书,除第一行外,每一行前面都附加制表符。
|
返回 |
最多 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_PRECONNECT
和 SSL_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_good
为 false
才有效。例如,值 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
。