.. -*- mode: rst -*- .. -*- coding: utf-8 -*- ======================================== Vérifier un certificat SSL en entreprise ======================================== :date: 2013-12-19 :tags: ViePrivée :summary: |summary| :logo: /images/chiffer/pgp_75.jpg .. figure:: {static}/images/chiffer/pgp_150.jpg :figwidth: 150 :figclass: floatright :alt: Chiffrement Image : `Elsamuko`_ (creativecommons_) .. _Elsamuko: http://www.flickr.com/photos/28653536@N07/10595809575/ .. _creativecommons: http://creativecommons.org/licenses/by-sa/2.0/deed.fr |summary| .. |summary| replace:: 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 : .. code-block:: console $ 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. .. _mitm: http://fr.wikipedia.org/wiki/Attaque_de_l%27homme_du_milieu 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. .. _socat: http://www.dest-unreach.org/socat/ 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 : .. code-block:: console $ 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 : .. code-block:: bash #!/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 : .. code-block:: console $ 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 : .. image:: {static}/images/chiffer/certificat.jpg :alt: Vue du certificat N'oubliez pas, on n'est jamais trop prudent !