ADC

高级策略表达式:解析 SSL

有用于解析 SSL 证书和 SSL 客户端 Hello 消息的高级策略表达式。

解析 SSL 证书

您可以使用高级策略表达式评估 X.509 安全套接字层 (SSL) 客户端证书。客户端证书是可用于验证用户身份的电子文档。客户端证书包含(至少)版本信息、序列号、签名算法 ID、颁发者名称、有效期、使用者(用户)名称、公钥和签名。

您可以检查 SSL 连接和客户端证书中的数据。例如,您可能希望将使用低强度密码的 SSL 请求发送到特定负载平衡虚拟服务器场。以下命令是内容切换策略的示例,该策略分析请求中的密码强度并匹配小于或等于 40 的密码强度:

add cs policy p1 -rule "client.ssl.cipher_bits.le(40)"
<!--NeedCopy-->

作为另一个示例,您可以配置确定请求是否包含客户端证书的策略:

add cs policy p2 -rule "client.ssl.client_cert exists"
<!--NeedCopy-->

或者,您可以配置用于检查客户端证书中的特定信息的策略。例如,以下策略验证证书在到期前是否有一天或多天:

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

注意

有关解析证书中的日期和时间的信息,请参阅表达 式中的日期和时间格式和 SSL 证书日期的表达式。

基于文本的 SSL 和证书数据的前缀

下表描述了用于标识 SSL 事务和客户端证书中基于文本的项目的表达式前缀。

表 1. 返回 SSL 和客户端证书数据的文本或布尔值的前缀

前缀 说明
CLIENT.SSL.CLIENT_CERT 返回当前 SSL 事务中的 SSL 客户端证书。
CLIENT.SSL.CLIENT_CERT.TO_PEM 以二进制格式返回 SSL 客户端证书。
CLIENT.SSL.CIPHER_EXPORTABLE 如果 SSL 加密 SSL 加密密码可导出,则返回布尔值 TRUE。
CLIENT.SSL.CIPHER_NAME 如果从 SSL 连接调用,则返回 SSL 密码的名称;如果从非 SSL 连接调用,则返回 NULL 字符串。
CLIENT.SSL.IS_SSL 如果当前连接是基于 SSL 的,则返回布尔值 TRUE。

SSL 证书中数字数据的前缀

下表描述了用于评估 SSL 证书中日期以外的数字数据的前缀。这些前缀可以与 表达式前缀的基本操作和数字的复合运算中描述的操作一起使用

表 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 返回颁发者并忽略名称-值列表中的空元素。例如,请考虑以下内容:Cert-Issuer: /c=in/st=kar//l=bangelore //o=mycompany/ou=sales/ /emailAddress=myuserid@mycompany.com。根据前面的颁发者定义,以下重写操作返回 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

解析 SSL 客户端您好

您可以通过配置使用以下前缀的表达式来解析 SSL 客户端 hello 消息:

前缀 说明
CLIENT.SSL.CLIENT_HELLO.CIPHERS.HAS_HEXCODE 将表达式中提供的十六进制代码与客户端 hello 消息中收到的密码套件的十六进制代码匹配。
CLIENT.SSL.CLIENT_HELLO.CLIENT_VERSION 在客户端 Hello 消息标头中收到的版本。
CLIENT.SSL.CLIENT_HELLO.IS_RENEGOTIATE 如果客户端或服务器启动会话重新协商,则返回 true。
CLIENT.SSL.CLIENT_HELLO.IS_REUSE 如果设备根据客户端-hello 消息中收到的非零会话 ID 重复使用 SSL 会话,则返回 true。
CLIENT.SSL.CLIENT_HELLO.IS_SCSV 如果信令密码套件值 (SCSV) 功能在客户端 Hello 消息中公布,则返回 true。后备 SCSV 的十六进制代码是 0x5600。
CLIENT.SSL.CLIENT_HELLO.IS_SESSION_TICKET 如果 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