TLS nativo do Android no sgcWebSockets: Sem OpenSSL para implantar

· Componentes

Distribuir um aplicativo Android seguro com Delphi ou C++Builder sempre significou uma tarefa extra: incluir libssl.so e libcrypto.so no APK para que o OpenSSL esteja presente em tempo de execução. O sgcWebSockets elimina essa tarefa. Um novo backend TLS nativo, iohAndroidTLS, entrega a criptografia ao próprio Android, de modo que seu aplicativo se conecta via TLS sem nenhuma biblioteca OpenSSL para implantar. Está disponível na edição Enterprise.

Nos bastidores, o backend aciona o próprio javax.net.ssl.SSLEngine da plataforma através de JNI. O sistema operacional realiza o handshake, a criptografia dos registros e a validação do certificado. O sgcWebSockets apenas fornece texto em claro e recebe texto cifrado de volta, o que significa que toda a pilha TLS é a que o Google distribui e corrige junto com o sistema operacional.

Uma linha para mudar

O backend TLS é selecionado através de TLSOptions.IOHandler. Para usar o TLS nativo do Android, defina-o como iohAndroidTLS. Todo o resto do seu código de rede permanece igual.

uses
  sgcWebSocket, sgcWebSocket_Types;

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

Em outras plataformas, você mantém o backend que se adequa: iohOpenSSL funciona em todos os lugares, e iohSChannel é a opção nativa, sem nada a implantar, no Windows. Um pequeno condicional mantém um único componente cliente correto em cada destino.

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;

Sem OpenSSL no APK

Este é o principal benefício. Com o backend nativo, o APK não carrega nenhum libssl.so nem nenhum libcrypto.so. O pacote é menor, e você nunca mais precisa rastrear uma versão do OpenSSL, recompilar por causa de um aviso de segurança ou combinar uma compilação de biblioteca a um dispositivo. A implementação do TLS reside no dispositivo e é mantida pelo Android, de modo que as correções de segurança chegam por meio das atualizações do sistema, em vez de pelo seu ciclo de lançamento.

Isso também elimina uma categoria de problemas de implantação. Não há "library not found", não há incompatibilidade de arquitetura entre o .so incluído e o dispositivo, e não há uma segunda cópia de criptografia a auditar. Você define uma propriedade e distribui.

Um cliente TLS completo, não uma versão reduzida

O backend nativo é um cliente completo. Ele valida o servidor contra o repositório de confiança do sistema Android e realiza a verificação de nome de host, de modo que conexões com autoridades certificadoras públicas funcionam sem nenhuma configuração extra. Ele negocia o TLS 1.3 e oferece suporte a ALPN no Android 10 (API 29) e posterior, o que permite anunciar protocolos de aplicação como http/1.1 durante o handshake.

Como fica por trás da mesma API TLSOptions de todos os outros backends, as propriedades familiares continuam funcionando. VerifyCertificate ativa ou desativa a validação do par, RootCertFile confia em uma autoridade privada, CertFile e Password apresentam um certificado de cliente, e ALPNProtocols lista os 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 com os componentes que você já usa

O backend está conectado ao TLSOptions compartilhado, portanto 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 o seu código já define TLSOptions, adicionar o TLS nativo do Android é uma única atribuição, sem alteração na forma como você abre a conexão, envia ou recebe.

A mesma ideia na Apple

Se você também tem como destino o iOS ou o macOS, o backend complementar iohAppleTLS faz o mesmo trabalho ali: ele usa o próprio TLS da Apple, sem nenhum OpenSSL .dylib para implantar, e alcança o TLS 1.3 através do Network.framework. O padrão é idêntico, você apenas escolhe o handler nativo por plataforma. Você pode ler os detalhes na página Native Apple TLS.

Disponibilidade

O TLS nativo do Android (iohAndroidTLS) é distribuído na edição Enterprise do sgcWebSockets. Para o detalhamento completo dos quatro backends 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 Android TLS.

Baixe a partir da página de download do sgcWebSockets, ou obtenha através do GetIt ou da sua conta registrada.

Dúvidas, comentários ou ajuda para migrar um aplicativo Android para fora do OpenSSL? Entre em contato, você receberá uma resposta das pessoas que escreveram o código.