Aperçu
Obscura nécessite un proxy MitM (Homme-du-Milieu) pour intercepter et modifier le trafic HTTPS. Ce document évalue les options disponibles.
Approches
Approche 1 : Bibliothèque Go mitmproxy
Bibliothèque : github.com/elazarl/goproxy
Avantages :
- Mature, bien testé
- Gère automatiquement les tunnels CONNECT
- Supporte la modification de réponse
- MITM avec génération de certificats à la volée
Inconvénients :
- Le support HTTP/2 est limité
- Arbre de dépendances volumineux
- Pas conçu pour le proxy transparent
Approche 2 : Proxy Rust Personnalisé avec tokio + rustls
Avantages :
- Contrôle total sur la pile TLS
- Performances (abstractions zéro-coût)
tokio-rustlspour la terminaison TLS- Hyper pour HTTP/1 et HTTP/2
- Peut intégrer
utlspour l'usurpation d'empreinte TLS
Inconvénients :
- Plus d'effort de développement
- Doit gérer la génération de certificats manuellement
- Analyse au niveau des trames HTTP/2 requise
Approche 3 : Squid + Modification Externe
Avantages :
- Proxy éprouvé
- SSL Bump pour MITM
- ICAP/eCAP pour la modification de contenu
Inconvénients :
- Configuration complexe
- Versions EOL encore utilisées
- Pas conçu pour l'injection JS
- Image de conteneur lourde
Approche 4 : Envoy Proxy avec Filtre Wasm
Avantages :
- Haute performance
- Proxy L4/L7
- Filtres WebAssembly (Wasm) pour la modification
- HTTP/2 et HTTP/3 natifs
Inconvénients :
- Configuration complexe
- Surcharge de développement de filtres Wasm
- Pas conçu pour l'injection JS côté client
- Excessif pour un déploiement à petite échelle
Approche 5 : Interception TCP Personnalisée
Interception de socket brute + terminaison TLS :
- Utiliser iptables
TPROXYpour rediriger le trafic - Lecture de socket TCP brute
- Poignée de main TLS manuelle (via rustls/crypto/tls)
- Analyse HTTP/1.1 ou HTTP/2
- Modification d'en-tête + injection JS
- Transmission à l'amont
Avantages :
- Contrôle maximal
- Aucune dépendance aux frameworks proxy
- Peut gérer tous les cas particuliers
Inconvénients :
- Effort de développement maximal
- Doit implémenter la gestion HTTP/2 et HTTP/3
- Doit gérer correctement le pooling de connexions
Recommandation
Pour Obscura, une implémentation Rust personnalisée (Approche 2) est le meilleur compromis :
- Go goproxy manque de HTTP/2 et d'usurpation TLS
- Rust donne un contrôle fin sur TLS (intégration utls)
- Les performances comptent pour une passerelle réseau
- Les garanties de sécurité de Rust réduisent les bugs du proxy
Génération de Certificats
Pour le MITM, le proxy doit générer des certificats TLS à la volée :
- Un certificat CA est généré au premier démarrage
- Pour chaque nouveau domaine, un certificat feuille est signé par le CA
- Le client doit approuver le certificat CA
CA Obscura (clé privée)
*.example.com (feuille, généré à la première requête)
*.anotherexample.com (feuille, généré à la première requête)
Stockage des Certificats
/var/lib/obscura/certs/
ca.pem # Certificat CA (public)
ca-key.pem # Clé privée CA
cache/ # Certificats feuilles générés
example.com.pem
...
serial # Compteur de série de certificat
Limitations
- HPKP (HTTP Public Key Pinning) : Maintenant déprécié dans Chrome, mais certains sites l'utilisent encore
- Préchargement HSTS : Les sites dans la liste de préchargement HSTS (ex., google.com, stripe.com) rejetteront les certificats MITM. Doit être intercepté au niveau DNS/réseau d'abord.
- Transparence des Certificats : Certains sites exigent des logs CT. Le proxy doit intégrer des SCT.
- HTTP/3 (QUIC) : Fonctionne sur UDP et est chiffré de bout en bout. Doit être bloqué au niveau réseau.
Conclusions
- Rust avec
tokio-rustls+hyperest la pile proxy recommandée - L'usurpation d'empreinte TLS nécessite l'intégration
utls - Les sites préchargés HSTS doivent être gérés au niveau DNS/réseau
- HTTP/3 doit être bloqué (QUIC contourne le proxy)