ADC

Expressions de politique avancées : analyse des certificats SSL

Il existe des expressions de stratégie avancées pour analyser les certificats SSL et les messages Hello du client SSL.

Analyse des certificats SSL

Vous pouvez utiliser des expressions de stratégie avancées pour évaluer les certificats clients SSL (Secure Sockets Layer) X.509. Un certificat client est un document électronique qui peut être utilisé pour authentifier l’identité d’un utilisateur. Un certificat client contient (au minimum) des informations de version, un numéro de série, un identifiant d’algorithme de signature, un nom d’émetteur, une période de validité, un nom de sujet (utilisateur), une clé publique et des signatures.

Vous pouvez examiner à la fois les connexions SSL et les données des certificats clients. Par exemple, vous pouvez envoyer des demandes SSL qui utilisent des chiffrements de faible puissance à une batterie de serveurs virtuels d’équilibrage de charge particulière. La commande suivante est un exemple de stratégie de commutation de contenu qui analyse la force de chiffrement dans une demande et fait correspondre des forces de chiffrement inférieures ou égales à 40 :

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

Dans un autre exemple, vous pouvez configurer une stratégie qui détermine si une demande contient un certificat client :

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

Vous pouvez également configurer une stratégie qui examine des informations spécifiques d’un certificat client. Par exemple, la stratégie suivante vérifie que le certificat a un ou plusieurs jours avant son expiration :

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

Exemple d’utilisation des empreintes digitales JA3 :

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

Ou, un exemple d’utilisation des empreintes digitales JA3 avec 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-->

Remarque

Pour plus d’informations sur l’analyse des dates et des heures dans un certificat, voir Format des dates et heures dans une expression et des expressions pour les dates de certificat SSL.

Préfixes pour les données SSL et de certificat basées sur le texte

Le tableau suivant décrit les préfixes d’expression qui identifient les éléments textuels dans les transactions SSL et les certificats clients.

Tableau 1 Préfixes qui renvoient du texte ou des valeurs booléennes pour les données de certificat SSL et client

Préfixe Description
CLIENT.SSL.CLIENT_CERT Renvoie le certificat client SSL dans la transaction SSL en cours.
CLIENT.SSL.CLIENT_CERT.TO_PEM Renvoie le certificat client SSL au format binaire.
CLIENT.SSL.CIPHER_EXPORTABLE Renvoie une valeur booléenne TRUE si le chiffrement cryptographique SSL est exportable.
CLIENT.SSL.CIPHER_NAME Renvoie le nom du chiffrement SSL s’il est invoqué à partir d’une connexion SSL, et une chaîne NULL s’il est invoqué à partir d’une connexion non SSL.
CLIENT.SSL.IS_SSL Renvoie une valeur booléenne TRUE si la connexion en cours est basée sur SSL.
CLIENT.SSL.JA3_FINGERPRINT Renvoie une valeur booléenne TRUE si l’empreinte digitale JA3 configurée correspond à l’empreinte digitale JA3 dans le message Hello du client. Remarque : Cette expression est disponible dans les versions 13.1 build 12.x et ultérieures.

Préfixes pour les données numériques dans les certificats SSL

Le tableau suivant décrit les préfixes qui évaluent des données numériques autres que les dates dans les certificats SSL. Ces préfixes peuvent être utilisés avec les opérations décrites dans Opérations de base sur les préfixes d’expression et Opérations composées pour les nombres.

Tableau 2. Préfixes qui évaluent les données numériques autres que les dates dans les certificats SSL

Préfixe Description
CLIENT.SSL.CLIENT_CERT.DAYS_TO_EXPIRE Renvoie le nombre de jours pendant lesquels le certificat est valide ou renvoie -1 pour les certificats expirés.
CLIENT.SSL.CLIENT_CERT.PK_SIZE Renvoie la taille de la clé publique utilisée dans le certificat.
CLIENT.SSL.CLIENT_CERT.VERSION Renvoie le numéro de version du certificat. Si la connexion n’est pas basée sur SSL, renvoie zéro (0).
CLIENT.SSL.CIPHER_BITS Renvoie le nombre de bits de la clé cryptographique. Renvoie 0 si la connexion n’est pas basée sur SSL.
CLIENT.SSL.VERSION Renvoie un nombre qui représente la version du protocole SSL, comme suit : 0. La transaction n’est pas basée sur SSL : 0x002. La transaction est SSLv2 : 0x300. La transaction est SSLv3 : 0x301. La transaction est TLSv1 : 0x302. La transaction est TLS 1.1 : 0x303. La transaction est TLS 1.2 : 0x304. La transaction est TLS 1.3.

Remarque

Pour les expressions liées aux dates d’expiration d’un certificat, voir Expressions pour les dates de certificat SSL.

Expressions pour les certificats SSL

Vous pouvez analyser les certificats SSL en configurant des expressions qui utilisent le préfixe suivant :

CLIENT.SSL.CLIENT_CERT

Cette section décrit les expressions que vous pouvez configurer pour les certificats, à l’exception des expressions qui examinent l’expiration du certificat. Les opérations temporelles sont décrites dans Expressions de stratégie avancées : utilisation des dates, des heures et des nombres.

Le tableau suivant décrit les opérations que vous pouvez spécifier pour le préfixe CLIENT.SSL.CLIENT_CERT.

Tableau 3. Opérations pouvant être spécifiées avec le préfixe CLIENT.SSL.CLIENT_CERT

