>_ DevTrendsfr

Langue

Accueil

Langages

Sections

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarqué Sécurité
Kotlin

Comment intercepter le trafic HTTPS sur Android sans certificats ni configuration manuelle du proxy

Tout développeur Android a déjà passé au moins une demi-journée à configurer un débogueur réseau à un moment donné. Le scénario est toujours le même : vous avez besoin de voir ce que l'application envoie au backend, et au lieu de cela, vous obtenez SSLHandshakeException.

Ensuite, le rituel commence. D'abord, vous générez un certificat CA auto-signé. Ensuite, vous tentez de l'installer dans le magasin de certificats de confiance sur votre appareil de test. À partir d'Android 7.0 (API 24), le système ignore par défaut les certificats utilisateur, donc vous devez modifier network_security_config.xml, configurer trust-anchors pour les builds de débogage, et recompiler l'APK. Si votre projet utilise le SSL Pinning ou que vous testez sur Android 14, où la gestion des certificats système est devenue encore plus restrictive, une simple vérification d'en-tête de réponse se transforme en tâche d'ingénierie distincte.

La bibliothèque atlantis-android de l'équipe Proxyman résout ce casse-tête de manière radicale : elle élimine la nécessité de configurer un proxy et de toucher aux certificats système de l'appareil.

Capture HTTPS from Android app

Quelle est l'idée derrière Atlantis

Les outils traditionnels comme Charles, Fiddler ou Proxyman lui-même fonctionnent généralement selon un schéma d'attaque de l'homme du milieu (MitM). L'appareil redirige tout le trafic vers l'adresse IP de l'ordinateur, et l'application de bureau intercepte les requêtes, les déchiffre avec son propre certificat, puis les transmet. C'est exactement pour cette raison que les problèmes de confiance des certificats et la configuration du proxy Wi-Fi deviennent problématiques.

Atlantis fonctionne différemment. C'est une bibliothèque Kotlin compacte qui s'intègre directement dans la version de débogage de l'application en tant qu'intercepteur de client réseau. L'intercepteur lit les paramètres de requête et de réponse au moment où l'application les a déjà formés ou déchiffrés. La bibliothèque sérialise ensuite ces données, les compresse via GZIP, et les transmet directement à l'application Proxyman sur macOS via un socket local séparé.

Vous obtenez ainsi un journal détaillé de l'activité réseau sans aucune intervention dans les paramètres Android, sans modifications du manifeste, et sans manipulation de certificats.

Ce que la bibliothèque peut faire

Atlantis couvre la plupart des tâches quotidiennes de débogage réseau :

  • Interception des requêtes HTTP et HTTPS ordinaires directement depuis OkHttp.
  • Journalisation des événements WebSocket : ouverture de connexion, envoi de messages, paquets entrants et fermeture de session.
  • Compatibilité totale avec les clients réseau populaires, y compris Retrofit 2.9+ et Apollo Kotlin 3.x/4.x.
  • Découverte automatique d'une instance Proxyman en cours d'exécution sur le réseau local via Network Service Discovery (mDNS).

Si vous exécutez le projet sur l'émulateur Android officiel, la bibliothèque peut se connecter directement à la machine hôte, en contournant la découverte réseau.

Comment intégrer dans votre projet

La bibliothèque nécessite Android avec API 26 (Android 8.0) ou supérieur, OkHttp version 4.x ou 5.x, et Kotlin version 1.9 ou supérieur.

D'abord, ajoutez le dépôt JitPack à votre fichier settings.gradle.kts :

dependencyResolutionManagement {
    repositories {
        google()
        mavenCentral()
        maven { url = uri("https://jitpack.io") }
    }
}

Après cela, ajoutez la dépendance au build.gradle.kts de votre application. Il est préférable de l'ajouter strictement via debugImplementation pour garantir que le code de débogage ne se retrouve pas dans les builds de production :

dependencies {
    debugImplementation("com.github.ProxymanApp:atlantis-android:v1.0.0")
}

La bibliothèque est également disponible sur Maven Central sous l'artefact com.proxyman:atlantis-android:1.0.0.

Démarrage rapide

L'intégration ne prend que quelques lignes de code. D'abord, initialisez Atlantis dans votre classe Application :

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        
        if (BuildConfig.DEBUG) {
            Atlantis.start(this)
        }
    }
}

Puis ajoutez l'intercepteur à votre configuration OkHttpClient :

val okHttpClient = OkHttpClient.Builder()
    .addInterceptor(Atlantis.getInterceptor())
    .build()

Si vous utilisez Retrofit, transmettez cette instance okHttpClient à Retrofit.Builder(), et toutes les requêtes apparaîtront automatiquement dans la fenêtre Proxyman.

Travailler avec WebSocket

Si votre application utilise des websockets, l'intercepteur OkHttp standard ne suffira pas, car les messages sont transmis dans une connexion déjà ouverte. Pour ces cas, la bibliothèque fournit un wrapper spécial pour le listener :

val originalListener = object : WebSocketListener() {
    override fun onOpen(webSocket: WebSocket, response: Response) {
        // обработка открытия
    }
    override fun onMessage(webSocket: WebSocket, text: String) {
        // входящее сообщение
    }
}

val wrappedListener = Atlantis.wrapWebSocketListener(originalListener)
okHttpClient.newWebSocket(request, wrappedListener)

Vous pouvez maintenant observer les trames entrantes et sortantes en temps réel dans le client de bureau.

Ce qu'il y a à l'intérieur

Le code source de la bibliothèque est minimaliste et ouvert sous licence Apache 2.0. Le dépôt n'a presque aucune dépendance tierce lourde.

L'architecture se compose de plusieurs modules clairs :

  • AtlantisInterceptor et AtlantisWebSocketListener interceptent les données au niveau de la pile réseau.
  • GzipCompression et Base64Utils conditionnent les corps de requêtes et les payloads binaires, réduisant la charge sur le canal de communication entre le téléphone et l'ordinateur.
  • NsdServiceDiscovery est responsable de la découverte du service _proxyman._tcp sur le réseau local via l'API Android NSD.
  • Transporter ouvre une connexion TCP vers l'application de bureau et transmet les paquets structurés.

Grâce à la compression du trafic, le débogage n'a virtually aucun impact sur les performances de l'application.

Limitations à connaître

Avant d'intégrer la bibliothèque, il y a deux choses à considérer.

Premièrement, Atlantis est lié au client de bureau Proxyman. Si votre équipe est habituée à utiliser exclusivement Wireshark ou Charles, vous ne pourrez pas y transmettre les données via cet intercepteur.

Deuxièmement, la bibliothèque n'intercepte le trafic que des clients où vous avez explicitement ajouté l'intercepteur. Si un SDK tiers dans votre application effectue des appels réseau via son propre HttpURLConnection ou Cronet, Atlantis ne verra pas ces requêtes. Pour une analyse complète des binaires tiers, vous devrez toujours utiliser un proxy MitM classique.

Cela vaut-il la peine d'essayer

Si votre machine de développement principale fonctionne sous macOS et que vous utilisez déjà Proxyman pour le débogage iOS ou backend, atlantis-android fait gagner beaucoup de temps. Vous oubliez pour toujours la configuration du proxy Wi-Fi sur les téléphones de test, la réinitialisation des certificats et la modification du network_security_config. Il suffit de compiler un APK de débogage, d'ouvrir l'application sur votre téléphone, et l'ensemble de l'échange réseau apparaît immédiatement sur votre écran.

Projets similaires