SChannel Indy Server Delphi

· Recursos

Por anos, desenvolvedores Delphi que implantavam servidores com TLS no Windows enfrentaram o mesmo desafio: empacotar as bibliotecas OpenSSL corretas com sua aplicação. Incompatibilidades de versão, DLLs ausentes em tempo de execução e atualizações manuais após avisos de segurança têm sido uma fonte constante de dificuldades em ambientes de produção.

A partir do sgcWebSockets 2026.3.0, os componentes de servidor baseados em Indy — TsgcWebSocketServer e TsgcWebSocketHTTPServer — podem usar o Windows SChannel (Secure Channel) como provedor TLS. O SChannel é a implementação TLS nativa do Windows, integrada em todas as versões do Windows. Não requer DLLs externas, integra-se diretamente com o Windows Certificate Store e recebe patches de segurança automaticamente pelo Windows Update.

Este artigo mostra como configurar e implantar servidores baseados em SChannel em suas aplicações Delphi.

Por que usar SChannel no servidor?

O SChannel elimina os problemas de implantação mais comuns associados ao TLS em servidores Windows.

Zero Dependências Externas
O SChannel está integrado ao Windows. Sem libeay32.dll, sem ssleay32.dll, sem libcrypto, sem libssl. Seu instalador fica menor e a implantação fica mais simples.
Windows Certificate Store
Use certificados já instalados e gerenciados pelo sistema operacional. Sem necessidade de copiar arquivos PEM — basta referenciar o certificado pelo seu thumbprint.
Atualizações de Segurança Automáticas
Melhorias de TLS e patches de segurança são aplicados pelo Windows Update. Sem atualizações manuais de biblioteca, sem reimplantações por CVEs do OpenSSL.

Início Rápido — 5 Passos

Habilitar o SChannel no seu servidor requer apenas algumas alterações de propriedade:

  1. Habilitar SSL — Defina a propriedade SSL como True.
  2. Selecionar SChannel como IOHandler — Defina SSLOptions.IOHandler como iohSChannel.
  3. Escolher uma versão TLS — Defina SSLOptions.Version para a versão desejada. tls1_2 é recomendado para a maioria das implantações.
  4. Definir a porta — Defina SSLOptions.Port e Port para a porta de escuta (tipicamente 443).
  5. Configurar o certificado — Forneça um certificado via Windows Certificate Store (thumbprint) ou um arquivo PFX.

Método 1: Certificado do Windows Store

Se o seu certificado já está instalado no Windows Certificate Store, você só precisa fornecer o thumbprint. Esta é a abordagem recomendada para servidores de produção e serviços Windows.

Encontrar o Thumbprint do Certificado

Abra o PowerShell e liste os certificados no repositório pessoal do computador local:

PS C:\> dir cert:\localmachine\my
Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my
Thumbprint                                Subject
----------                                -------
C12A8FC8AE668F866B48F23E753C93D357E9BE10  CN=*.mydomain.com
A7F3D2E1B9C84A6D5E0F123456789ABCDEF01234  CN=api.mydomain.com

Copie o thumbprint hexadecimal de 40 caracteres do certificado que deseja usar.

Configurar o Servidor

var
  oServer: TsgcWebSocketHTTPServer;
begin
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  // Enable TLS with SChannel
  oServer.SSL := True;
  oServer.SSLOptions.IOHandler := iohSChannel;
  oServer.SSLOptions.Version := tls1_2;
  oServer.SSLOptions.Port := 443;
  oServer.Port := 443;
  // Point to the certificate in the Windows Store
  oServer.SSLOptions.SChannel_Options.CertHash :=
    'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
  oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
  oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
  // Start listening
  oServer.Active := True;
end;

Dica para produção. Sempre use scspStoreLocalMachine para servidores implantados como serviços Windows. O repositório do computador local é acessível independentemente de qual conta de usuário executa o serviço, enquanto scspStoreCurrentUser está vinculado ao perfil do usuário logado.

Opções do Certificate Store

Nome do Store Constante Contém
Personal (MY) scsnMY Certificados de servidor com chaves privadas
Root scsnRoot Autoridades de certificação raiz confiáveis
Trust scsnTrust Certificados confiáveis
CA scsnCA Autoridades de certificação intermediárias

Método 2: Certificado de um Arquivo PFX

Se você tem um arquivo de certificado PFX (.pfx ou .p12), pode carregá-lo diretamente sem instalá-lo no Windows Certificate Store. O SChannel importará o certificado na inicialização do servidor.

var
  oServer: TsgcWebSocketHTTPServer;
begin
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  // Enable TLS with SChannel
  oServer.SSL := True;
  oServer.SSLOptions.IOHandler := iohSChannel;
  oServer.SSLOptions.Version := tls1_2;
  oServer.SSLOptions.Port := 443;
  oServer.Port := 443;
  // Load certificate from a PFX file
  oServer.SSLOptions.CertFile := 'c:\certificates\server.pfx';
  oServer.SSLOptions.Password := 'mypassword';
  // Start listening
  oServer.Active := True;
end;

Tem arquivos PEM? O SChannel aceita apenas o formato PFX. Converta seu certificado PEM e chave privada com um único comando:

openssl pkcs12 -inkey server.key -in server.crt -export -out server.pfx

Referência de SChannel_Options

A sub-propriedade SSLOptions.SChannel_Options expõe todas as configurações específicas do SChannel para o servidor.

