ADC

Expresiones de directiva avanzadas: análisis de certificados SSL

Existen expresiones de directivas avanzadas para analizar los certificados SSL y los mensajes de saludo del cliente SSL.

Analizar certificados SSL

Puede utilizar expresiones de directivas avanzadas para evaluar los certificados de cliente de Secure Sockets Layer (SSL) X.509. Un certificado de cliente es un documento electrónico que se puede utilizar para autenticar la identidad de un usuario. Un certificado de cliente contiene (como mínimo) información de versión, un número de serie, un identificador de algoritmo de firma, un nombre de emisor, un período de validez, un nombre de sujeto (usuario), una clave pública y firmas.

Puede examinar tanto las conexiones SSL como los datos en los certificados de cliente. Por ejemplo, es posible que quiera enviar solicitudes SSL que usen cifrados de baja intensidad a una comunidad de servidores virtuales de equilibrio de carga en particular. El siguiente comando es un ejemplo de una directiva de Content Switching que analiza la fuerza de cifrado en una solicitud y hace coincidir las fortalezas de cifrado que son menores o iguales a 40:

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

Como otro ejemplo, puede configurar una directiva que determine si una solicitud contiene un certificado de cliente:

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

O bien, puede configurar una directiva que examine información concreta en un certificado de cliente. Por ejemplo, la siguiente directiva verifica que el certificado tenga uno o más días antes del vencimiento:

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

Un ejemplo del uso de la huella dactilar JA3:

add ssl policy ja3_pol -rule "CLIENT.SSL.JA3_FINGERPRINT.EQ(bb4c15a90e93a25ddc16274395bce4c6)" -action reset

O bien un ejemplo del uso de la huella dactilar JA3 con patset:

add policy patset pat1
bind policy patset pat1 bb4c15a90e93a25ddc16274395bce4c6 -index 1
bind policy patset pat1 cd3c15a90e93a25ddc16274395bce6b4 -index 2
add ssl policy ssl_ja3_pol -rule CLIENT.SSL.JA3_FINGERPRINT.contains_any("pat1") -action reset
<!--NeedCopy-->

Nota

Para obtener información sobre el análisis de fechas y horas de un certificado, consulte Formato de fechas y horas de una expresión y expresiones para fechas de certificado SSL.

Prefijos para datos SSL y certificados basados en texto

En la siguiente tabla se describen los prefijos de expresión que identifican los elementos basados en texto en las transacciones SSL y los certificados de cliente.

Tabla 1. Prefijos que devuelven texto o valores booleanos para datos de certificados de cliente y SSL

Prefijo Descripción
CLIENT.SSL.CLIENT_CERT Devuelve el certificado de cliente SSL en la transacción SSL actual.
CLIENT.SSL.CLIENT_CERT.TO_PEM Devuelve el certificado de cliente SSL en formato binario.
CLIENT.SSL.CIPHER_EXPORTABLE Devuelve un valor booleano TRUE si el cifrado criptográfico SSL es exportable.
CLIENT.SSL.CIPHER_NAME Devuelve el nombre del cifrado SSL si se invoca desde una conexión SSL y una cadena NULL si se invoca desde una conexión no SSL.
CLIENT.SSL.IS_SSL Devuelve un valor booleano TRUE si la conexión actual se basa en SSL.
CLIENT.SSL.JA3_FINGERPRINT Devuelve un valor booleano TRUE si la huella digital JA3 configurada coincide con la huella digital JA3 en el mensaje de saludo del cliente. Nota: Esta expresión está disponible en la versión 13.1 compilación 12.x y posteriores.

Prefijos para datos numéricos en certificados SSL

En la tabla siguiente se describen los prefijos que evalúan datos numéricos distintos de las fechas de los certificados SSL. Estos prefijos se pueden utilizar con las operaciones que se describen en Operaciones básicas sobre prefijos de expresión y Operaciones compuestas para números.

Tabla 2. Prefijos que evalúan los datos numéricos distintos de las fechas en los certificados SSL

