Lerm-IT

Blog traitant de technologies informatiques. Logiciel libre, AdminSys, DevOps et GNU/Linux !

21 Apr 2020

[OpenSSL] Tester la compatibilité d'une version de TLS

Avec l'évolution du protocole TLS il est fréquent de devoir vérifier si notre serveur web propose le chiffrement en TLS1.2 ou TLS1.3 par exemple. De même pour que nos scripts fonctionnent correctement il nous faut aussi vérifier que notre librairie OpenSSL est compatible, en tant que client, avec ces versions de protocoles. Nous allons voir ici comment tester ceci.

Tester si ma version d’OpenSSL supporte une version spécifique de TLS

Avant toutes choses, nous devons nous assurer que notre installation supporte la version du protocole cible. Nous prendrons comme exemple principale ici le TLS en version 1.3 mais ceci s’applique aussi aux autres versions du protocole.

Nous allons pour cela utiliser la commande suivante

$ openssl ciphers -v| awk '{ print $2 }'|sort|uniq
SSLv3
TLSv1
TLSv1.2
TLSv1.3

Cette commande nous permet de lister la liste des chiffrements supportés par OpenSSL ( Cipher en anglais). Nous appliquons sur le résultat un filtre pour n’afficher que la liste des protocoles SSL/TLS.

Nous constatons donc ici que notre installation d’OpenSSL est compatible avec TLSv1.2 et TLSv1.3 en tant que client. Ces deux versions sont celles qui sont recommandées au moment de la rédaction de cet article (Avril 2020).

Tester si votre serveur distant supporte une version de TLS

Notre client étant compatible nous allons tester nos serveurs web maintenant. Pour cela nous allons utiliser la méthode s_connect de OpenSSL. Celle-ci permet d’ouvrir une connexion TCP/IP portée par un tunnel SSL/TLS.

Ainsi si vous souhaitez tester que votre serveur distant supporte le protocole TLS en version 1.3 nous pouvons faire le test avec la commande suivante.

$ echo "Q"  | openssl s_client -connect google.com:443 -brief -tls1_3
CONNECTION ESTABLISHED
Protocol version: TLSv1.3
...
DONE

Ici nous réalisons une connexion sur l’IP résolut par le nom DNS google.com sur le port 443 (port par défaut pour l’HTTPS). Nous spécifions avec l’option -tls1_3 que cette connexion doit être réalisée avec le protocole TLS en version 1.3 et que nous ne souhaitons qu’un affichage court via l’argument -brief.

Si d’aventure la connexion TLS avec la version du protocole spécifié n'était pas possible vous auriez un message d’erreur comme ceci

$ echo "Q"  | openssl s_client  -connect site.fr:443 -brief -tls1_3
140058220811392:error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:../ssl/record/rec_layer_s3.c:1544:SSL alert number 70

Vous constaterez aussi que nous passons la lettre Q suivit d’un retour à la ligne sur l’entrée standard d’openssl (echo "Q" |). Ceci nous permet de nous déconnecter immédiatement une fois le tunnel établi. En effet la commande openssl s_client fonctionne comme une commande telnet. C’est-à-dire, qu’elle établit une connexion TCP/IP portée par un tunnel SSL/TLS et transfert le texte que vous entrez au serveur distant. Par exemple pour faire une récupération de la page d’accueil de google.com nous ferions ceci

openssl s_client -connect google.com:443 -brief -tls1_3
CONNECTION ESTABLISHED
Protocol version: TLSv1.3
Ciphersuite: TLS_AES_256_GCM_SHA384
Peer certificate: C = US, ST = California, L = Mountain View, O = Google LLC, CN = *.google.com
Hash used: SHA256
Signature type: ECDSA
Verification: OK
Server Temp Key: X25519, 253 bits
GET / HTTP/1.1

HTTP/1.1 200 OK
Date: Tue, 21 Apr 2020 07:00:01 GMT

Il est bien évidement possible de tester d’autre version du protocole SSL/TLS en changent l’option -tls1_3 par une des valeurs suivante:

-ssl3, -tls1, -tls1_1, -tls1_2, -tls1_3

Aller plus loin

Il est possible d’aller un peu plus loin avec la commande openssl s_connect. Voici deux petites astuces

## Préciser la version du protocole IP

La commande openssl s_connect, tout comme la commande curl par exemple, supporte deux options pour spécifier explicitement la version du protocole IP à utiliser. Ainsi l’option -4 permet de faire une connexion en IPv4 et l(option -6 en IPv6.

Par exemple pour tester le support de TLS1.3 en IPv4 sur le domaine google.fr nous pouvons faire ceci

$ echo "Q"  | openssl s_client -4 -connect google.fr:443 -brief -tls1_3

Et pour la version IPv6

$ echo "Q"  | openssl s_client -6 -connect google.fr:443 -brief -tls1_3

Tester la validité de notre connexion avec une CA privée

Dans le cas où votre site distant utilise une connexion SSL/TLS chiffré par une autorité de certification privée il est possible d’utiliser l’option -CAfile pour demander à OpenSSL d’utiliser le certificat de cette CA privée.

$ echo "Q"  | openssl s_client -CAfile /chemin/vers/ca.crt -connect monsite.fr:443 -brief -tls1_3

Conclusion

Il est donc assez simple de pouvoir tester la compatibilité de nos clients et serveurs avec les différentes versions du protocole TLS. Aussi ces actions peuvent être rapidement scriptées pour vérifier, suite à une installation, que aucune configuration n’a été omise.