Server SSL | SChannel for Indy Servers

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.

Como funciona

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.

Configuração

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.

Propriedades de SChannel_Options

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.

Certificado do Windows Store

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;

Certificado a partir de arquivo PFX

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

Versão TLS

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

Cipher List

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.

Legacy Credentials

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.

Vantagens em relação ao OpenSSL

Notas