Natywny Apple TLS w sgcWebSockets: TLS 1.3 na iOS i macOS, bez OpenSSL

· Komponenty

Dostarczenie TLS w aplikacji na iOS lub macOS zbudowanej w Delphi lub C++Builder oznaczało dawniej dołączanie OpenSSL: bibliotek libssl.dylib i libcrypto.dylib pakowanych z aplikacją, dopasowanych wersjami i łatanych przez Ciebie. sgcWebSockets eliminuje ten wymóg. Nowy natywny backend TLS, iohAppleTLS, korzysta z własnego TLS firmy Apple, więc Twoja aplikacja łączy się bezpiecznie bez żadnej biblioteki OpenSSL .dylib do wdrożenia. Jest dostępny w edycji Enterprise.

Co więcej, na nowoczesnych systemach daje Ci TLS 1.3. Backend automatycznie wybiera najlepsze systemowe API dla danego urządzenia, a wszystko za jednym ustawieniem, więc nie rozgałęziasz kodu według wersji systemu, a Twój kod pozostaje wszędzie taki sam.

Jedna linijka, by przełączyć

Backend TLS wybiera się przez TLSOptions.IOHandler. Aby użyć natywnego TLS firmy Apple, ustaw go na iohAppleTLS. Reszta Twojego kodu sieciowego się nie zmienia.

uses
  sgcWebSocket, sgcWebSocket_Types;

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

Na innych platformach zachowujesz backend, który pasuje: iohOpenSSL działa wszędzie, iohSChannel jest natywny w systemie Windows, a iohAndroidTLS to natywna, niewymagająca wdrażania niczego opcja na Androidzie. Niewielki warunek utrzymuje jeden komponent klienta poprawnym na każdym celu.

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;

Brak biblioteki OpenSSL .dylib do wdrożenia

Z natywnym backendem nie ma OpenSSL do dołączenia, dopasowania wersji ani łatania. Stos TLS jest dostarczany z systemem operacyjnym, więc aplikacja jest lżejsza i wolna od zależności od zewnętrznej kryptografii. Przy zgłoszeniach do App Store oznacza to także o jedną natywną bibliotekę mniej do uzasadnienia, a Twoja polityka TLS podąża za polityką Apple zamiast za buildem biblioteki zamrożonym wiele miesięcy temu. Poprawki bezpieczeństwa przychodzą wraz z aktualizacjami systemu.

TLS 1.3 z automatycznym fallbackiem

Pojedyncze ustawienie iohAppleTLS dobiera właściwe systemowe API dla każdego urządzenia. Na macOS 10.14+ i iOS 12+ używa Network.framework, który wnosi TLS 1.3. Na starszych systemach wraca do Secure Transport, który osiąga maksimum na poziomie TLS 1.2. Nie piszesz żadnych sprawdzeń wersji, backend sam wybiera ścieżkę, a Twój kod jest identyczny w obu przypadkach.

Kompletny klient TLS

To pełnoprawny klient, a nie okrojony. Korzysta z systemowego magazynu zaufania, wykonuje SNI i weryfikację nazwy hosta oraz udostępnia wywołanie zwrotne OnAppleTLSVerifyPeer, dzięki czemu możesz samodzielnie zbadać certyfikat i go zaakceptować lub odrzucić. Możesz zaufać prywatnemu urzędowi z własnym katalogiem głównym CA poprzez RootCertFile, przedstawić certyfikat klienta dla wzajemnego TLS za pomocą CertFile i Password oraz ogłaszać protokoły aplikacyjne, takie jak http/1.1, poprzez 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;

Wywołanie zwrotne verify-peer daje Ci podmiot certyfikatu i jego odcisk SHA-256, wynik oceny zaufania oraz flagę Accept, którą ustawiasz, by zezwolić na połączenie lub je zablokować. To naturalne miejsce, by przypiąć certyfikat lub zastosować własną politykę na bazie systemowej decyzji o zaufaniu.

Działa z komponentami, których już używasz

Backend kryje się za współdzielonymi TLSOptions, więc nie jest ograniczony do klienta WebSocket. Klienci TCP i HTTP/2 oraz pozostałe komponenty udostępniające TLSOptions wybierają go w ten sam sposób. Jeśli Twój kod już konfiguruje TLSOptions, włączenie natywnego Apple TLS to pojedyncze przypisanie, bez zmiany sposobu łączenia się czy wymiany danych.

Ta sama idea na Androidzie

Jeśli celujesz także w Androida, towarzyszący backend iohAndroidTLS wykonuje tam to samo zadanie: korzysta z własnego TLS Androida poprzez platformowy SSLEngine, bez żadnej biblioteki OpenSSL .so do wdrożenia. Wzorzec jest identyczny, wybierasz natywną obsługę dla każdej platformy. Szczegóły znajdziesz na stronie Native Android TLS.

Dostępność

Natywny Apple TLS (iohAppleTLS) jest dostarczany w edycji Enterprise sgcWebSockets. Pełny przegląd czterech backendów TLS, OpenSSL na każdej platformie, SChannel w systemie Windows oraz natywnych obsług Android i Apple znajdziesz w sekcji SSL / TLS oraz na stronie Native Apple TLS.

Pobierz ze strony pobierania sgcWebSockets albo zdobądź przez GetIt lub swoje zarejestrowane konto.

Pytania, opinie lub pomoc w przeniesieniu aplikacji iOS albo macOS z OpenSSL? Skontaktuj się z nami, a otrzymasz odpowiedź od ludzi, którzy napisali ten kod.