Citrix ADC

高级策略表达式:解析SSL

有高级策略表达式来解析SSL证书和SSL客户端hello消息。

解析SSL证书

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

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

添加cs策略p1 -rule "client.ssl.cipher_bits.le(40)"< !——NeedCopy >

再例如,您可以配置一个策略来确定请求是否包含客户端证书:

添加cs策略p2 -rule "client.ssl "。Client_cert exists" 

或者,您可以配置一个策略来检查客户端证书中的特定信息。例如,以下策略验证证书离过期还有一天或多天:

添加cs策略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(0)。
CLIENT.SSL.CIPHER_BITS 返回加密密钥中的位数。如果连接不是基于ssl的,则返回0。
CLIENT.SSL.VERSION 返回一个代表SSL协议版本的数字,如下所示:0。该事务不是基于ssl的。0 x002。事务是SSLv2的。0×。事务是SSLv3。0 x301。事务是TLSv1。0 x302。该事务是TLS 1.1。 0x303. The transaction is TLS 1.2; 0x304. The transaction is TLS 1.3.

请注意

有关证书中与到期日期相关的表达式,请参见SSL证书日期表达式

SSL证书表达式

您可以通过配置使用以下前缀的表达式来解析SSL证书:

CLIENT.SSL.CLIENT_CERT

本节讨论可以为证书配置的表达式,但检查证书过期的表达式除外。基于时间的操作在高级策略表达式:处理日期、时间和数字

下表描述了可以为CLIENT.SSL指定的操作。CLIENT_CERT前缀。

表3。可以使用CLIENT.SSL指定的操作。CLIENT_CERT前缀

SSL证书操作 描述
> <证书。存在 如果客户端拥有SSL证书,则返回一个布尔值TRUE。
> <证书。发行人 以名称-值列表的形式返回证书中颁发者的专有名称(DN)。等号(" = ")是名称和值的分隔符,斜杠(" / ")是分隔名称-值对的分隔符。返回的DN示例如下:美国/ O / C = = myCompany / OU = www.mycompany.com/CN = www.mycompany.com/emailAddress = myuserid@mycompany.com
<证书> .ISSUER。IGNORE_EMPTY_ELEMENTS 返回发行者并忽略名称-值列表中的空元素。例如:Cert-Issuer: /c=in/st=kar//l=bangelore //o=mycompany/ou=sales/ /emailAddress=myuserid@mycompany.com。下面的重写操作根据前面的发行者定义返回一个6的计数:Sh重写动作insert_ssl_header名称:insert_ssl操作:insert_http_header目标:Cert-Issuer价值:CLIENT.SSL.CLIENT_CERT.ISSUER.COUNT。但是,如果将该值更改为以下内容,则返回的计数为9:CLIENT.SSL.CLIENT_CERT.ISSUER.IGNORE_EMPTY_ELEMENTS.COUNT

解析SSL客户端hello

您可以通过配置使用以下前缀的表达式来解析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 如果设备基于在client-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