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.
Revocation.Check En qué parte de la cadena del certificado de cliente se consulta el estado de revocación: scrcDisabled (predeterminado), scrcEndCertificate, scrcChainExcludeRoot o scrcChain.
Revocation.Timeout Milisegundos permitidos para toda la obtención de CRL y OCSP, no por URL. Valor predeterminado 5000. Cero deja en vigor el valor predeterminado de Windows, que puede ser mucho mayor.
Revocation.CacheOnly Cuando es True, solo se utilizan los datos de revocación que Windows ya tiene en caché y el protocolo de enlace nunca accede a la red. Valor predeterminado False.
Revocation.IgnoreRevocationOffline Acepta el certificado de cliente cuando no se ha podido contactar con el respondedor, el comportamiento de fallo permisivo. Valor predeterminado True. False lo rechaza en su lugar.
Revocation.IgnoreNoRevocationCheck Acepta un certificado de cliente que no publica ningún punto de distribución de CRL ni ningún respondedor OCSP. Valor predeterminado True.

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 := TsgcWebSocketServer.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 := TsgcWebSocketServer.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.

Revocación de certificados de cliente

Cuando el servidor valida certificados de cliente (SSLOptions.VerifyCertificate establecido en True), las subpropiedades SChannel_Options.Revocation deciden si el certificado que presenta un cliente se comprueba también contra su punto de distribución de CRL o su respondedor OCSP. La revocación está desactivada de forma predeterminada. Consulte SSL de servidor | Revocación de certificados de cliente en SChannel para ver la descripción completa de cada opción.

Ventajas sobre OpenSSL

Notas