Cambio de la biblioteca OpenSSL en la aplicación de Android para HttpClient

Necesito usar una biblioteca OpenSSL personalizada para HttpClient en mi proyecto.

He comstackdo libcrypto.so y libssl.so para Android y puse los archivos en una carpeta jniLibs. La aplicación Heartbleed Scanner los ve. System.loadLibrary("crypto") y System.loadLibrary("ssl") funciona. Pero ahora necesito hacer que HttpClient use mi biblioteca en lugar de la biblioteca SSL estándar. Pero no sé sobre qué camino mover y cómo hacerlo.

Uso OpenSSL 1.0.1h y Android Studio 1.0.2.

Gracias de antemano por su consejo.

He comstackdo libcrypto.so y libssl.so para Android y puse los archivos en una carpeta jniLibs …

Esto no funcionará

Android utiliza OpenSSL 1.0.0 y lo proporciona en /system . Zygote se inicia al arrancar y carga la versión de nivel inferior de OpenSSL (es como init , todos los procesos de Android se bifurcan).

Cuando tu proceso se bifurca desde Zygote, tu versión 1.0.1 nunca se carga porque 1.0.0 ya está cargada desde Zygote. Nunca se sabe que hay un problema porque la versión de nivel inferior proporciona todos los símbolos que necesita (es compatible con binarios).

Necesita escribir un objeto compartido envoltorio. El objeto compartido del contenedor debe vincularse con las versiones estáticas de OpenSSL 1.0.1 ( libcrypto.a y libssl.a ). Su contenedor debe exportar símbolos únicos, como My_OpenSSL_add_all_algorithms y My_SSL_load_error_strings . Internamente, su objeto compartido puede hacer referencia a los nombres no decorados, OpenSSL_add_all_algorithms y SSL_load_error_strings .

Entonces su objeto compartido se vería así (también vea la página Visibilidad de GCC):

 #if __GNUC__ >= 4 #define DLL_PUBLIC __attribute__ ((visibility ("default"))) #define DLL_LOCAL __attribute__ ((visibility ("hidden"))) #else #define DLL_PUBLIC #define DLL_LOCAL #endif DLL_PUBLIC void My_OpenSSL_add_all_algorithms() { return (void)OpenSSL_add_all_algorithms(); } DLL_PUBLIC void My_SSL_load_error_strings() { return (void)SSL_load_error_strings(); } ... 

Luego, compile con la -fvisibility=hidden indicador -fvisibility=hidden y enlace contra libcrypto.a y libssl.a . Solo las funciones marcadas con DLL_PUBLIC se exportarán y se llamarán a través de JNI.

No creo que el #if __GNUC__ >= 4 sea ​​necesario porque las herramientas del comstackdor cruzado proporcionadas por Android son GCC 4.0 anteriores. De hecho, creo que actualmente es GCC 4.8.


Cambio de la biblioteca OpenSSL en la aplicación de Android para HttpClient

Esta pregunta es más difícil. Una vez que haya proporcionado el OpenSSL actualizado en su envoltorio compartido, no sé cómo podría usar HttpClient de Android para usarlo.

La peor respuesta a un caso: es posible que necesite bifurcar Android y proporcionar un OpenSSL actualizado.

Una solución potencialmente mejor: rasgue el código de HttpClient , póngalo en su propio paquete y luego asegúrese de que el objeto compartido sea utilizado por el puerto del código fuente.