Incluir TLS en una app de iOS o macOS creada con Delphi o C++Builder solía significar empaquetar OpenSSL: una libssl.dylib y una libcrypto.dylib empaquetadas con la app, con versiones que tú mismo debías hacer coincidir y parchear. sgcWebSockets elimina ese requisito. Un nuevo backend de TLS nativo, iohAppleTLS, usa el propio TLS de Apple, de modo que tu app se conecta de forma segura sin ninguna .dylib de OpenSSL que desplegar. Está disponible en la edición Enterprise.
Mejor aún, en sistemas modernos te ofrece TLS 1.3. El backend selecciona automáticamente la mejor API del sistema para el dispositivo, todo detrás de un único ajuste, así que no tienes que ramificar según la versión del SO y tu código permanece igual en todas partes.
Una línea para cambiar
El backend de TLS se selecciona a través de TLSOptions.IOHandler. Para usar el TLS nativo de Apple, asígnale iohAppleTLS. El resto de tu código de red no cambia.
uses
sgcWebSocket, sgcWebSocket_Types;
WSClient.TLS := True;
WSClient.TLSOptions.IOHandler := iohAppleTLS;
WSClient.URL := 'wss://www.esegece.com:2053';
WSClient.Active := True;
En otras plataformas mantienes el backend que mejor encaja: iohOpenSSL funciona en todas partes, iohSChannel es nativo en Windows e iohAndroidTLS es la opción nativa, sin nada que desplegar, en Android. Un pequeño condicional mantiene correcto un único componente cliente en cada destino.
WSClient.TLS := True;
{$IF Defined(IOS) or Defined(MACOS)}
WSClient.TLSOptions.IOHandler := iohAppleTLS; // native, no OpenSSL .dylib
{$ELSEIF Defined(ANDROID)}
WSClient.TLSOptions.IOHandler := iohAndroidTLS; // native, no OpenSSL .so
{$ELSEIF Defined(MSWINDOWS)}
WSClient.TLSOptions.IOHandler := iohSChannel; // native on Windows
{$ELSE}
WSClient.TLSOptions.IOHandler := iohOpenSSL; // OpenSSL elsewhere
{$ENDIF}
WSClient.URL := 'wss://www.esegece.com:2053';
WSClient.Active := True;
Ninguna .dylib de OpenSSL que desplegar
Con el backend nativo no hay OpenSSL que empaquetar, hacer coincidir en versión ni parchear. La pila de TLS viene con el sistema operativo, así que la app es más ligera y libre de una dependencia criptográfica de terceros. Para los envíos a la App Store esto también significa una biblioteca nativa menos que justificar, y tu política de TLS sigue la de Apple en lugar de una compilación de biblioteca que congelaste hace meses. Las correcciones de seguridad llegan a través de las actualizaciones del SO.
TLS 1.3 con repliegue automático
El único ajuste iohAppleTLS elige la API del sistema adecuada para cada dispositivo. En macOS 10.14+ e iOS 12+ usa Network.framework, que aporta TLS 1.3. En sistemas más antiguos recurre a Secure Transport, que llega como máximo hasta TLS 1.2. Tú no escribes ninguna comprobación de versión, el backend selecciona la ruta y tu código es idéntico en ambos casos.
Un cliente TLS completo
Este es un cliente completo, no uno recortado. Usa el almacén de confianza del sistema, realiza la verificación de SNI y del nombre de host, y expone una retrollamada OnAppleTLSVerifyPeer para que puedas inspeccionar el certificado y aceptarlo o rechazarlo tú mismo. Puedes confiar en una autoridad privada con una CA raíz personalizada a través de RootCertFile, presentar un certificado de cliente para TLS mutuo con CertFile y Password, y anunciar protocolos de aplicación como http/1.1 a través de ALPN.
WSClient.TLS := True;
WSClient.TLSOptions.IOHandler := iohAppleTLS;
WSClient.TLSOptions.VerifyCertificate := True;
WSClient.TLSOptions.ALPNProtocols.Add('http/1.1');
WSClient.TLSOptions.RootCertFile := ''; // optional custom CA (PEM/DER)
WSClient.TLSOptions.CertFile := ''; // optional client cert (PKCS#12) for mTLS
WSClient.TLSOptions.Password := ''; // client cert password
WSClient.OnAppleTLSVerifyPeer := DoVerifyPeer; // optional custom validation
WSClient.Host := 'your.server.com';
WSClient.Port := 443;
WSClient.Active := True;
La retrollamada verify-peer te da el sujeto del certificado y su huella SHA-256, el resultado de la evaluación de confianza, y un indicador Accept que estableces para permitir o bloquear la conexión. Es el lugar natural para fijar un certificado o aplicar tu propia política sobre la decisión de confianza del sistema.
Funciona con los componentes que ya usas
El backend se sitúa detrás de 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 de la misma manera. Si tu código ya configura TLSOptions, habilitar el TLS nativo de Apple es una única asignación, sin cambios en cómo te conectas o intercambias datos.
La misma idea en Android
Si también tienes como objetivo Android, el backend acompañante iohAndroidTLS hace allí el mismo trabajo: usa el propio TLS de Android a través del SSLEngine de la plataforma, sin ninguna .so de OpenSSL que desplegar. El patrón es idéntico, eliges el gestor nativo por plataforma. Los detalles están en la página Native Android TLS.
Disponibilidad
El TLS nativo de Apple (iohAppleTLS) se incluye en la edición Enterprise de sgcWebSockets. Para el desglose completo de los cuatro backends de TLS, OpenSSL en todas las plataformas, SChannel en Windows, y los gestores nativos de Android y Apple, consulta la sección SSL / TLS y la página Native Apple TLS.
Descárgalo desde la página de descarga de sgcWebSockets, u obténlo a través de GetIt o de tu cuenta registrada.
¿Preguntas, comentarios o ayuda para migrar una app de iOS o macOS fuera de OpenSSL? Ponte en contacto, recibirás una respuesta de las personas que escribieron el código.
