>_ DevTrendsit

Lingua

Home

Linguaggi

Sezioni

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicurezza
Kotlin

Come Intercettare il Traffico HTTPS su Android Senza Certificati e Configurazione Manuale del Proxy

Ogni sviluppatore Android ha trascorso almeno mezza giornata lavorativa per configurare un debugger di rete a un certo punto. Lo scenario è sempre lo stesso: devi vedere cosa l'app sta inviando al backend, e invece ottieni SSLHandshakeException.

Poi inizia il rituale. Prima generi un certificato CA autofirmato. Poi tenti di installarlo nel store dei certificati attendibili sul tuo dispositivo di test. A partire da Android 7.0 (API 24), il sistema ignora i certificati utente per impostazione predefinita, quindi devi modificare network_security_config.xml, configurare trust-anchors per le build di debug e ricompilare l'APK. Se il tuo progetto ha SSL Pinning configurato o stai testando su Android 14, dove la gestione dei certificati di sistema è stata resa ancora più restrittiva, un semplice controllo dell'header della risposta si trasforma in un task di ingegneria separato.

La libreria atlantis-android del team Proxyman risolve questo mal di testa in modo radicale: elimina la necessità di configurare un proxy e toccare i certificati di sistema del dispositivo.

Capture HTTPS from Android app

Qual è l'idea alla base di Atlantis

Gli strumenti tradizionali come Charles, Fiddler o lo stesso Proxyman tipicamente funzionano usando uno schema Man-in-the-Middle (MitM). Il dispositivo reindirizza tutto il traffico all'indirizzo IP del computer, e l'applicazione desktop intercetta le richieste, le decripta con il proprio certificato e le inoltra. Questo è esattamente il motivo per cui i problemi di attendibilità dei certificati e la configurazione del proxy Wi-Fi diventano problematici.

Atlantis funziona in modo diverso. È una libreria Kotlin compatta che si integra direttamente nella build di debug dell'app come interceptor del client di rete. L'interceptor legge i parametri della richiesta e della risposta nel momento in cui l'app li ha già formati o li ha appena decriptati. La libreria poi serializza questi dati, li comprime tramite GZIP e li trasmette direttamente all'app Proxyman su macOS tramite un socket locale separato.

Come risultato, ottieni un log dettagliato dell'attività di rete senza alcun intervento nelle impostazioni di Android, senza modifiche al manifest e senza manipolazione dei certificati.

Cosa può fare la libreria

Atlantis copre la maggior parte dei task quotidiani di debug di rete:

  • Intercettare le richieste HTTP e HTTPS regolari direttamente da OkHttp.
  • Logging degli eventi WebSocket: apertura della connessione, invio di messaggi, pacchetti in entrata e chiusura della sessione.
  • Compatibilità completa con i client di rete più diffusi, inclusi Retrofit 2.9+ e Apollo Kotlin 3.x/4.x.
  • Scoperta automatica di un'istanza Proxyman in esecuzione sulla rete locale tramite Network Service Discovery (mDNS).

Se stai eseguendo il progetto sull'emulatore Android ufficiale, la libreria può connettersi alla macchina host direttamente, bypassando la scoperta della rete.

Come integrare nel tuo progetto

La libreria richiede Android con API 26 (Android 8.0) o superiore, OkHttp versione 4.x o 5.x e Kotlin versione 1.9 o superiore.

Prima, aggiungi il repository JitPack al tuo file settings.gradle.kts:

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

Dopo di che, aggiungi la dipendenza al build.gradle.kts della tua app. È meglio aggiungerla rigorosamente tramite debugImplementation per assicurarsi che il codice di debug non finisca nelle build di release:

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

La libreria è disponibile anche su Maven Central sotto l'artefatto com.proxyman:atlantis-android:1.0.0.

Avvio rapido

L'integrazione richiede solo poche righe di codice. Prima, inizializza Atlantis nella tua classe Application:

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

Poi aggiungi l'interceptor alla tua configurazione OkHttpClient:

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

Se stai usando Retrofit, passa questa istanza okHttpClient a Retrofit.Builder(), e tutte le richieste appariranno automaticamente nella finestra di Proxyman.

Lavorare con WebSocket

Se la tua app usa websocket, l'interceptor standard di OkHttp non sarà sufficiente, poiché i messaggi vengono trasmessi all'interno di una connessione già aperta. Per questi casi, la libreria fornisce un wrapper speciale per il 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)

Ora puoi osservare i frame in entrata e in uscita in tempo reale nel client desktop.

Cosa c'è dentro

Il codice sorgente della libreria è minimalista e aperto sotto licenza Apache 2.0. Il repository non ha quasi dipendenze di terze parti pesanti.

L'architettura è composta da diversi moduli chiari:

  • AtlantisInterceptor e AtlantisWebSocketListener intercettano i dati a livello dello stack di rete.
  • GzipCompression e Base64Utils impacchettano i corpi delle richieste e i payload binari, riducendo il carico sul canale di comunicazione tra il telefono e il computer.
  • NsdServiceDiscovery è responsabile della scoperta del servizio _proxyman._tcp sulla rete locale tramite l'API Android NSD.
  • Transporter apre una connessione TCP all'applicazione desktop e inoltra pacchetti strutturati.

Grazie alla compressione del traffico, il debug non ha praticamente alcun impatto sulle prestazioni dell'app.

Limitazioni da conoscere

Prima di integrare la libreria, ci sono due cose da considerare.

Prima di tutto, Atlantis è legato al client desktop Proxyman. Se il tuo team è abituato a usare esclusivamente Wireshark o Charles, non sarai in grado di inoltrare i dati lì attraverso questo interceptor.

In secondo luogo, la libreria intercetta il traffico solo dai client in cui hai esplicitamente aggiunto l'interceptor. Se un SDK di terze parti nella tua app effettua chiamate di rete attraverso il proprio HttpURLConnection o Cronet, Atlantis non vedrà quelle richieste. Per un'analisi completa dei binari di terze parti, dovrai ancora usare un classico proxy MitM.

Vale la pena provarlo

Se la tua macchina di sviluppo principale esegue macOS e usi già Proxyman per il debug di iOS o backend, atlantis-android fa risparmiare molto tempo. Dimenticherai per sempre di configurare il proxy Wi-Fi sui telefoni di test, resettare i certificati e modificare network_security_config. Basta compilare un APK di debug, aprire l'app sul telefono e l'intero scambio di rete appare immediatamente sullo schermo.

Progetti correlati