summaryrefslogtreecommitdiff
path: root/content/Informatique/ssl_proxy.rst
diff options
context:
space:
mode:
Diffstat (limited to 'content/Informatique/ssl_proxy.rst')
-rw-r--r--content/Informatique/ssl_proxy.rst128
1 files changed, 128 insertions, 0 deletions
diff --git a/content/Informatique/ssl_proxy.rst b/content/Informatique/ssl_proxy.rst
new file mode 100644
index 0000000..c57f27e
--- /dev/null
+++ b/content/Informatique/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: static/images/chiffer/pgp_75.jpg
+
+
+.. figure:: |filename|/images/chiffer/pgp_150.jpg
+ :figwidth: 150
+ :figclass: floatright
+ :alt: Pavement
+
+ 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:site.test:443 | TCP:proxy.test: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://||' -`
+ socat TCP4-LISTEN:2022 "PROXY:$1 | TCP:${proxy}" &
+ echo -n | openssl s_client -connect localhost:2022 | openssl x509 -noout -md5 -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=20:unable to get local issuer certificate
+ verify return:1
+ 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
+
+N'oubliez pas, on n'est jamais trop prudent !