Certificados SChannel

· Características

Desde sgcWebSockets 4.4.7 se admite el uso de certificados usando SChannel como librería criptográfica.

La implementación de SChannel admite 2 tipos de autenticación con certificado:

1. Usando un certificado PFX

2. Estableciendo el Hash Thumbprint de un certificado ya instalado en el sistema Windows.

Certificado PFX 

Un certificado PFX es un archivo que contiene el certificado y la clave privada; a veces tienes un certificado en formato PEM, así que antes de usarlo debes convertirlo a PFX.

Usa el siguiente comando openssl para convertir un certificado PEM a PFX

openssl pkcs12 -inkey certificate-pem.key -in certificate-pem.crt -export -out certificate.pfx

Una vez que el certificado está en formato PFX, solo tienes que desplegar el certificado y establecer en la propiedad TLSOptions.Certificate la ruta al mismo.

 

TLSOptions.IOHandler := iohSChannel;
TLSOptions.CertFile := '<certificate path>';
TLSOptions.Password := '<certificate optional password>'; 

Hash Thumbprint

Si el certificado ya está instalado en el almacén de certificados de Windows, solo necesitas conocer el thumbprint del certificado y establecerlo en la propiedad TLSOptions.SChannel_Options.

Encontrar el hash de un certificado es tan fácil en powershell como ejecutar un comando dir sobre el contenedor de certificados.

dir cert:\localmachine\my

El hash es el valor hexadecimal del Thumbprint.

Directory: Microsoft.PowerShell.Security\Certificate::localmachine\my
Thumbprint Subject
---------- -------
C12A8FC8AE668F866B48F23E753C93D357E9BE10 CN=*.mydomain.com

Una vez tengas el valor del Thumbprint, debes establecer en la propiedad TLSOptions.SChannel_Options el hash y la ubicación del certificado.

TLSOptions.IOHandler := iohSChannel;
TLSOptions.SChannel_Options.CertHash := '<certificate thumbprint>';
TLSOptions.SChannel_Options.CertStoreName := '<certificate store name>';
TLSOptions.SChannel_Options.CertStorePath := '<certificate store path>';
TLSOptions.Password := '<certificate optional password>';