Cómo interceptar tráfico HTTPS en Android sin certificados ni configuración manual de proxy
Cualquier desarrollador Android ha invertido al menos medio día de trabajo en configurar un depurador de red en algún momento. El escenario es siempre el mismo: necesitas ver lo que la aplicación está enviando al backend, y en cambio obtienes SSLHandshakeException.
Luego comienza el ritual. Primero, generas un certificado CA autofirmado. Luego intentas instalarlo en el almacén de certificados de confianza en tu dispositivo de prueba. A partir de Android 7.0 (API 24), el sistema ignora los certificados de usuario por defecto, así que necesitas modificar network_security_config.xml, configurar trust-anchors para builds de depuración y reconstruir el APK. Si tu proyecto tiene SSL Pinning configurado o estás probando en Android 14, donde el manejo de certificados del sistema se ha vuelto aún más restrictivo, una simple verificación de cabecera de respuesta se convierte en una tarea de ingeniería separada.
La biblioteca atlantis-android del equipo de Proxyman resuelve este dolor de cabeza radicalmente: elimina la necesidad de configurar un proxy y tocar los certificados del sistema del dispositivo.
¿Cuál es la idea detrás de Atlantis
Las herramientas tradicionales como Charles, Fiddler o el propio Proxyman generalmente funcionan utilizando un esquema de Hombre en el Medio (MitM). El dispositivo redirige todo el tráfico a la dirección IP del ordenador, y la aplicación de escritorio intercepta las solicitudes, las descifra con su propio certificado y las reenvía. Esta es exactamente la razón por la cual los problemas de confianza de certificados y la configuración del proxy Wi-Fi se vuelven problemáticos.
Atlantis funciona de manera diferente. Es una biblioteca compacta en Kotlin que se integra directamente en el build de depuración de la aplicación como un interceptor de cliente de red. El interceptor lee los parámetros de solicitud y respuesta en el momento en que la aplicación ya los ha formado o acaba de descifrarlos. Luego, la biblioteca serializa estos datos, los comprime mediante GZIP y los transmite directamente a la aplicación Proxyman en macOS a través de un socket local independiente.
Como resultado, obtienes un registro detallado de la actividad de red sin ninguna intervención en la configuración de Android, sin modificaciones en el manifest y sin manipulación de certificados.
Qué puede hacer la biblioteca
Atlantis cubre la mayoría de las tareas cotidianas de depuración de red:
- Interceptar solicitudes HTTP y HTTPS regulares directamente desde OkHttp.
- Registrar eventos de WebSocket: apertura de conexión, envío de mensajes, paquetes entrantes y cierre de sesión.
- Compatibilidad total con clientes de red populares, incluyendo Retrofit 2.9+ y Apollo Kotlin 3.x/4.x.
- Descubrimiento automático de una instancia de Proxyman en ejecución en la red local mediante Network Service Discovery (mDNS).
Si estás ejecutando el proyecto en el emulador oficial de Android, la biblioteca puede conectarse directamente a la máquina host, omitiendo el descubrimiento de red.
Cómo integrar en tu proyecto
La biblioteca requiere Android con API 26 (Android 8.0) o superior, OkHttp versión 4.x o 5.x, y Kotlin versión 1.9 o superior.
Primero, añade el repositorio de JitPack a tu archivo settings.gradle.kts:
dependencyResolutionManagement {
repositories {
google()
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}
Después, añade la dependencia al build.gradle.kts de tu aplicación. Es mejor añadirla estrictamente mediante debugImplementation para asegurar que el código de depuración no termine en los builds de producción:
dependencies {
debugImplementation("com.github.ProxymanApp:atlantis-android:v1.0.0")
}
La biblioteca también está disponible en Maven Central bajo el artefacto com.proxyman:atlantis-android:1.0.0.
Inicio rápido
La integración solo requiere unas pocas líneas de código. Primero, inicializa Atlantis en tu clase Application:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
if (BuildConfig.DEBUG) {
Atlantis.start(this)
}
}
}
Luego añade el interceptor a tu configuración de OkHttpClient:
val okHttpClient = OkHttpClient.Builder()
.addInterceptor(Atlantis.getInterceptor())
.build()
Si estás usando Retrofit, pasa esta instancia de okHttpClient a Retrofit.Builder(), y todas las solicitudes aparecerán automáticamente en la ventana de Proxyman.
Trabajando con WebSocket
Si tu aplicación usa websockets, el interceptor estándar de OkHttp no será suficiente, ya que los mensajes se transmiten dentro de una conexión ya abierta. Para estos casos, la biblioteca proporciona un wrapper especial para el 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)
Ahora puedes observar los frames entrantes y salientes en tiempo real en el cliente de escritorio.
Qué hay dentro
El código fuente de la biblioteca es minimalista y está publicado bajo la licencia Apache 2.0. El repositorio casi no tiene dependencias pesadas de terceros.
La arquitectura consiste en varios módulos claros:
AtlantisInterceptoryAtlantisWebSocketListenerinterceptan datos a nivel de la pila de red.GzipCompressionyBase64Utilsempaquetan los cuerpos de solicitud y las cargas binarias, reduciendo la carga en el canal de comunicación entre el teléfono y el ordenador.NsdServiceDiscoveryes responsable de descubrir el servicio_proxyman._tcpen la red local a través de la API Android NSD.Transporterabre una conexión TCP a la aplicación de escritorio y reenvía paquetes estructurados.
Gracias a la compresión de tráfico, la depuración prácticamente no tiene impacto en el rendimiento de la aplicación.
Limitaciones que debes conocer
Antes de integrar la biblioteca, hay dos cosas a considerar.
Primero, Atlantis está vinculado al cliente de escritorio de Proxyman. Si tu equipo está acostumbrado a usar exclusivamente Wireshark o Charles, no podrás reenviar datos allí a través de este interceptor.
Segundo, la biblioteca intercepta el tráfico solo de los clientes donde añadiste explícitamente el interceptor. Si un SDK de terceros en tu aplicación realiza llamadas de red a través de su propio HttpURLConnection o Cronet, Atlantis no verá esas solicitudes. Para un análisis completo de binarios de terceros, seguirás necesitando usar un proxy MitM clásico.
¿Vale la pena probar
Si tu máquina de desarrollo principal ejecuta macOS y ya usas Proxyman para depurar iOS o backend, atlantis-android ahorra mucho tiempo. Te olvidas para siempre de configurar el proxy Wi-Fi en los teléfonos de prueba, restablecer certificados y modificar network_security_config. Solo compila un APK de depuración, abre la aplicación en tu teléfono y todo el intercambio de red aparece inmediatamente en tu pantalla.
Proyectos relacionados
