SSL de servidor | Revocación de certificados de cliente en SChannel

Establecer SSLOptions.VerifyCertificate en True hace que el servidor solicite un certificado a cada cliente entrante y valide la cadena que presenta. Esa validación determina que la cadena del cliente es de confianza. No dice nada sobre si el certificado de cliente ha sido revocado desde que se emitió.

Esa carencia importa siempre que el certificado sea la credencial: se pierde un portátil o un empleado se marcha, se revoca el certificado que se le había emitido y, hasta el día en que caduque, sigue abriendo una sesión en su servidor. La revocación solo se comprueba cuando se solicita, mediante SSLOptions.SChannel_Options.Revocation.

La configuración de revocación se lee mientras se valida un certificado de cliente, por lo que no hace nada a menos que SSLOptions.VerifyCertificate sea True, que es lo que hace que el servidor solicite un certificado de cliente en primer lugar. Que un cliente que no presenta ningún certificado sea rechazado o admitido es una decisión aparte, que toma SSLOptions.VerifyCertificate_Options.FailIfNoCertificate.


oServer.SSL := True;
oServer.SSLOptions.IOHandler := iohSChannel;
oServer.SSLOptions.VerifyCertificate := True;
oServer.SSLOptions.VerifyCertificate_Options.FailIfNoCertificate := True;
oServer.SSLOptions.SChannel_Options.Revocation.Check := scrcChainExcludeRoot;

El estado se obtiene mientras se construye la cadena de certificados, por lo que el punto de distribución de CRL o el respondedor OCSP indicado por el certificado de cliente se contacta durante el protocolo de enlace. Por eso la comprobación está desactivada de forma predeterminada: coloca una petición saliente en el camino de cada conexión que el servidor acepta.

Check

Selecciona en qué parte de la cadena del cliente 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 propio certificado de cliente. La opción más económica, una consulta por conexión.
scrcChainExcludeRoot Se comprueban el certificado de cliente y los certificados intermedios que lo emitieron, la raíz no. La opción habitual, porque la raíz de la CA que emite sus certificados de cliente 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 mientras el servidor lo espera. 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 una conexión entrante nunca se retrasa por un respondedor. 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 de cliente, que es el comportamiento de fallo permisivo. Establézcalo en False para rechazarlo en su lugar. Rechazar es más estricto, pero hace que cada nueva conexión dependa de que el respondedor sea accesible desde el servidor, por lo que una caída del respondedor se convierte en una caída para todos sus clientes.

IgnoreNoRevocationCheck

Decide qué ocurre cuando el certificado de cliente 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. Los certificados emitidos por una CA interna con frecuencia no llevan información de revocación, así que establezca esta opción en False solo cuando sepa que todos los certificados que entrega a un cliente publican esa información.

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

Estados notificados

Cuando la comprobación de la cadena rechaza a un cliente, el motivo es uno de los siguientes:

ecCryptRevoked El certificado de cliente 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 de cliente no publica información de revocación. Solo se rechaza cuando IgnoreNoRevocationCheck es False.

Valores predeterminados seguros

Establecer SSLOptions.Preset en tlspSecureDefaults habilita la comprobación como scrcChainExcludeRoot en el servidor, igual que el mismo preset ya aplicaba en el cliente, y mantiene las dos opciones de fallo permisivo, de modo que un cliente que antes se admitía se sigue admitiendo. Un ámbito que usted mismo haya elegido antes de aplicar el preset se deja intacto.


oServer.SSLOptions.Preset := tlspSecureDefaults;

Notas