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.
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.
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.
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.
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;
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
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 |
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.
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.
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.