🌐 Site vitrine : https://maxlestage.github.io/brocolis/ (déployé automatiquement à chaque push sur master via .github/workflows/pages.yml).
Brocolis est un proxy MITM (Man In The Middle) développé en Rust permettant de chiffrer sélectivement le trafic HTTP/HTTPS.
Il intercepte les requêtes entre le client et le serveur de manière transparente afin de chiffrer uniquement les données désirées grâce à un système de clés symétriques partageables.
Brocolis assure ainsi la confidentialité des échanges sur des services comme Twitter, les forums, messageries, etc.
Un proxy MITM (Man In The Middle) est un proxy qui s'intercale entre le client et le serveur et intercepte activement la communication dans les deux sens.
Il permet d'analyser et même de modifier les requêtes et réponses à la volée avant de les transmettre à leur destination finale.
Le proxy MITM déchiffre, inspecte et potentiellement modifie ou ré-encrypte le trafic de manière transparente pour le client et le serveur.
Les données semblent transiter directement entre le client et serveur alors qu'en réalité elles passent par le proxy MITM.
Cela permet des usages comme l'analyse de trafic, l'ajout de chiffrement, le caching, la restriction d'accès, etc.
Un proxy MITM nécessite des mécanismes d'interception du trafic et de resigning des certificats SSL pour les connexions HTTPS.
Le proxy MITM est implémenté avec Actix. Il écoute les connexions entrantes, analyse le trafic et applique la logique métier de chiffrement/déchiffrement.
Reqwest est utilisé par le proxy Actix pour effectuer les requêtes HTTP/HTTPS sortantes vers les serveurs distants.
sequenceDiagram
Participant Client
Participant Actix
Participant Reqwest
Participant Serveur
Client ->> Actix: Requête entrante
Actix -->> Reqwest: Requête sortante
Reqwest ->> Serveur: Requête chiffrée
Serveur -->> Reqwest: Réponse chiffrée
Reqwest -->> Actix: Réponse
Actix -->> Client: Réponse déchiffrée
Cette architecture permet de séparer clairement les responsabilités :
-
Actix gère la partie serveur du proxy (connexions, chiffrement, etc)
-
Reqwest permet d'interagir avec les API/serveurs externes
| Fonctionnalité | Description |
|---|---|
| Interception MITM | Redirection transparente du trafic via le proxy |
| Certificats SSL | Génération de certificats auto-signés |
| Chiffrement AES-256 | Chiffrement du contenu textuel ciblé |
| Gestion des clés | Partage sécurisé des clés symétriques |
| Régénération des clés | Rotation automatique en cas de compromission |
| CLI | Interface en ligne de commande |
L'architecture générale de Brocolis est la suivante :
graph LR
subgraph Serveur
Twitter[Serveur Twitter]
end
subgraph Brocolis
Proxy[Proxy MITM]
end
subgraph Client
User[Navigateur]
end
User -->|Requête HTTP| Proxy
Proxy -->|Requête chiffrée| Twitter
Twitter -->|Réponse chiffrée| Proxy
Proxy -->|Réponse déchiffrée| User
Brocolis s'insère entre le client (navigateur) et le serveur pour intercepter toutes les requêtes et réponses HTTP/HTTPS.
Le proxy analyse et chiffre sélectivement le trafic avant de le transmettre à sa destination finale.
Les clés symétriques permettent aux utilisateurs autorisés de consulter les données déchiffrées.
graph LR
subgraph Brocolis
CLI[Interface CLI]
Config[.toml]
Keys[Gestion clés]
Proxy[Proxy MITM]
end
CLI --> Config
CLI --> Keys
Proxy --> Keys
Proxy --> User
graph LR
subgraph Brocolis
CLI[Interface CMD]
Configuration[Fichiers conf]
KeysManager[Gestion clés]
Proxy[Proxy MITM]
end
User --> CLI
CLI --> Configuration
CLI --> KeysManager
Proxy --> KeysManager
Proxy --> User
L'architecture interne comprend :
- Une interface en ligne de commande (CLI)
- Fichiers de configuration au format TOML
- Gestionnaire des clés en mémoire
- Proxy MITM implémenté en Rust/Actix/Reqwest
Le cœur est une bibliothèque Rust (src/lib.rs : modules ca, config,
crypto, keys, proxy, system) exposée via un unique frontend, la
ligne de commande brocolis. La configuration système automatique
(brocolis auto) cible macOS ; le proxy et le chiffrement eux-mêmes
fonctionnent partout où Rust compile.
Pré-requis : Rust stable récent.
git clone https://github.com/maxlestage/brocolis
cd brocolis
cargo build --release # binaire: target/release/brocolis
La façon la plus simple. Une seule commande :
$ sudo brocolis auto --config brocolis.toml
Elle exécute, sans rien d'autre à faire :
- Confiance du CA — Safari & Chrome : ajoute le certificat racine au
trousseau Système (
security add-trusted-cert … /Library/Keychains/System.keychain) ; - Confiance du CA — Firefox : Firefox n'utilise pas le trousseau
macOS ;
autodépose donc une politique entreprise (Certificates.ImportEnterpriseRoots = true,…/distribution/policies.json) dans chaque variante détectée (Firefox, Developer Edition, Nightly, ESR). Une politique préexistante n'est jamais écrasée (un avertissement est émis). En complément, un profil de configurationbrocolis-firefox.mobileconfigest généré à côté du CA : c'est une alternative qui ne modifie pas le bundle de l'app (à double-cliquer puis approuver dans Réglages Système → Confidentialité et sécurité → Profils — étape manuelle imposée par macOS) ; - Proxy système — règle le proxy web et HTTPS sur
127.0.0.1:<port>pour le service réseau actif (networksetup) ; - Chiffrement — démarre le proxy MITM ;
- Restauration — à l'arrêt (
Ctrl-C/SIGTERM), remet le proxy système dans son état initial et retire les politiques Firefox et le.mobileconfigqueautoavait créés.
Ainsi aucune installation manuelle de certificat n'est nécessaire :
Safari, Chrome et Firefox font confiance au CA automatiquement (la
méthode par défaut Firefox modifie son bundle ; le .mobileconfig
fourni est l'alternative sans modification de bundle).
Écrire dans le magasin de confiance système (trousseau macOS,
/usr/local/share/ca-certificates/ ou équivalent sur Linux) et
modifier le proxy système exige les droits administrateur. macOS
demande donc le mot de passe administrateur une seule fois au
lancement de sudo brocolis auto ; c'est une frontière de sécurité
imposée par l'OS, qu'aucun logiciel ne peut contourner. Sans sudo,
brocolis auto détecte l'absence de droits, l'indique clairement et
démarre le proxy sans toucher au système (équivalent à
--no-system).
brocolis auto détecte la famille de distribution (Debian/Ubuntu,
Fedora/RHEL ou Arch) via la présence des outils standard
(update-ca-certificates, update-ca-trust, trust extract-compat).
Il dépose alors :
- Le CA dans le magasin de confiance distro
(
/usr/local/share/ca-certificates/sur Debian,/etc/pki/ca-trust/source/anchors/sur RHEL,/etc/ca-certificates/trust-source/anchors/sur Arch) + commande de mise à jour ; - La politique entreprise Firefox dans
/etc/firefox/policies/policies.json(sans modifier le bundle) ; - Un fichier
/etc/profile.d/brocolis-proxy.shqui exportehttp_proxy/https_proxypour les nouvelles sessions shell (sourcece fichier pour la session courante).
L'arrêt (Ctrl-C / SIGTERM) restaure exactement l'état initial : CA
retiré du magasin, politique Firefox retirée, /etc/profile.d/
nettoyé. Les ressources préexistantes (CA déjà présent, politique
déjà déposée) ne sont jamais touchées.
Pour une installation persistante avec service systemd, voir le
dossier linux/ (.deb / .rpm ou install.sh).
Depuis un terminal Exécuter en tant qu'administrateur :
> brocolis.exe auto --config brocolis.toml
auto :
- Approuve le CA dans Local Machine\Trusted Root Certification
Authorities via
certutil -addstore -f Root <ca>; - Dépose la politique entreprise Firefox dans chaque variante
détectée (
<install>\distribution\policies.json) ; - Règle le proxy WinHTTP système (
netsh winhttp set proxy proxy-server="127.0.0.1:<port>" bypass-list="<local>"), après sauvegarde de l'état initial.
Ctrl-C restaure l'état initial : CA retiré du magasin, politique
Firefox retirée, WinHTTP remis comme avant. Les ressources préexistantes
(CA déjà présent, politique déjà déposée) ne sont jamais touchées.
Pour une installation persistante, voir le dossier
windows/ (install.ps1 / uninstall.ps1).
WinHTTP couvre les apps qui utilisent l'API WinHTTP (services, certains outils CLI). Les navigateurs WinINet (Edge, Chrome) lisent
HKCU\…\Internet Settings, par utilisateur — non automatisé parauto. Configurez-les à la main, ou comptez sur la politique Firefox déjà déposée.
Autres OS (BSD, …) : la configuration système automatique n'est pas prise en charge.
brocolis autolance le proxy et signale qu'il faut pointer le client sur127.0.0.1:<port>manuellement.--no-systemlance le proxy sans aucune modification système.
Générer une clé symétrique AES-256 à partager (canal sûr) :
$ brocolis keygen
SomopQcHJyVQQAWedZFGY5E4+hxKjZemOB7aGnYr6kw=
Générer le certificat racine et l'installer comme autorité de confiance dans le navigateur (nécessaire pour l'interception HTTPS) :
$ brocolis ca --export brocolis-ca.crt
Lancer le proxy (place la clé dans brocolis.toml, cf. brocolis.example.toml) :
$ brocolis run --config brocolis.toml
Brocolis écoute sur http://127.0.0.1:8080 (proxy HTTP/HTTPS)
Configurer le navigateur pour utiliser le proxy HTTP/HTTPS sur ce port.
Sur Unix, la gestion des clés se pilote par signaux : SIGHUP régénère la clé
(rotation en cas de compromission), SIGUSR1 recharge la clé partagée depuis
le fichier de configuration.
Aucune manipulation requise. À chaque push sur master, le workflow
.github/workflows/macos-cli-release.yml compile le binaire brocolis
pour macOS (universel Intel + Apple Silicon) et publie/actualise
automatiquement la release GitHub cli-latest. Il suffit de
télécharger brocolis-macos-universal.tar.gz depuis l'onglet
Releases. Un tag v* produit en plus une release versionnée.
Le script scripts/test-macos.sh valide, sur une vraie machine macOS, le
cycle complet de brocolis auto : ajout puis retrait du CA du
trousseau Système, réglage puis restauration du proxy système, pose
et retrait de la politique Firefox et du .mobileconfig, un vrai flux
HTTPS au travers du proxy, et le round-trip du chiffrement sélectif.
bash scripts/test-macos.sh
Il compile la CLI, demande une fois le mot de passe administrateur, exécute les vérifications, puis restaure l'état initial du système. Il se termine avec un code non nul si une vérification échoue.
Seul le contenu explicitement marqué est chiffré : tout segment
((texte secret)) d'une requête est remplacé par un jeton
[[BROCOLIS:v1:…]] (AES-256-GCM) ; les jetons reçus dans les réponses sont
déchiffrés à la volée. Le service distant ne stocke donc que du chiffré, alors
que les utilisateurs partageant la clé voient le texte en clair.
Le jeton encode nonce (12 octets) || ciphertext || tag (16 octets) en base64,
soit exactement la représentation combined de CryptoKit (AES.GCM.SealedBox).
Ce format est donc interopérable avec des clients tiers (p. ex. une
extension iOS). Un vecteur figé verrouille cette compatibilité binaire dans
tests/interop_ios.rs (cargo test --test interop_ios) : si le format dérivait
(préfixe, base64, ordre nonce/tag), le test échouerait.
master- branche principale contenant le code en productiondev- branche de développement pour le travail en coursfeature/nom- branches de feature pour les nouvelles fonctionnalitésbugfix/nom- branches pour corriger des bugsrelease/version- branches pour préparer les releases
Les pull requests doivent être faites de la branche de travail vers dev.
- Utiliser l'impératif au présent : "Fix bug", "Add feature"
- Donner suffisamment de contexte pour comprendre facilement les changements
- Suivre le style de codage défini par le linter Rust Clippy
- Privilégier les noms de variables et fonctions explicites
- Commenter le code pour expliquer l'intention et les choix techniques
- Garder le code simple et éviter les optimisations prématurées
- Couvrir le code par des tests unitaires et d'intégration
- Ouvrir les PRs pour toute contribution significative
- Expliquer clairement l'objectif et les changements
- Limiter la portée des PRs pour faciliter la revue
- S'assurer que tous les tests passent avant de merger
- Les numéros de version suivent SemVer (MAJEUR.MINEUR.PATCH)
- Créer une release GitHub pour chaque version
- Générer des notes de release décrivant les changements
Ce logiciel est la propriété exclusive de LESTAGE Maxime Nathan et ne peut pas être copié, modifié, distribué ou utilisé sans autorisation écrite préalable.
Le code source de ce logiciel n'est pas fourni et ne peut pas être réutilisé sans permission. Seuls les binaires compilés sont distribués aux utilisateurs finaux selon les termes du contrat de licence utilisateur final (CLUF).
Ce logiciel est protégé par le droit d'auteur et par les lois sur la propriété intellectuelle en vigueur. Toute copie, modification, distribution ou utilisation en violation de cette licence propriétaire est strictement interdite et passible de poursuites judiciaires.
LESTAGE Maxime Nathan se réserve le droit de poursuivre en justice toute personne contrevenant à cette licence propriétaire du logiciel.
Cette clause indique clairement que:
- Le code source est privé et propriétaire
- Aucun droit n'est concédé sur le code
- Seule l'utilisation du binaire sous licence est autorisée
- La copie ou redistribution est interdite
Ce logiciel, Brocolis.rs, est mis à disposition "TEL QUEL" par Maxime Nathan LESTAGE, l'auteur, sans aucune garantie explicite ou implicite. L'auteur décline toute responsabilité quant à ce logiciel, y compris les garanties implicites de qualité marchande et d'adéquation à un usage particulier. En aucun cas, Maxime Nathan LESTAGE ne pourra être tenu pour responsable des dommages spéciaux, directs, indirects ou consécutifs, ou de tout autre préjudice découlant de la perte d'utilisation, de données ou de profits, que ce soit dans le cadre d'un contrat, d'une négligence ou de toute autre action délictuelle, liée à l'utilisation ou à la performance de ce logiciel.
Veuillez noter les points suivants :
- Ce logiciel est fourni "TEL QUEL", sans aucune garantie explicite ou implicite.
- L'auteur ne garantit pas que le logiciel sera exempt d'erreurs ou de défauts.
- Vous assumez l'entière responsabilité de l'utilisation de ce logiciel et de ses conséquences.
- L'auteur ne sera pas tenu responsable des éventuels problèmes, pertes de données ou dommages résultant de l'utilisation de ce logiciel.
- En utilisant ce logiciel, vous acceptez les termes de cette licence et assumez tous les risques qui y sont associés.
Nous vous recommandons vivement de prendre toutes les précautions nécessaires lors de l'utilisation de ce logiciel. En cas de doute quant à son fonctionnement ou à ses effets, il est conseillé de consulter un professionnel qualifié.
UTILISEZ CE LOGICIEL À VOS PROPRES RISQUES.
