Delphi TLS 1.3 sem DLLs do OpenSSL

· Componentes
Delphi TLS 1.3 sem DLLs do OpenSSL

Todo desenvolvedor Delphi que já entregou TLS conhece a rotina. Qual versão do OpenSSL essa máquina tem. Por que o servidor do cliente tem a 1.1 e a máquina de build tem a 3.0. Quais duas DLLs devem ficar ao lado do executável, e o que acontece quando um antivírus remove uma delas. O sgcWebSockets 2026.10 traz uma saída: um motor TLS 1.3 escrito em Object Pascal, dentro da biblioteca, sem nenhuma DLL.

É uma implementação real, não um wrapper: o handshake, a camada de registros, o key schedule e a validação de certificados são todos em Pascal. Um cliente ou um servidor fala TLS sem nada instalado.

Uma única propriedade

oClient := TsgcWebSocketClient.Create(nil);
oClient.URL := 'wss://www.esegece.com:2053';
oClient.TLSOptions.IOHandler := iohNativeTLS;
oClient.Active := True;

Em um servidor, é o mesmo interruptor em SSLOptions:

oServer.SSLOptions.IOHandler := iohNativeTLS;
oServer.SSLOptions.CertFile := 'server.pem';
oServer.SSLOptions.KeyFile := 'server.key';
oServer.SSL := True;

ALPN, S N I e certificados de cliente estão presentes, no handler do Indy e nos servidores I O C P e E P O L L. Nada mais no seu código muda.

Confiando no que a máquina já confia

Um cliente TLS só é tão bom quanto suas âncoras de confiança, e distribuir um cacert.pem que envelhece mal é um problema de manutenção à parte. O motor pode usar as raízes em que o sistema operacional já confia:

oClient.TLSOptions.NativeTLS_Options.UseSystemRoots := True;

No Windows, elas vêm do armazenamento de sistema ROOT; no Linux e Android, do primeiro pacote de certificados encontrado entre os locais habituais. Isso vem desativado por padrão, o que mantém as âncoras de confiança exatamente naquilo que RootCertFile diz.

Pós-quântico, hoje, por causa de amanhã

Um atacante que não consegue quebrar sua sessão TLS hoje ainda pode gravá-la e guardá-la. A pergunta interessante não é se um computador quântico já existe agora, é por quanto tempo o seu tráfego continua sensível. É por isso que o TLS está migrando para a troca de chaves híbrida, em que o segredo compartilhado é seguro enquanto qualquer uma das duas metades resistir.

O motor negocia os grupos híbridos da RFC 10024, e a lista de grupos padrão já começa pelo híbrido:

oClient.TLSOptions.NativeTLS_Options.Groups :=
  'X25519MLKEM768:SecP256r1MLKEM768:X25519';

Os três híbridos são X25519MLKEM768, SecP256r1MLKEM768 e SecP384r1MLKEM1024. As duas listas usam nomes no estilo OpenSSL separados por dois-pontos, e um valor vazio mantém os padrões do motor.

A criptografia por trás disso

A mesma versão adiciona as próprias primitivas pós-quânticas ao pack sgcCrypto, em Object Pascal, sem nenhuma biblioteca externa:

Eles são validados contra os vetores de resposta conhecida do NIST, que acompanham a biblioteca como um conjunto de testes, e não apenas como uma alegação.

Um endurecimento que você não precisa pedir

A mesma leva de mudanças endureceu o lado clássico contra ataques de temporização. As operações com a chave privada RSA usam blinding e uma exponenciação em tempo constante com verificação do resultado, a multiplicação escalar em curva elíptica e a assinatura Ed25519 rodam em tempo constante, e AES e GHASH não indexam mais uma tabela com bytes secretos. As chaves privadas são verificadas na importação, então uma chave que não pertence ao seu certificado é recusada em vez de produzir assinaturas que ninguém consegue verificar, e uma assinatura cuja codificação ASN.1 não é DER mínimo agora é rejeitada em vez de aceita.

Quando usar qual

OpenSSL e SChannel não vão a lugar nenhum, e para muitas aplicações continuam sendo a resposta certa: OpenSSL se você precisa de interoperabilidade TLS 1.2 com algo antigo, SChannel se a política do cliente é que o Windows é dono da criptografia. O motor nativo é para o caso em que a implantação é o problema: um único executável, sem nenhuma DLL ao lado, o mesmo comportamento no Windows e no Linux, e troca de chaves pós-quântica sem esperar a plataforma se atualizar.

Atualização

O motor faz parte do pack sgcCrypto e é selecionado por componente, então nada muda até você definir IOHandler. Um build sem as units de criptografia gera uma mensagem clara em vez de falhar de forma obscura no handshake.

Leia também

Assista ao vídeo

Há um vídeo curto sobre isso no canal da eSeGeCe.

Dúvidas, feedback ou ajuda com a migração? Entre em contato — você receberá uma resposta das pessoas que escreveram o código.