引入了 SSL DataScript 事件和 API,以将 SSL 握手级别事件添加到读取或写入参数,以控制 SSL 握手并更改 SSL 配置文件、证书、PKI 设置、重新协商等属性。

通过此功能,对于特定的客户端 IP 地址或端口,您可以:

  • 更改 SSL 握手属性,如限制 TLS 协议版本和/或密码以及其他配置参数。

  • 更改用于 TLS 连接的模式或 CA 证书等 PKI 设置。

  • 更改连接的服务器证书。

  • 读取和/或忽略特定错误的双向客户端身份验证。

  • 根据使用重新协商请求的 URI 触发客户端身份验证。

SSL 握手事件允许编写特定于事件的 DataScript 以控制 SSL 握手流,例如更改 SSL 配置文件设置、服务器证书和其他操作,如基于 IP/URI 的客户端身份验证、SSL 标头插入等。

SSL 握手流

以下关键事件有助于通过 SSL DataScript API 自定义 SSL 握手流。API 仅特定于相应的事件:

事件

描述

SSL_PRE_CONNECT

此事件在 TLS 握手开始时触发。此事件可用于根据客户端 IP 或 VS 服务端口来更改 SSL 设置,如 SSL 配置文件、SSL 密钥和证书以及 PKI 配置文件等。

SSL_CLIENT_HELLO

此事件在完成客户端 Hello 预处理后触发。此事件用于根据客户端 IP 或 VS 服务端口来更改 SSL 设置,如 SSL 配置文件、SSLKeyandCertificate 和 PKI 配置文件等。

SSL_HANDSHAKE_DONE

此事件在 TLS 握手完成后触发。此事件可用于获取客户端证书身份验证错误和日志记录。

流中的虚拟服务 DataScript 事件如下所示:

  • VS_DATASCRIPT_EVT_CLIENT_SSL_PRE_CONNECT

  • VS_DATASCRIPT_EVT_CLIENT_SSL_CLIENT_HELLO

  • VS_DATASCRIPT_EVT_SSL_HANDSHAKE_DONE



引入了以下 DataScript API,将在上面列出的事件中执行:

API

描述

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.clear_client_cert_verify_error()

此 API 用于获取客户端证书身份验证和 CRL 检查的结果。

avi.ssl.renegotiate()

根据客户端 IP、TLS 服务器名称、HTTP 主机或 URI 等因素,在更改 PKI 配置文件、模式和频率后,使用此 API 重新协商与客户端的 TLS 连接。

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 会话缓存条目。

注意事项

  • 仅 L7 虚拟服务支持这些事件和 API。

  • 增强虚拟托管 (Enhanced Virtual Hosting, EVH) 子项不支持 SSL 事件。

  • FIPS 不支持 SSL 客户端 Hello 事件

  • 以下连接不支持 Avi.ssl.renegotiate():

    • TLS1.3 连接

    • HTTP/2.0

如果执行该 API,TLS 或 HTTP/2.0 连接将失败。