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)"
<!--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 加密密码可导出,则返回布尔值 TRUE。
CLIENT.SSL.CIPHER_NAME 如果从 SSL 连接调用,则返回 SSL 密码的名称;如果从非 SSL 连接调用,则返回 NULL 字符串。
CLIENT.SSL.IS_SSL 如果当前连接是基于 SSL 的,则返回布尔值 TRUE。
CLIENT.SSL.JA3_FINGERPRINT 如果配置的 JA3 指纹与客户端 hello 消息中的 JA3 指纹匹配,则返回布尔值 TRUE。注意: 此表达式在 13.1 版本 build 12.x 及更高版本中可用。

SSL 证书中数字数据的前缀

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

表 2. 用于评估 SSL 证书中除日期之外的数字数据的前缀

前缀 说明
CLIENT.SSL.CLIENT_CERT.DAYS_TO_EXPIRE 返回证书的有效天数;对于过期的证书,返回 -1。
CLIENT.SSL.CLIENT_CERT.PK_SIZE 返回证书中使用的公钥的大小。
CLIENT.SSL.CLIENT_CERT.VERS 返回证书的版本号。如果连接不是基于 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 返回 Issuer 并忽略名称值列表中的空元素。例如,请考虑以下几点: 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 如果在客户端 hello 消息中通告信令密码套件值 (SCSV) 功能,则返回 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