Prefijo Descripción
CLIENT.SSL.CLIENT_CERT.DAYS_TO_EXPIRE Devuelve el número de días en que el certificado es válido o devuelve -1 para certificados caducados.
CLIENT.SSL.CLIENT_CERT.PK_SIZE Devuelve el tamaño de la clave pública utilizada en el certificado.
CLIENT.SSL.CLIENT_CERT.VERSION Devuelve el número de versión del certificado. Si la conexión no se basa en SSL, devuelve cero (0).
CLIENT.SSL.CIPHER_BITS Devuelve el número de bits de la clave criptográfica. Devuelve 0 si la conexión no se basa en SSL.
CLIENT.SSL.VERSION Devuelve un número que representa la versión del protocolo SSL, de la siguiente manera: 0. La transacción no está basada en SSL: 0x002. La transacción es SSLv2: 0x300. La transacción es SSLv3: 0x301. La transacción es TLSv1: 0x302. La transacción es TLS 1.1: 0x303. La transacción es TLS 1.2: 0x304. La transacción es TLS 1.3.

Nota

Para ver las expresiones relacionadas con las fechas de caducidad de un certificado, consulte Expresiones para fechas de certificado SSL.

Expresiones para certificados SSL

Puede analizar certificados SSL configurando expresiones que usen el siguiente prefijo:

CLIENT.SSL.CLIENT_CERT

En esta sección se describen las expresiones que puede configurar para certificados, excepto las que examinan la caducidad del certificado. Las operaciones basadas en tiempo se describen en Expresiones de directivas avanzadas: trabajo con fechas, horas y números.

En la siguiente tabla se describen las operaciones que puede especificar para el prefijo CLIENT.SSL.CLIENT_CERT.

Tabla 3. Operaciones que se pueden especificar con el prefijo CLIENT.SSL.CLIENT_CERT

