Déchiffrement HTTPS (attaque de l'intercepteur, MitM)
Chute peut déchiffrer le trafic HTTPS par MitM. Consultez l'article Wikipédia pour plus d'informations. Sur iPhone, Apple TV et Android, c'est une fonction sous licence et le moteur l'impose : sans licence, rien n'est déchiffré, quoi que dise la configuration. Voir Licence et activation.
Le générateur de certificats peut vous aider à créer un nouveau certificat CA à des fins de débogage et à le faire approuver par le système. Il est disponible dans Chute Mac et dans l'éditeur Chute de Chute iOS. Ce certificat est généré localement et n'est enregistré que dans votre fichier de profil et dans le trousseau du système. La clé du nouveau certificat est générée aléatoirement à l'aide d'OpenSSL. Chute Android n'a pas de générateur : importez un PKCS#12 existant sous MitM → Configurer le CA dans l'éditeur, et Installer le CA remet son certificat CA à l'installateur de certificats d'Android — voir Installer et approuver le certificat CA.
Vous pouvez également utiliser un certificat CA existant. Exportez le certificat au format PKCS#12 (.p12) avec une phrase secrète. Notez que la phrase secrète ne peut pas être vide ; Chute refuse de charger un PKCS#12 qui n'en a pas. Utilisez la commande « base64 » pour l'encoder en chaîne base64 et ajoutez les réglages ci-dessous à votre fichier de configuration.
[MITM]
enable = true
ca-p12 = MIIJtQ.........
ca-passphrase = password
hostname = *google.com
Chute ne déchiffre que le trafic vers les hôtes déclarés ici : renseignez donc toujours cette clé. Sur toutes les plateformes, une section [MITM] activée qui ne déclare aucun hostname ne déchiffre rien, que la clé soit absente ou que seules des entrées hostname-disabled soient données. Par le proxy HTTP, seul le HTTPS qui arrive par CONNECT est déchiffré : une requête HTTP en clair est transmise normalement, même si son hôte figure dans hostname.
Les caractères joker et ? sont pris en charge. Notez que ? ne joue le rôle de joker que si la règle contient aussi `; une règle ne contenant que?` est comparée littéralement.
- Utilisez le préfixe - pour exclure un nom d'hôte. Les entrées sont examinées dans l'ordre où elles sont écrites, et la première qui correspond décide : une exclusion doit donc venir avant l'entrée à laquelle elle fait exception.
hostname = -*.apple.com, *laisse apple.com de côté, tandis quehostname = *, -*.apple.comle déchiffre. - Par défaut, seules les requêtes vers le port 443 sont déchiffrées.
- Utilisez le suffixe :port pour autoriser d'autres ports.
- Utilisez le suffixe :0 pour autoriser tous les ports.
Exemple :
-*.apple.com: exclut toutes les requêtes envoyées vers *.apple.com sur le port 443.www.google.com: autorise le MitM pour www.google.com sur le port 443.www.google.com:8080: autorise le MitM pour www.google.com sur le port 8080.www.google.com:0: autorise le MitM pour www.google.com sur tous les ports.*: autorise le MitM pour tous les noms d'hôte sur le port 443. (Non recommandé)*:0: autorise le MitM pour tous les noms d'hôte sur tous les ports. (Non recommandé)
Quatre mots-clés désignent des classes entières de destinations et acceptent le même préfixe - et le même suffixe :port qu'un nom : <ip-address> (toute connexion vers une IP littérale), <ipv4-address>, <ipv6-address> et <simple-hostname> (un nom sans point, comme intranet). hostname = -<simple-hostname>, * déchiffre tout sauf les noms à un seul segment, et hostname = <ip-address> ne déchiffre que les connexions vers une adresse. Les mots-clés d'adresse ne s'appliquent jamais qu'à un CONNECT vers une adresse passant par le proxy HTTP : une connexion TUN n'est déchiffrée que d'après son nom d'hôte — celui que Chute a résolu pour elle, ou le nom de serveur de sa poignée de main TLS lorsque sniffing-enabled est activé —, si bien qu'une connexion ouverte vers une simple adresse, sans nom de serveur, n'est jamais déchiffrée.
Une entrée de nom d'hôte peut également comporter un motif de chemin après le premier /. La décision de déchiffrer est toutefois prise à l'ouverture de la connexion — au CONNECT, ou au début d'une session TUN —, avant que le moindre chemin de requête soit connu : une entrée assortie d'un chemin déchiffre donc toute la connexion dès que l'hôte correspond, et une exclusion de la forme -host/path n'a aucun effet. Ne comptez pas dessus pour tenir un hôte à l'écart du déchiffrement.
example.com/api/*: autorise le MitM pour example.com sur le port 443 ; le chemin ne le restreint pas.
Une configuration courante peut ressembler à ceci :
hostname = -*.apple.com, -*.icloud.com, *
Chute applique les règles de réécriture d'URL, de réécriture d'en-tête, de réécriture de corps et de réponse simulée ([Map Local]), ainsi que les scripts, à toutes les requêtes MitM — chaque requête d'une connexion déchiffrée, et pas seulement la première. Une connexion HTTP/1.1 déchiffrée ne porte qu'un seul échange : une fois la réponse envoyée, Chute ferme la connexion, si bien que le client envoie sa requête suivante sur une nouvelle connexion, traitée de la même façon. Une requête envoyée en pipeline derrière la première sur la même connexion n'est pas traitée, et le client la renvoie sur la nouvelle. L'exception est une connexion que Chute Android déchiffre depuis le VPN : elle reste ouverte, et chaque requête qu'elle porte est traitée à son tour. Elle est fermée après une réponse que Chute fait lui-même — une réponse simulée, une réponse de réécriture d'URL, la response d'un script — et après une réponse dont le corps vient d'un script http-response exécuté sur les en-têtes. Les connexions HTTP/2 conservent leur connexion, tout comme une mise à niveau WebSocket : après la réponse 101, les données passent telles quelles dans les deux sens.
Le MitM prend en charge HTTP/2, par le proxy HTTP comme par TUN. Avant sa négociation TLS avec le serveur, Chute lit les protocoles que propose le client (ALPN) : si le client propose h2 et que [MITM] ne définit pas h2 = false, le serveur se voit proposer h2 et http/1.1, sinon http/1.1 seul. Le client se voit ensuite proposer le protocole choisi par le serveur, si bien que les deux côtés parlent toujours le même ; si le client n'avait pas proposé ce protocole, Chute ne renvoie aucun ALPN et la négociation continue. En HTTP/2, les trailers (le grpc-status de gRPC, par exemple) et les réponses provisoires 1xx comme 103 Early Hints sont transmis tels quels ; les règles et les scripts ne les voient pas. La clé [MITM] de Surge tcp-connection est acceptée dans les fichiers de configuration mais ignorée.
Certaines applications appliquent une politique de sécurité stricte avec des certificats ou des CA épinglés. Activer le déchiffrement vers ces hôtes peut poser problème.
Chute conserve les certificats d'hôte qu'il a émis dans un magasin et, lorsqu'il est plein, évince le moins récemment utilisé : 512 certificats sous macOS, 128 sous iOS, tvOS et Android.
Installer et approuver le certificat CA
Générer (ou importer) le CA ne représente que la moitié de l'installation — le système d'exploitation doit également lui faire confiance. Tant que les deux étapes ne sont pas accomplies, chaque site déchiffré échoue avec un avertissement de certificat. La page de certificat de l'app indique l'état actuel (« Certificat CA approuvé » / « Certificat CA non approuvé »).
Chute iOS — dans l'éditeur de configuration, ouvrez MITM → Configurer le CA :
- Générer un nouveau certificat CA (ou Importer un certificat P12 pour un certificat existant).
- Touchez Installer le certificat CA dans le système. Une page Safari s'ouvre — touchez Installer le certificat et autorisez le téléchargement, puis installez le profil téléchargé sous Réglages → Général → VPN et gestion de l'appareil.
- Approuvez-le : Réglages → Général → Informations → Réglages des certificats, puis activez la confiance totale pour le CA de Chute. C'est l'étape que la plupart des gens oublient — sans elle, le certificat est installé mais non approuvé, et le déchiffrement continue d'échouer.
Chute Mac — dans la fenêtre de configuration, ouvrez MitM :
- Générer un nouveau certificat (ou Importer un certificat depuis un fichier PKCS#12).
- Cliquez sur Installer le certificat dans le système. macOS demande un mot de passe administrateur et ajoute le certificat au trousseau Système en tant que racine approuvée — aucune manipulation manuelle dans Trousseaux d'accès n'est nécessaire.
- Exporter le certificat enregistre une copie
.pemen vue d'une installation sur d'autres appareils.
Chute Android — dans l'éditeur de configuration, ouvrez MitM → Configurer le CA :
- Importer un P12 écrit un PKCS#12 existant dans
ca-p12en base64, comme le font les apps Apple, si bien que la configuration emporte son CA vers d'autres appareils ; saisissez sa phrase secrète dans Phrase secrète du CA. Chute Android n'a pas de générateur. Unca-p12qui désigne un fichier, comme l'écrivaient les versions antérieures de l'éditeur, est toujours lu. - Installer le CA remet le certificat CA de ce P12 à l'installateur de certificats d'Android. À partir d'Android 11, une app ne peut plus installer un certificat CA de cette façon : installez-le plutôt depuis un fichier de certificat, dans les réglages de sécurité du système — une copie
.pemou.crtdu certificat, comme celle qu'enregistre Exporter le certificat sur Chute Mac. - Android le range parmi les certificats de l'utilisateur, et les apps qui ciblent Android 7.0 ou ultérieur ne font confiance à ceux-ci que si elles l'ont expressément prévu. Beaucoup d'apps échouent donc encore à la poignée de main une fois le certificat installé — excluez leurs hôtes de
hostname.
Si une app précise échoue malgré un certificat approuvé, c'est très probablement qu'elle épingle ses propres certificats — excluez ses hôtes de hostname avec un préfixe - plutôt que de lutter contre elle.
Options
skip-server-cert-verify
skip-server-cert-verify = true
Ne pas vérifier le certificat de l'hôte distant lors du MitM. Lorsque cette option est activée, Chute accepte tout certificat présenté par le serveur amont, y compris auto-signé ou non valide. C'est utile pour les environnements de développement, mais cela réduit la sécurité.
[MITM]
enable = true
ca-p12 = MIIJtQ.........
ca-passphrase = password
skip-server-cert-verify = true
hostname = *google.com
Note de sécurité : activer
skip-server-cert-verifyrend les connexions MitM vulnérables aux attaques de l'intercepteur entre Chute et le serveur amont. N'activez cette option que sur des réseaux de confiance ou à des fins de développement.
hostname-disabled
hostname-disabled = *.bank.example, pay.example.com:8443
Hôtes qui ne sont jamais déchiffrés, même lorsqu'une entrée de hostname les couvre. Les jokers fonctionnent comme dans hostname, et :port limite une entrée à un seul port. Pratique pour désactiver des hôtes ajoutés par un module sans modifier le module.
auto-quic-block
auto-quic-block = true
Bloque le QUIC vers chaque hôte qui serait déchiffré, afin que les clients HTTP/3 se replient sur TLS au-dessus de TCP, où le MitM voit le trafic. Il s'ajoute à block-quic plutôt que de le remplacer.