openssl permet de vérifier un certificat SSL en ligne de commande. Ceci est très utile si l’on souhaite vérifier son installation et s’assurer que le certificat fourni est bien le bon. Toutefois, l’application ne fonctionne pas si un proxy est nécessaire pour se connecter au site distant.
C’est bien dommage, car en entreprise, le proxy est souvent obligatoire. Si l’on souhaite s’assurer que le proxy ne va pas nous présenter un mauvais certificat, il est nécessaire de passer par le navigateur web pour vérifier l’authenticité du certificat, mais il n’est alors pas possible d’automatiser la procédure.
Pour mener à bien notre action, il va falloir ruser, et jouer avec les connexions réseau, mais avant tout ça, reprenons un peu les bases, et voyons comment récupérer un certificat ssl en ligne de commande.
openssl
Openssl est une librairie utilisée pour la sécurité et le chiffrement, elle permet de générer des certificats clients et serveur, de chiffrer selon différents algorithmes, etc.
Une application en ligne de commande existe, et permet de contrôler un certificat de la manière suivante :
$ echo -n | openssl s_client -connect site.test:443 | openssl x509 -noout -md5 -fingerprint
Toutefois, il faut que le site soit accessible directement, sans proxy. Si c’est le cas, il n’est plus possible de vérifier le certificat en question.
C’est problématique si l’on souhaite justement s’assurer que le proxy ne fait pas du mitm. Pour vérifier le certificat dans ces conditions, il va falloir nous faire entrer un autre outil qui va se charger de passer le proxy.
Vous avez remarqué que l’on précise le serveur et le port sur lequel est installé le certificat à vérifier. Il est donc possible de tester un certificat sur localhost:1234 si on le souhaite (à la condition d’avoir un serveur https qui réponde sur ce port).
socat
C’est là qu’intervient socat. Socat est un outil similaire à netcat (le couteau suisse du web), sauf que socat à la possibilité de gérer les requêtes bidirectionnelles. Nous allons nous en servir pour ouvrir une connexion à travers le proxy sur le site que nous souhaitons tester.
En laissant la connexion ouverte, on permet à openssl de s’y connecter et effectuer ses tests. C’est donc grâce aux deux outils que l’on va pouvoir faire notre contrôle.
On se crée la connexion avec la commande suivante :
$ socat TCP4-LISTEN:2022 "PROXY:proxy.test:site.test:443,proxyport=8080"
La connexion n’est pas persistante, elle sera fermée dès sa première utilisation, cela permet de chaîner les deux commandes directement :
#!/bin/sh
if [[ ! -z $https_proxy ]]; then
proxy=`echo ${https_proxy} | sed -e 's|http://||' -`
host=$(echo ${proxy} | cut -d: -f 1)
port=$(echo ${proxy} | cut -d: -f 2)
echo using proxy : ${host}:${port}
socat TCP4-LISTEN:2022 "PROXY:${host}:$1,proxyport=${port}" & echo -n | openssl s_client -connect localhost:2022 | openssl x509 -noout -sha1 -fingerprint
else
echo -n | openssl s_client -connect $1 | openssl x509 -noout -md5 -fingerprint
fi
enregistrez ce script sous check_ssl.sh puis lancez cette commande ainsi :
$ check.sh site.test:443
depth=0 C = FR, ST = Some-State, O = Internet Widgits Pty Ltd, CN = site.test, emailAddress = contact@site.test
verify error:num=21:unable to verify the first certificate
verify return:1
DONE
MD5 Fingerprint=73:4F:77:1D:2B:C1:4F:0E:3F:42:FA:14:A9:0F:BC:80
Si la variable d’environnement HTTPS_PROXY est renseignée le script créera le tunnel via socat, sinon, openssl sera utilisé directement pour vérifier le certificat.
Vous pouvez le comparer avec ce que vous affiche le navigateur pour vous assurer qu’il est cohérent :
N’oubliez pas, on n’est jamais trop prudent !