高级策略表达式:解析SSL
有高级策略表达式来解析SSL证书和SSL客户端hello消息。
解析SSL证书
可以使用高级策略表达式计算X.509安全套接字层(SSL)客户端证书。客户端证书是可用于验证用户身份的电子文档。客户端证书至少包含版本信息、序列号、签名算法ID、颁发者名称、有效期、主题(用户)名称、公钥和签名。
您可以检查SSL连接和客户端证书中的数据。例如,您可能希望将使用低强度密码的SSL请求发送到特定的负载平衡虚拟服务器场。下面的命令是一个内容切换策略的例子,它解析请求中的密码强度,并匹配小于或等于40的密码强度:
添加cs策略p1 -rule "client.ssl.cipher_bits.le(40)"
作为另一个例子,您可以配置一个策略来确定请求是否包含客户端证书:
添加cs策略p2 -rule "client.ssl "。client_cert存在”
或者,您可以配置一个策略来检查客户端证书中的特定信息。例如,下面的策略验证证书在过期前有一天或多天:
添加cs策略p2 -rule "client.ssl "。Client_cert exists && client.ssl.client_cert.days_to_expire.ge(1)"
JA3指纹使用示例:
添加ssl策略ja3_pol -rule "CLIENT.SSL.JA3_FINGERPRINT.EQ(bb4c15a90e93a25ddc16274395bce4c6)"动作片重置
或者,一个JA3指纹使用patset的例子:
add policy patset pat1绑定策略patset pat1 bb4c15a90e93a25ddc16274395bce4c6 -index 1绑定策略patset pat1 cd3c15a90e93a25ddc16274395bce6b4 -index 2添加ssl策略ssl_ja3_pol -rule CLIENT.SSL.JA3_FINGERPRINT.contains_any(\"pat1\") -action reset
请注意
有关解析证书中的日期和时间的信息,请参见表达式中日期和时间的格式和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的,则返回一个Boolean TRUE。 |
CLIENT.SSL.JA3_FINGERPRINT | 如果配置的JA3指纹与客户端hello消息中的JA3指纹匹配,则返回一个Boolean 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.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证书操作 | 描述 |
---|---|
> <证书。存在 |
如果客户端有SSL证书,则返回Boolean 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= bangalore //o=mycompany/ou=sales/ /emailAddress=myuserid@mycompany.com 。下面的重写操作根据前面的发行者定义返回6的计数:Sh重写动作insert_ssl_header 名称:insert_ssl 操作方法:insert_http_header目标:证书颁发者 价值:CLIENT.SSL.CLIENT_CERT.ISSUER.COUNT 。但如果修改为如下形式,则返回9:CLIENT.SSL.CLIENT_CERT.ISSUER.IGNORE_EMPTY_ELEMENTS.COUNT |
> <证书。SERIALNUMBER |
以不带前导零的大写十六进制字符串形式返回证书的序列号。例如,证书序列号为04daa1e44bd2e7769638a0058b4964bd,则下面的表达式可以帮助匹配证书序列号CLIENT.SSL.CLIENT_CERT.SERIALNUMBER.SET_TEXT_MODE (IGNORECASE) .CONTAINS(\“4 daa1e44bd2e7769638a0058b4964bd \”) |
解析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消息的server name扩展名中接收到的服务器名。 |
CLIENT.SSL.CLIENT_HELLO.ALPN.HAS_NEXTPROTOCOL | 如果在客户端hello消息中接收到的ALPN扩展中的应用程序协议与表达式中提供的协议匹配,则返回true。 |
这些表达式可以在clienthelo_req绑定点使用。有关更多信息,请参见SSL策略绑定。