Propriedade Tipo Descrição
CertHash String O thumbprint hexadecimal de 40 caracteres de um certificado instalado no Windows Certificate Store.
CertStoreName Enum Qual store pesquisar: scsnMY (Personal), scsnRoot, scsnTrust, scsnCA.
CertStorePath Enum Local do store: scspStoreLocalMachine (recomendado) ou scspStoreCurrentUser.
CipherList String Lista de algoritmos de cifra permitidos, separados por dois-pontos (ex.: CALG_AES_256:CALG_AES_128). Deixe vazio para usar os padrões do Windows.
UseLegacyCredentials Boolean Quando True, usa a estrutura legada SCHANNEL_CRED. Habilite para Windows Server 2019 e versões anteriores.

Configuração da Versão TLS

Controle qual versão do protocolo TLS o servidor aceita por meio da propriedade SSLOptions.Version.

Valor Protocolo Recomendação
tls1_3 TLS 1.3 Maior segurança. Use quando todos os clientes suportarem.
tls1_2 TLS 1.2 Recomendado para a maioria das implantações de produção.
tls1_1 TLS 1.1 Legado. Evite, a menos que seja exigido por clientes antigos.
tls1_0 TLS 1.0 Descontinuado. Não recomendado.
tlsUndefined TLS 1.0 – 1.2 Aceita qualquer versão de TLS 1.0, 1.1 ou 1.2.
// Enforce TLS 1.2 minimum for modern security
oServer.SSLOptions.Version := tls1_2;
// Or use TLS 1.3 for the strongest encryption
oServer.SSLOptions.Version := tls1_3;

Configuração de Cipher Suites

Por padrão, o SChannel usa a configuração de cifras do sistema gerenciada pelo Windows. Para ambientes que exigem maior controle, você pode restringir os algoritmos permitidos.

// Restrict to AES-256 and AES-128 only
oServer.SSLOptions.SChannel_Options.CipherList :=
  'CALG_AES_256:CALG_AES_128';

Deixe a propriedade CipherList vazia para aceitar a configuração padrão de cifras do Windows. Isso é adequado para a maioria das implantações, pois o Windows mantém um conjunto padrão seguro que é atualizado pelo Windows Update.

Cuidado. Restringir cifras de forma muito agressiva pode impedir que alguns clientes se conectem. Teste exaustivamente com a base de clientes esperada antes de implantar listas de cifras personalizadas em produção.

Compatibilidade com Windows Legado

O componente usa a API moderna SCH_CREDENTIALS por padrão. Em versões mais antigas do Windows (Server 2019 e anteriores) que não suportam essa API, você pode recorrer à estrutura de credenciais legada.

// Enable legacy mode for Windows Server 2019 and earlier
oServer.SSLOptions.SChannel_Options.UseLegacyCredentials := True;

Na maioria dos casos, o componente detecta a versão do Windows automaticamente e seleciona a API apropriada. Use a propriedade UseLegacyCredentials apenas se o servidor falhar ao iniciar em uma versão mais antiga do Windows.

SChannel vs. OpenSSL — Quando usar cada um

Ambos os provedores TLS são totalmente suportados. A escolha certa depende da sua plataforma de implantação e dos requisitos operacionais.

Recurso SChannel OpenSSL
DLLs externas necessárias Não Sim
Windows Certificate Store Nativo Não suportado
Atualizações de segurança automáticas Sim (Windows Update) Atualização manual da biblioteca
Multiplataforma Somente Windows Windows, Linux, macOS
Formatos de certificado PFX + Windows Store PEM, PFX
TLS 1.0 – 1.3 Sim Sim

Conclusão. Se o seu servidor roda exclusivamente no Windows, o SChannel é a escolha mais simples e fácil de manter. Se você precisar de suporte multiplataforma, use iohOpenSSL. Alternar entre os dois requer apenas a mudança da propriedade IOHandler — nenhuma outra alteração de código é necessária.

Exemplo Completo: Servidor WebSocket Seguro

Um servidor WebSocket completamente configurado usando SChannel com um certificado do Windows Certificate Store.

uses
  sgcWebSocket_Server, sgcWebSocket_Classes;
var
  oServer: TsgcWebSocketHTTPServer;
begin
  oServer := TsgcWebSocketHTTPServer.Create(nil);
  Try
    // Server configuration
    oServer.Port := 443;
    // TLS configuration with SChannel
    oServer.SSL := True;
    oServer.SSLOptions.IOHandler := iohSChannel;
    oServer.SSLOptions.Version := tls1_2;
    oServer.SSLOptions.Port := 443;
    // Certificate from Windows Certificate Store
    oServer.SSLOptions.SChannel_Options.CertHash :=
      'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
    oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
    oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
    // Assign WebSocket event handlers
    oServer.OnConnect := OnClientConnect;
    oServer.OnDisconnect := OnClientDisconnect;
    oServer.OnMessage := OnClientMessage;
    // Start the server
    oServer.Active := True;
    WriteLn('Secure WebSocket server listening on port 443 (SChannel TLS 1.2)');
    WriteLn('Press Enter to stop...');
    ReadLn;
  Finally
    oServer.Active := False;
    oServer.Free;
  End;
end;

Funciona com ambos os componentes de servidor

O SChannel está disponível em ambos os componentes de servidor baseados em Indy. A configuração é idêntica.

Componente Descrição
TsgcWebSocketHTTPServer Servidor WebSocket com servidor HTTP integrado. Ideal para APIs combinadas WebSocket + REST.
TsgcWebSocketServer Servidor WebSocket puro baseado em TCP Indy. Melhor para endpoints WebSocket dedicados.

Notas importantes