Opération du certificat SSL Description
<certificate>.EXISTS Renvoie une valeur booléenne TRUE si le client possède un certificat SSL.
<certificate>.ISSUER Renvoie le nom distinctif (DN) de l’émetteur dans le certificat sous forme de liste nom-valeur. Un signe égal (« = ») est le délimiteur du nom et de la valeur, et la barre oblique («/») est le délimiteur qui sépare les paires nom-valeur. Voici un exemple du DN renvoyé : /C=US/O=myCompany/OU=www.mycompany.com/CN=www.mycompany.com/emailAddress=myuserid@mycompany.com
<certificate>.ISSUER. IGNORE_EMPTY_ELEMENTS Renvoie l’émetteur et ignore les éléments vides d’une liste nom-valeur. Par exemple, considérez ce qui suit : Cert-Issuer: /c=in/st=kar//l=bangelore //o=mycompany/ou=sales/ /emailAddress=myuserid@mycompany.com. L’action Réécriture suivante renvoie un nombre de 6 en fonction de la définition précédente de l’émetteur : sh rewrite action insert_ssl_header Name: insert_ssl Operation: insert_http_header Target:Cert-Issuer Value:CLIENT.SSL.CLIENT_CERT.ISSUER.COUNT. Toutefois, si vous modifiez la valeur suivante, le nombre retourné est 9 :CLIENT.SSL.CLIENT_CERT.ISSUER.IGNORE_EMPTY_ELEMENTS.COUNT
<certificate>. SERIALNUMBER Renvoie le numéro de série du certificat sous la forme d’une chaîne hexadécimale en majuscule, sans zéro en début de chaîne. Par exemple, si le numéro de série du certificat est 04daa1e44bd2e7769638a0058b4964bd, l’expression suivante permet de faire correspondre le numéro de série CLIENT.SSL.CLIENT_CERT.SERIALNUMBER.SET_TEXT_MODE(IGNORECASE).CONTAINS(\"4daa1e44bd2e7769638a0058b4964bd\")
  • <certificate>.extensions.has_object
Renvoie la valeur booléenne TRUE si le certificat client possède l’extension avec un OID correspondant. Par exemple, si le certificat client possède l’extension avec l’OID 2.16.756.5.4.2.1.2.13.2.7, l’expression client.ssl.client_cert.extensions.has_object (2.16.756.5.4.2.1.2.13.2.7) renvoie TRUE.
  • <certificate>.extensions.object(OID).has_value(value)

Renvoie la valeur booléenne TRUE si le certificat client possède l’extension avec un OID et une valeur correspondants. Par exemple, si le certificat client possède l’extension avec l’OID 2.16.756.5.4.2.1.2.13.2.7 et une valeur XB, l’expression client.ssl.client_cert.extensions.object(“2.16.756.5.4.2.1.2.13.2.7”).has_value(“XB”) renvoie TRUE.
Remarques 
  • Si une extension avec un OID spécifié possède une valeur de type autre que IA5 ou entier, l’évaluation de la stratégie entraînerait un événement non défini (UNDEF).
  • <certificate>.extensions.count Nombre d’extensions reçues dans le certificat client. Par exemple, si le nombre d’extensions dans le certificat client est de 16, expression client.ssl.client_cert.extensions.count.eq(16) renvoie TRUE.

    Remarque :

    Vous pouvez utiliser un nom court connu au lieu de l’OID pour les extensions standard. Par exemple, l’extension de commentaire Netscape possède l’OID 2.16.840.1.113730.1.13 et le nom court nsComment. Vous pouvez utiliser nsComment dans l’extension au lieu 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”).

    ```

    Bonjour du client Parse SSL

    Vous pouvez analyser le message Hello du client SSL en configurant des expressions qui utilisent le préfixe suivant :

    Préfixe Description
    CLIENT.SSL.CLIENT_HELLO.CIPHERS.HAS_HEXCODE Correspond au code hexadécimal fourni dans l’expression avec les codes hexadécimaux des suites de chiffrement reçues dans le message Hello du client.
    CLIENT.SSL.CLIENT_HELLO.CLIENT_VERSION Version reçue dans l’en-tête du message Hello du client.
    CLIENT.SSL.CLIENT_HELLO.IS_RENEGOTIATE Renvoie la valeur true si un client ou un serveur lance une renégociation de session.
    CLIENT.SSL.CLIENT_HELLO.IS_REUSE Renvoie true si l’appliance réutilise la session SSL en fonction de l’ID de session différent de zéro reçu dans le message client-Hello.
    CLIENT.SSL.CLIENT_HELLO.IS_SCSV Renvoie true si la capacité SCSV (Signaling Cipher Suite Value) est annoncée dans le message Hello du client. Le code hexadécimal pour SCSV de secours est 0x5600.
    CLIENT.SSL.CLIENT_HELLO.IS_SESSION_TICKET Renvoie la valeur true si une extension de ticket de session dont la longueur est différente de zéro est annoncée dans le message client-hello.
    CLIENT.SSL.CLIENT_HELLO.LENGTH Longueur reçue dans l’en-tête du message Hello du client.
    CLIENT.SSL.CLIENT_HELLO.SNI Renvoie le nom du serveur reçu dans l’extension Nom du serveur du message Hello du client.
    CLIENT.SSL.CLIENT_HELLO.ALPN.HAS_NEXTPROTOCOL Renvoie true si le protocole d’application de l’extension ALPN reçu dans le message Hello du client correspond au protocole fourni dans l’expression.

    Ces expressions peuvent être utilisées au niveau du point de liaison CLIENTHELLO_REQ. Pour plus d’informations, voir Liaison de stratégie SSL.

    Expressions de politique avancées : analyse des certificats SSL