Citrix ADC

高级策略表达式:解析 SSL

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

解析 SSL 证书

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

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

add cs policy p1 -rule "client.ssl.cipher_bits.le(40)"

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

add cs policy p2 -rule "client.ssl.client_cert exists"

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

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

注意

有关解析证书中的日期和时间的信息,请参阅表达式中的日期和时间格式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名称: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