diff options
Diffstat (limited to 'content/Informatique/2013-12-19-ssl_proxy.rst')
-rw-r--r-- | content/Informatique/2013-12-19-ssl_proxy.rst | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/content/Informatique/2013-12-19-ssl_proxy.rst b/content/Informatique/2013-12-19-ssl_proxy.rst new file mode 100644 index 0000000..b72f1ab --- /dev/null +++ b/content/Informatique/2013-12-19-ssl_proxy.rst @@ -0,0 +1,128 @@ +.. -*- 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:: {filename}/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:: {filename}/images/chiffer/certificat.jpg + :alt: Vue du certificat + +N'oubliez pas, on n'est jamais trop prudent ! |