Os componentes de servidor baseados em Indy (TsgcWebSocketServer, TsgcWebSocketHTTPServer) podem usar Windows SChannel (Secure Channel) como provedor TLS em vez do OpenSSL. O SChannel é a implementação TLS nativa do Windows, portanto não requer nenhuma DLL externa.
Quando um componente servidor tem SSL habilitado e o IOHandler está definido como iohSChannel, o servidor cria uma instância TsgcIdServerIOHandlerSSLSChannel que trata de todas as operações TLS utilizando a API SChannel do Windows. Para cada conexão de cliente recebida, o servidor realiza o handshake TLS através do provedor SChannel, negociando a versão do protocolo, a suíte de cifras e vinculando o certificado configurado.
O SChannel lê os certificados do Windows Certificate Store ou de um arquivo PFX (.pfx / .p12). Nenhum arquivo PEM é necessário e nenhuma biblioteca OpenSSL precisa ser implantada.
Para habilitar o SChannel em um servidor Indy, configure as seguintes propriedades:
1. Defina a propriedade SSL como True.
2. Defina SSLOptions.IOHandler como iohSChannel.
3. Defina SSLOptions.Version com a versão TLS desejada (tls1_2, tls1_3, ...).
4. Defina SSLOptions.Port com a porta usada para conexões seguras.
5. Configure o certificado usando um dos dois métodos descritos abaixo.
A subpropriedade SSLOptions.SChannel_Options expõe as configurações específicas do SChannel:
| Property | Descrição |
| CertHash | O thumbprint (hash hexadecimal) de um certificado instalado no Windows Certificate Store. |
| CertStoreName | Qual repositório de certificados pesquisar: scsnMY (Personal), scsnRoot, scsnTrust, scsnCA. |
| CertStorePath | Local do armazenamento: scspStoreLocalMachine ou scspStoreCurrentUser. |
| CipherList | Lista opcional separada por dois pontos de algoritmos de cifra (por exemplo, CALG_AES_256:CALG_AES_128). Vazio significa usar os padrões do sistema. |
| UseLegacyCredentials | Quando True, utiliza a estrutura legada SCHANNEL_CRED em vez de SCH_CREDENTIALS. Habilite isto para versões mais antigas do Windows que não suportam a API mais recente. |
Além disso, as propriedades gerais de SSLOptions CertFile e Password são usadas ao carregar um certificado de um arquivo PFX.
Se o certificado já estiver instalado no Windows Certificate Store, forneça o thumbprint do certificado e indique onde ele está localizado.
Para encontrar o thumbprint, abra o PowerShell e execute:
dir cert:\localmachine\my
A coluna Thumbprint mostra o hash hexadecimal de que você precisa.
Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my
Thumbprint Subject
---------- -------
C12A8FC8AE668F866B48F23E753C93D357E9BE10 CN=*.mydomain.com
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
oServer.SSLOptions.SChannel_Options.CertHash := 'C12A8FC8AE668F866B48F23E753C93D357E9BE10';
oServer.SSLOptions.SChannel_Options.CertStoreName := scsnMY;
oServer.SSLOptions.SChannel_Options.CertStorePath := scspStoreLocalMachine;
oServer.Active := True;
Se você tem um arquivo de certificado PFX (.pfx ou .p12), defina as propriedades CertFile e Password em SSLOptions. O SChannel importará o certificado na inicialização.
oServer := TsgcWebSocketHTTPServer.Create(nil);
oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.Version := tls1_2;
oServer.SSLOptions.Port := 443;
oServer.Port := 443;
oServer.SSLOptions.CertFile := 'c:\certificates\server.pfx';
oServer.SSLOptions.Password := 'mypassword';
oServer.Active := True;
Se você possui um certificado PEM e uma chave privada, converta-os primeiro para o formato PFX utilizando OpenSSL:
openssl pkcs12 -inkey server.key -in server.crt -export -out server.pfx
Utilize a propriedade SSLOptions.Version para controlar qual versão do TLS o servidor aceita:
| Value | Descrição |
| tls1_0 | TLS 1.0 (não recomendado) |
| tls1_1 | TLS 1.1 |
| tls1_2 | TLS 1.2 (recomendado) |
| tls1_3 | TLS 1.3 |
| tlsUndefined | Aceitar TLS 1.0, 1.1 e 1.2 |
Por padrão, o SChannel utiliza a configuração de cifras do sistema. Você pode restringir as cifras permitidas definindo SChannel_Options.CipherList como uma lista de nomes de algoritmos separados por dois-pontos, por exemplo:
CALG_AES_256:CALG_AES_128
Deixe esta propriedade vazia para utilizar os padrões do Windows.
O Windows Server 2019 e anteriores podem não suportar a nova API SCH_CREDENTIALS. Se o servidor falhar ao iniciar em uma versão mais antiga do Windows, defina SChannel_Options.UseLegacyCredentials como True para utilizar a estrutura legada SCHANNEL_CRED em vez dela.
O componente detecta a versão do Windows automaticamente na maioria dos casos, mas você pode forçar o modo legacy se necessário.