TLS nativo de Android en sgcWebSockets: sin OpenSSL que desplegar

· Componentes

Publicar una aplicación Android segura con Delphi o C++Builder siempre ha supuesto una tarea adicional: incluir libssl.so y libcrypto.so en el APK para que OpenSSL esté disponible en tiempo de ejecución. sgcWebSockets elimina esa tarea. Un nuevo backend TLS nativo, iohAndroidTLS, delega el cifrado al propio Android, de modo que tu aplicación se conecta por TLS sin bibliotecas OpenSSL que desplegar. Está disponible en la edición Enterprise.

Internamente, el backend gobierna el propio javax.net.ssl.SSLEngine de la plataforma a través de JNI. El sistema operativo realiza el handshake, el cifrado de los registros y la validación del certificado. sgcWebSockets simplemente introduce texto en claro y obtiene texto cifrado, lo que significa que toda la pila TLS es la que Google distribuye y parchea junto con el sistema operativo.

Una línea para cambiar

El backend TLS se selecciona a través de TLSOptions.IOHandler. Para usar el TLS nativo de Android, asígnale iohAndroidTLS. Todo lo demás en tu código de red permanece igual.

uses
  sgcWebSocket, sgcWebSocket_Types;

WSClient.TLS := True;
WSClient.TLSOptions.IOHandler := iohAndroidTLS;
WSClient.URL := 'wss://www.esegece.com:2053';
WSClient.Active := True;

En otras plataformas mantienes el backend que más te convenga: iohOpenSSL funciona en todas partes, y iohSChannel es la opción nativa, sin nada que desplegar, en Windows. Un pequeño condicional mantiene correcto un único componente cliente en todos los destinos.

WSClient.TLS := True;
{$IFDEF ANDROID}
WSClient.TLSOptions.IOHandler := iohAndroidTLS;   // native, no OpenSSL .so
{$ELSE}
  {$IFDEF MSWINDOWS}
WSClient.TLSOptions.IOHandler := iohSChannel;     // native on Windows
  {$ELSE}
WSClient.TLSOptions.IOHandler := iohOpenSSL;      // OpenSSL elsewhere
  {$ENDIF}
{$ENDIF}
WSClient.URL := 'wss://www.esegece.com:2053';
WSClient.Active := True;

Sin OpenSSL en el APK

Este es el beneficio principal. Con el backend nativo, el APK no incluye ningún libssl.so ni libcrypto.so. El paquete es más pequeño, y nunca más tendrás que perseguir una versión de OpenSSL, recompilar a raíz de un aviso de seguridad ni hacer coincidir una compilación de la biblioteca con un dispositivo. La implementación de TLS reside en el dispositivo y la mantiene Android, así que las correcciones de seguridad llegan a través de las actualizaciones del sistema y no de tu ciclo de publicación.

También elimina toda una categoría de problemas de despliegue. No hay «biblioteca no encontrada», ni desajustes de arquitectura entre el .so incluido y el dispositivo, ni una segunda copia de criptografía que auditar. Estableces una propiedad y publicas.

Un cliente TLS completo, no uno recortado

El backend nativo es un cliente completo. Valida el servidor contra el almacén de confianza del sistema de Android y realiza la verificación del nombre de host, de modo que las conexiones a autoridades de certificación públicas funcionan sin configuración adicional. Negocia TLS 1.3 y admite ALPN en Android 10 (API 29) y posteriores, lo que te permite anunciar protocolos de aplicación como http/1.1 durante el handshake.

Como se apoya en la misma API de TLSOptions que cualquier otro backend, las propiedades habituales siguen funcionando. VerifyCertificate activa o desactiva la validación del par, RootCertFile confía en una autoridad privada, CertFile y Password presentan un certificado de cliente, y ALPNProtocols enumera los protocolos a negociar.

WSClient.TLS := True;
WSClient.TLSOptions.IOHandler := iohAndroidTLS;
WSClient.TLSOptions.VerifyCertificate := True;
WSClient.TLSOptions.ALPNProtocols.Add('http/1.1');  // Android 10 (API 29)+
WSClient.Host := 'your.server.com';
WSClient.Port := 443;
WSClient.Active := True;

Funciona con los componentes que ya usas

El backend está integrado en las TLSOptions compartidas, así que no se limita al cliente WebSocket. Los clientes TCP y HTTP/2 y los demás componentes que exponen TLSOptions lo seleccionan del mismo modo. Si tu código ya establece TLSOptions, añadir el TLS nativo de Android es una sola asignación, sin cambio alguno en cómo abres la conexión, envías o recibes.

La misma idea en Apple

Si también tienes como objetivo iOS o macOS, el backend complementario iohAppleTLS hace el mismo trabajo allí: usa el propio TLS de Apple, sin ningún .dylib de OpenSSL que desplegar, y alcanza TLS 1.3 a través de Network.framework. El patrón es idéntico, solo eliges el handler nativo por plataforma. Puedes leer los detalles en la página Native Apple TLS.

Disponibilidad

El TLS nativo de Android (iohAndroidTLS) se incluye en la edición Enterprise de sgcWebSockets. Para el desglose completo de los cuatro backends TLS, OpenSSL en todas las plataformas, SChannel en Windows y los handlers nativos de Android y Apple, consulta la sección SSL / TLS y la página Native Android TLS.

Descárgalo desde la página de descargas de sgcWebSockets, u obtenlo a través de GetIt o de tu cuenta registrada.

¿Preguntas, comentarios o ayuda para migrar una aplicación Android fuera de OpenSSL? Ponte en contacto, recibirás respuesta de las personas que escribieron el código.