Voici quelques notes en vrac sur HTTPS et SSL/TLS.
Les exemples ci-dessous sont écrits en Python : https://docs.python.org/3/library/ssl.html
En guise d'échauffement, voici un exemple de client HTTPS : httpsget.py
$ ./httpsget www.python.org 443
Pour aller un peu plus loin, voici un exemple de client/serveur Echo en SSL : sslsocket.zip. Il faut dans cet exemple générer le certificat du CA et du serveur pour localhost (127.0.0.1). Ceux fournis expirent au bout de 255 jours ! Voir README.
$ ./sslserver.py $ ./sslclient.py
Voici le code de notre proxy SSL : sslproxy.py. Ce code n'est pas très générique : il est écrit sur mesure pour l'interception du site https://www.python.org en utilisant un faux certifcat fake.crt/fake.key signé par notre propre CA (ca.crt/ca.key). Voir la section suivante pour générer ces certificats.
On considère le LAN suivant (192.168.0.0/24) :
V ---- [LAN] ----- GW -----> Internet | PROXY
avec :
Nous allons uniquement nous intéresser à l'interception HTTPS pour un site particulier (https://www.python.org) afin d'illustrer le principe.
PROXY$ sudo iptables -A OUTPUT -p icmp --icmp-type redirect -j DROP # PROXY$ echo 0 | sudo tee /proc/sys/net/ipv4/conf/*/send_redirects PROXY$ sudo iptables -t nat -A PREROUTING -i wlp2s0 -d www.python.org -p tcp --dport 443 \ -j REDIRECT --to-port 4444 PROXY$ sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward' PROXY$ ./sslproxy.py 4444 V$ route del default V$ route add default gw @PROXY V$ wget -4 --ca-certificate=ca.crt https://www.python.org
Pour tester en local notre Proxy SSL, le redirect est un peu plus tricky, car il faut distinguer localement le traffic partant du client web de celui partant du proxy, alors qu'ils ont la même destination. Voici l'astuce que j'utilise :
$ sudo groupadd noredirect $ sudo iptables -t nat -F $ sudo iptables -t nat -A OUTPUT -m owner ! --gid-owner noredirect -p tcp -d www.python.org --dport 443 \ -j REDIRECT --to-port 4444 $ sudo sg noredirect './sslproxy.py 4444' $ wget -4 --ca-certificate=ca.crt https://www.python.org
$ certtool --generate-privkey --outfile ca.key $ certtool --generate-self-signed --load-privkey ca.key --outfile ca.crt $ certtool --certificate-info --infile ca.crt
$ certtool --generate-privkey --outfile fake.key $ certtool --generate-certificate --load-privkey fake.key --outfile fake.crt --load-ca-certificate ca.crt \ --load-ca-privkey ca.key $ certtool --certificate-info --infile fake.crt