TsgcWebSocketClient | SChannel Certificate Revocation

Establecer TLSOptions.VerifyCertificate en True determina que la cadena de certificados del servidor es de confianza y que nombra al host al que se está conectando. No dice nada sobre si ese certificado ha sido revocado desde que se emitió.

Esa carencia importa: una clave privada robada cuyo certificado ha sido revocado pero aún no ha caducado sigue autenticándose correctamente, que es precisamente el caso que la revocación existe para cubrir. La revocación solo se comprueba cuando se solicita, mediante TLSOptions.SChannel_Options.Revocation.


oClient.TLS := True;
oClient.TLSOptions.IOHandler := iohSChannel;
oClient.TLSOptions.VerifyCertificate := True;
oClient.TLSOptions.SChannel_Options.Revocation.Check := scrcChainExcludeRoot;

El estado se obtiene mientras se construye la cadena de certificados, lo que significa que el punto de distribución de CRL o el respondedor OCSP indicado por el certificado se contacta durante el protocolo de enlace. Por eso la comprobación está desactivada de forma predeterminada: habilitarla añade tráfico de red a cada nueva conexión.

Check

Selecciona en qué parte de la cadena se consulta el estado de revocación.

scrcDisabled Valor predeterminado. No se obtiene ningún estado de revocación ni se requiere ninguno.
scrcEndCertificate Solo se comprueba el certificado del servidor. La opción más económica, una consulta por conexión.
scrcChainExcludeRoot Se comprueban el certificado del servidor y los certificados intermedios, la raíz no. La opción habitual, porque una raíz autofirmada rara vez publica una CRL de sí misma.
scrcChain Toda la cadena, incluida la raíz.

Timeout

Milisegundos permitidos para toda la obtención de la revocación, no por URL, de modo que un respondedor que no contesta no pueda bloquear el protocolo de enlace. Valor predeterminado 5000. Un valor de cero deja en vigor el valor predeterminado de Windows, que puede ser considerablemente mayor.

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, por lo que nunca se retrasa. Una caché vacía deja entonces el estado como desconocido, lo que decide IgnoreNoRevocationCheck. Valor predeterminado False.

IgnoreRevocationOffline

Decide qué ocurre cuando no se ha podido contactar con el respondedor. Valor predeterminado True, aceptar el certificado, que es el comportamiento de fallo permisivo que utilizan los navegadores web. Establézcalo en False para rechazarlo en su lugar. Rechazar es más estricto, pero hace que cada conexión dependa de que el respondedor sea accesible, por lo que una caída del respondedor se convierte en una caída de su aplicación.

IgnoreNoRevocationCheck

Decide qué ocurre cuando el certificado no publica ningún punto de distribución de CRL ni ningún respondedor OCSP, por lo que su estado no puede establecerse. Valor predeterminado True, aceptarlo.

Ninguna de las dos propiedades Ignore acepta nunca un certificado que se ha devuelto como revocado confirmado. Ese resultado siempre se rechaza.

Errores notificados

Cuando se rechaza la conexión, el motivo llega al evento OnSChannelVerifyPeer como uno de los siguientes:

ecCryptRevoked El certificado ha sido revocado por su emisor. Siempre se rechaza.
ecCryptRevocationOffline No se ha podido contactar con el respondedor. Solo se rechaza cuando IgnoreRevocationOffline es False.
ecCryptNoRevocationCheck El certificado no publica información de revocación. Solo se rechaza cuando IgnoreNoRevocationCheck es False.

Valores predeterminados seguros

Establecer TLSOptions.Preset en tlspSecureDefaults habilita la comprobación como scrcChainExcludeRoot, junto con los demás valores predeterminados reforzados, y mantiene las dos opciones de fallo permisivo, de modo que activarla no rompe una conexión que antes funcionaba. Un ámbito que usted mismo haya elegido antes de aplicar el preset se deja intacto.


oClient.TLSOptions.Preset := tlspSecureDefaults;