summaryrefslogtreecommitdiff
path: root/content/Informatique/2013-12-19-ssl_proxy.rst
blob: b72f1aba0b407d75875a0f4e929c55ee0037fa70 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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 !