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:
- Habilitar SSL — Defina a propriedade
SSLcomoTrue. - Selecionar SChannel como IOHandler — Defina
SSLOptions.IOHandlercomoiohSChannel. - Escolher uma versão TLS — Defina
SSLOptions.Versionpara a versão desejada.tls1_2é recomendado para a maioria das implantações. - Definir a porta — Defina
SSLOptions.PortePortpara a porta de escuta (tipicamente 443). - 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
- Somente Windows. O SChannel é uma API Windows. Para servidores multiplataforma (Linux, macOS), use OpenSSL (
iohOpenSSL). - Chave privada obrigatória. O certificado do servidor deve incluir sua chave privada. Ao usar o método do Windows Certificate Store, o certificado deve ter sido importado com sua chave privada.
- Somente formato PFX. O SChannel aceita arquivos de certificado PFX (.pfx / .p12). Se você tem arquivos PEM, converta-os para PFX primeiro usando o comando
openssl pkcs12. - Store do computador local para serviços. Use
scspStoreLocalMachinepara servidores de produção, de modo que o certificado esteja disponível independentemente da conta de usuário. - Disponibilidade por edição. O SChannel no lado do servidor está disponível nas edições Professional, Enterprise e All-Access do sgcWebSockets.
