TLS Apple nativo in sgcWebSockets: TLS 1.3 su iOS e macOS, senza OpenSSL

· Componenti

Distribuire TLS in un'app iOS o macOS realizzata con Delphi o C++Builder significava un tempo includere OpenSSL: una libssl.dylib e una libcrypto.dylib impacchettate con l'app, allineate alla versione e patchate da te. sgcWebSockets elimina questo requisito. Un nuovo backend TLS nativo, iohAppleTLS, usa il TLS proprietario di Apple, così la tua app si connette in modo sicuro senza alcuna .dylib OpenSSL da distribuire. È disponibile nell'edizione Enterprise.

Ancora meglio, sui sistemi moderni ti offre TLS 1.3. Il backend seleziona automaticamente la migliore API di sistema per il dispositivo, il tutto dietro un'unica impostazione, così non devi ramificare in base alla versione del sistema operativo e il tuo codice resta identico ovunque.

Una riga per cambiare

Il backend TLS si seleziona tramite TLSOptions.IOHandler. Per usare il TLS nativo di Apple, impostalo su iohAppleTLS. Il resto del tuo codice di rete non cambia.

uses
  sgcWebSocket, sgcWebSocket_Types;

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

Sulle altre piattaforme mantieni il backend più adatto: iohOpenSSL funziona ovunque, iohSChannel è nativo su Windows e iohAndroidTLS è l'opzione nativa, senza nulla da distribuire, su Android. Una piccola condizionale mantiene corretto un unico componente client su ogni target.

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;

Nessuna .dylib OpenSSL da distribuire

Con il backend nativo non c'è alcun OpenSSL da includere, allineare alla versione o patchare. Lo stack TLS viene fornito con il sistema operativo, così l'app è più snella e libera da una dipendenza crittografica di terze parti. Per le pubblicazioni sull'App Store questo significa anche una libreria nativa in meno da giustificare, e la tua policy TLS segue quella di Apple anziché una build di libreria che hai congelato mesi fa. Le correzioni di sicurezza arrivano tramite gli aggiornamenti del sistema operativo.

TLS 1.3 con fallback automatico

L'unica impostazione iohAppleTLS sceglie l'API di sistema giusta per ogni dispositivo. Su macOS 10.14+ e iOS 12+ usa Network.framework, che porta TLS 1.3. Sui sistemi più datati ripiega su Secure Transport, che si ferma a TLS 1.2. Non scrivi alcun controllo di versione, il backend seleziona il percorso e il tuo codice è identico su entrambi.

Un client TLS completo

Questo è un client completo, non una versione ridotta. Usa il system trust store, esegue la verifica SNI e dell'hostname, ed espone una callback OnAppleTLSVerifyPeer così puoi ispezionare il certificato e accettarlo o rifiutarlo tu stesso. Puoi considerare attendibile un'autorità privata con una CA root personalizzata tramite RootCertFile, presentare un certificato client per il TLS reciproco con CertFile e Password, e annunciare protocolli applicativi come http/1.1 tramite 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 callback verify-peer ti fornisce il subject del certificato e la sua impronta SHA-256, il risultato della valutazione di attendibilità e un flag Accept che imposti per consentire o bloccare la connessione. È il punto naturale per fare il pinning di un certificato o applicare la tua policy sopra la decisione di attendibilità del sistema.

Funziona con i componenti che già usi

Il backend si colloca dietro le TLSOptions condivise, quindi non è limitato al client WebSocket. I client TCP e HTTP/2 e gli altri componenti che espongono TLSOptions lo selezionano allo stesso modo. Se il tuo codice configura già TLSOptions, abilitare il TLS Apple nativo è una singola assegnazione, senza alcun cambiamento nel modo in cui ti connetti o scambi dati.

La stessa idea su Android

Se hai come target anche Android, il backend compagno iohAndroidTLS svolge lì lo stesso lavoro: usa il TLS proprietario di Android tramite l'SSLEngine della piattaforma, senza alcuna .so OpenSSL da distribuire. Il pattern è identico, scegli l'handler nativo per ciascuna piattaforma. I dettagli sono nella pagina Native Android TLS.

Disponibilità

Il TLS Apple nativo (iohAppleTLS) è incluso nell'edizione Enterprise di sgcWebSockets. Per il quadro completo dei quattro backend TLS, OpenSSL su ogni piattaforma, SChannel su Windows e gli handler nativi Android e Apple, vedi la sezione SSL / TLS e la pagina Native Apple TLS.

Scaricalo dalla pagina di download di sgcWebSockets, oppure ottienilo tramite GetIt o il tuo account registrato.

Domande, feedback o aiuto per spostare un'app iOS o macOS via da OpenSSL? Mettiti in contatto, riceverai una risposta dalle persone che hanno scritto il codice.