Operación de certificado SSL Descripción
<certificate>.EXISTS Devuelve un valor booleano TRUE si el cliente tiene un certificado SSL.
<certificate>.ISSUER Devuelve el nombre distintivo (DN) del emisor en el certificado como una lista de nombre-valor. Un signo igual (“=”) es el delimitador del nombre y el valor, y la barra (“/”) es el delimitador que separa los pares nombre-valor. A continuación se muestra un ejemplo del DN devuelto: /C=US/O=myCompany/OU=www.mycompany.com/CN=www.mycompany.com/emailAddress=myuserid@mycompany.com
<certificate>.ISSUER. IGNORE_EMPTY_ELEMENTS Devuelve el emisor e ignora los elementos vacíos en una lista de nombre-valor. Por ejemplo, considere lo siguiente: Cert-Issuer: /c=in/st=kar//l=bangelore //o=mycompany/ou=sales/ /emailAddress=myuserid@mycompany.com. La siguiente acción Reescritura devuelve un recuento de 6 basado en la definición de emisor anterior: sh rewrite action insert_ssl_header Name: insert_ssl Operation: insert_http_header Target:Cert-Issuer Value:CLIENT.SSL.CLIENT_CERT.ISSUER.COUNT. Sin embargo, si cambia el valor al siguiente, el recuento devuelto es 9: CLIENT.SSL.CLIENT_CERT.ISSUER.IGNORE_EMPTY_ELEMENTS.COUNT
<certificate>. SERIALNUMBER Devuelve el número de serie del certificado como una cadena hexadecimal en mayúsculas sin ceros a la izquierda. Por ejemplo, si el número de serie del certificado es 04daa1e44bd2e7769638a0058b4964bd, la siguiente expresión ayuda a hacer coincidir el número de serie CLIENT.SSL.CLIENT_CERT.SERIALNUMBER.SET_TEXT_MODE(IGNORECASE).CONTAINS(\"4daa1e44bd2e7769638a0058b4964bd\")
  • <certificate>.extensions.has_object
Devuelve el valor booleano TRUE si el certificado del cliente tiene la extensión con un OID coincidente. Por ejemplo, si el certificado de cliente tiene la extensión con el OID 2.16.756.5.4.2.1.2.13.2.7, la expresión client.ssl.client_cert.extensions.has_object (2.16.756.5.4.2.1.2.13.2.7) devuelve TRUE.
  • <certificate>.extensions.object(OID).has_value(value)

Devuelve el valor booleano TRUE si el certificado de cliente tiene la extensión con un OID y un valor coincidentes. Por ejemplo, si el certificado de cliente tiene la extensión con el OID 2.16.756.5.4.2.1.2.13.2.7 y un valor XB, la expresión client.ssl.client_cert.extensions.object(“2.16.756.5.4.2.1.2.13.2.7”).has_value(“XB”) devuelve TRUE.
Notas
  • Si una extensión con un OID especificado tiene un valor de tipo distinto de IA5 o entero, la evaluación de la directiva generaría un evento indefinido (UNDEF).
  • <certificate>.extensions.count Número de extensiones recibidas en el certificado de cliente. Por ejemplo, si el número de extensiones del certificado de cliente es 16, expression client.ssl.client_cert.extensions.count.eq(16) devuelve TRUE

    Nota:

    Puede usar un nombre corto conocido en lugar de OID para las extensiones estándar. Por ejemplo, la extensión de comentarios de Netscape tiene el OID 2.16.840.1.113730.1.13 y el nombre abreviado nsComment. Se puede usar nsComment en la extensión en lugar de 2.16.840.1.113730.1.13

    ```

    • client.ssl.client_cert.extensions.has_object(nscomment).
    • client.ssl.client_cert.extensions.object(“nscomment”).has_value(“OpenSSL Generated Client Certificate”).

    ```

    Parse SSL client hello

    Puede analizar el mensaje de saludo del cliente SSL configurando expresiones que usen el siguiente prefijo:

    Prefijo Descripción
    CLIENT.SSL.CLIENT_HELLO.CIPHERS.HAS_HEXCODE Hace coincidir el código hexadecimal proporcionado en la expresión con los códigos hexadecimales de los conjuntos de cifrado recibidos en el mensaje de saludo del cliente.
    CLIENT.SSL.CLIENT_HELLO.CLIENT_VERSION Versión recibida en el encabezado del mensaje de saludo del cliente.
    CLIENT.SSL.CLIENT_HELLO.IS_RENEGOTIATE Devuelve true si un cliente o un servidor inicia la renegociación de la sesión.
    CLIENT.SSL.CLIENT_HELLO.IS_REUSE Devuelve true si el dispositivo reutiliza la sesión SSL en función del ID de sesión distinto de cero recibido en el mensaje de saludo del cliente.
    CLIENT.SSL.CLIENT_HELLO.IS_SCSV Devuelve true si la capacidad Signaling Cipher Suite Value (SCSV) se anuncia en el mensaje de saludo del cliente. El código hexadecimal para el SCSV de reserva es 0x5600.
    CLIENT.SSL.CLIENT_HELLO.IS_SESSION_TICKET Devuelve true si la extensión del tíquet de sesión con una longitud distinta de cero se anuncia en el mensaje de saludo del cliente.
    CLIENT.SSL.CLIENT_HELLO.LENGTH Longitud recibida en el encabezado del mensaje de saludo del cliente.
    CLIENT.SSL.CLIENT_HELLO.SNI Devuelve el nombre del servidor recibido en la extensión del nombre del servidor del mensaje de saludo del cliente.
    CLIENT.SSL.CLIENT_HELLO.ALPN.HAS_NEXTPROTOCOL Devuelve true si el protocolo de aplicación en la extensión ALPN recibido en el mensaje de saludo del cliente coincide con el protocolo proporcionado en la expresión.

    Estas expresiones se pueden utilizar en el punto de enlace CLIENTHELLO_REQ. Para obtener más información, consulte Vinculación de directivas SSL.

    Expresiones de directiva avanzadas: análisis de certificados SSL