SSL de servidor | SChannel para servidores Indy

Los componentes de servidor basados en Indy (TsgcWebSocketServer, TsgcWebSocketHTTPServer) pueden usar Windows SChannel (Secure Channel) como proveedor TLS en lugar de OpenSSL. SChannel es la implementación TLS nativa de Windows, por lo que no requiere DLLs externos.

Cómo funciona

Cuando un componente servidor tiene SSL habilitado y el IOHandler está configurado como iohSChannel, el servidor crea una instancia de TsgcIdServerIOHandlerSSLSChannel que gestiona todas las operaciones TLS mediante la API SChannel de Windows. Para cada conexión de cliente entrante, el servidor realiza el protocolo de enlace TLS a través del proveedor SChannel, negociando la versión del protocolo, el conjunto de cifrado y vinculando el certificado configurado.

SChannel lee certificados del Almacén de certificados de Windows o de un archivo PFX (.pfx / .p12). No se necesitan archivos PEM ni es necesario desplegar bibliotecas OpenSSL.

Configuración

Para habilitar SChannel en un servidor Indy, configure las siguientes propiedades:

1. Establezca la propiedad SSL en True.

2. Establezca SSLOptions.IOHandler en iohSChannel.

3. Establezca SSLOptions.Version a la versión TLS deseada (tls1_2, tls1_3, ...).

4. Establezca SSLOptions.Port en el puerto utilizado para las conexiones seguras.

5. Configure el certificado mediante uno de los dos métodos descritos a continuación.

Propiedades de SChannel_Options

La subpropiedad SSLOptions.SChannel_Options expone la configuración específica de SChannel:

Propiedad Descripción
CertHash La huella digital (hash hexadecimal) de un certificado instalado en el almacén de certificados de Windows.
CertStoreName Almacén de certificados en el que buscar: scsnMY (Personal), scsnRoot, scsnTrust, scsnCA.
CertStorePath Ubicación del almacén: scspStoreLocalMachine o scspStoreCurrentUser.
CipherList Lista opcional de algoritmos de cifrado separados por dos puntos (p. ej. CALG_AES_256:CALG_AES_128). Si está vacío, se usan los valores predeterminados del sistema.
UseLegacyCredentials Cuando es True, utiliza la estructura heredada SCHANNEL_CRED en lugar de SCH_CREDENTIALS. Habilite esta opción para versiones antiguas de Windows que no admiten la API más reciente.

Además, las propiedades generales SSLOptions CertFile y Password se utilizan al cargar un certificado desde un archivo PFX.

Certificado del almacén de Windows

Si el certificado ya está instalado en el Almacén de Certificados de Windows, proporcione la huella digital del certificado e indique dónde se encuentra.

Para encontrar la huella digital, abra PowerShell y ejecute:

dir cert:\localmachine\my

La columna Thumbprint muestra el hash hexadecimal que necesita.


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 desde archivo PFX

Si dispone de un archivo de certificado PFX (.pfx o .p12), establezca las propiedades CertFile y Password en SSLOptions. SChannel importará el certificado al inicio.


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;

Si tiene un certificado PEM y una clave privada, conviértalos primero al formato PFX utilizando OpenSSL:

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

Versión TLS

Use la propiedad SSLOptions.Version para controlar qué versión de TLS acepta el servidor:

Valor Descripción
tls1_0 TLS 1.0 (no recomendado)
tls1_1 TLS 1.1
tls1_2 TLS 1.2 (recomendado)
tls1_3 TLS 1.3
tlsUndefined Aceptar TLS 1.0, 1.1 y 1.2

Lista de cifrados

De forma predeterminada, SChannel utiliza la configuración de cifrado del sistema. Puede restringir los cifrados permitidos estableciendo SChannel_Options.CipherList en una lista de nombres de algoritmos separados por dos puntos, por ejemplo:

CALG_AES_256:CALG_AES_128

Deje esta propiedad vacía para usar los valores predeterminados de Windows.

Credenciales heredadas

Windows Server 2019 y versiones anteriores pueden no admitir la API más reciente SCH_CREDENTIALS. Si el servidor no se inicia en una versión anterior de Windows, establezca SChannel_Options.UseLegacyCredentials a True para usar la estructura heredada SCHANNEL_CRED en su lugar.

El componente detecta la versión de Windows automáticamente en la mayoría de los casos, pero puede forzar el modo heredado si es necesario.

Ventajas sobre OpenSSL

Notas