[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.