Disponibilizar TLS em um app de iOS ou macOS criado com Delphi ou C++Builder costumava significar empacotar o OpenSSL: uma libssl.dylib e uma libcrypto.dylib empacotadas com o app, com versões compatíveis e corrigidas por você. O sgcWebSockets elimina esse requisito. Um novo backend de TLS nativo, iohAppleTLS, usa o próprio TLS da Apple, de modo que seu app se conecta com segurança sem nenhuma .dylib do OpenSSL para implantar. Ele está disponível na edição Enterprise.
Melhor ainda, em sistemas modernos ele lhe oferece TLS 1.3. O backend seleciona automaticamente a melhor API de sistema para o dispositivo, tudo por trás de uma única configuração, de forma que você não precisa ramificar por versão do sistema operacional e seu código permanece o mesmo em todos os lugares.
Uma linha para alternar
O backend de TLS é selecionado por meio de TLSOptions.IOHandler. Para usar o TLS nativo da Apple, defina-o como iohAppleTLS. O restante do seu código de rede não muda.
uses
sgcWebSocket, sgcWebSocket_Types;
WSClient.TLS := True;
WSClient.TLSOptions.IOHandler := iohAppleTLS;
WSClient.URL := 'wss://www.esegece.com:2053';
WSClient.Active := True;
Em outras plataformas você mantém o backend que se encaixa: iohOpenSSL funciona em todos os lugares, iohSChannel é nativo no Windows e iohAndroidTLS é a opção nativa, sem nada para implantar, no Android. Um pequeno condicional mantém um único componente de cliente correto em todos os destinos.
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;
Nenhuma .dylib do OpenSSL para implantar
Com o backend nativo não há OpenSSL para empacotar, compatibilizar versões ou corrigir. A pilha de TLS é fornecida com o sistema operacional, então o app fica mais enxuto e livre de uma dependência criptográfica de terceiros. Para envios à App Store isso também significa uma biblioteca nativa a menos para justificar, e sua política de TLS segue a da Apple em vez de uma compilação de biblioteca que você congelou meses atrás. Correções de segurança chegam por meio das atualizações do sistema operacional.
TLS 1.3 com fallback automático
A única configuração iohAppleTLS escolhe a API de sistema certa por dispositivo. No macOS 10.14+ e iOS 12+ ele usa o Network.framework, que traz o TLS 1.3. Em sistemas mais antigos ele recorre ao Secure Transport, que vai no máximo até o TLS 1.2. Você não escreve nenhuma verificação de versão, o backend seleciona o caminho e seu código é idêntico em ambos.
Um cliente TLS completo
Este é um cliente completo, não uma versão reduzida. Ele usa o armazenamento de confiança do sistema, realiza SNI e verificação de nome de host, e expõe um callback OnAppleTLSVerifyPeer para que você possa inspecionar o certificado e aceitá-lo ou rejeitá-lo por conta própria. Você pode confiar em uma autoridade privada com uma CA raiz personalizada por meio de RootCertFile, apresentar um certificado de cliente para TLS mútuo com CertFile e Password, e anunciar protocolos de aplicação como http/1.1 por meio 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;
O callback de verificação de peer lhe fornece o subject do certificado e sua impressão digital SHA-256, o resultado da avaliação de confiança e um sinalizador Accept que você define para permitir ou bloquear a conexão. É o lugar natural para fixar (pin) um certificado ou aplicar sua própria política por cima da decisão de confiança do sistema.
Funciona com os componentes que você já usa
O backend fica por trás do TLSOptions compartilhado, então não se limita ao cliente WebSocket. Os clientes TCP e HTTP/2 e os demais componentes que expõem TLSOptions o selecionam da mesma forma. Se seu código já configura TLSOptions, habilitar o TLS nativo da Apple é uma única atribuição, sem nenhuma mudança na forma como você se conecta ou troca dados.
A mesma ideia no Android
Se você também tem o Android como destino, o backend complementar iohAndroidTLS faz o mesmo trabalho lá: ele usa o próprio TLS do Android por meio do SSLEngine da plataforma, sem nenhuma .so do OpenSSL para implantar. O padrão é idêntico, você escolhe o handler nativo por plataforma. Os detalhes estão na página Native Android TLS.
Disponibilidade
O TLS nativo da Apple (iohAppleTLS) é fornecido na edição Enterprise do sgcWebSockets. Para o detalhamento completo dos quatro backends de TLS, OpenSSL em todas as plataformas, SChannel no Windows e os handlers nativos do Android e da Apple, consulte a seção SSL / TLS e a página Native Apple TLS.
Baixe na página de download do sgcWebSockets, ou obtenha-o pelo GetIt ou pela sua conta registrada.
Dúvidas, comentários ou ajuda para migrar um app de iOS ou macOS para fora do OpenSSL? Entre em contato, você receberá uma resposta das pessoas que escreveram o código.
