Server SSL | SChannel Révocation des certificats clients

Définir SSLOptions.VerifyCertificate sur True amène le serveur à demander un certificat à chaque client entrant et à valider la chaîne qu'il présente. Cette validation établit que la chaîne du client est approuvée. Elle ne dit rien sur le fait que le certificat client ait été révoqué ou non depuis sa délivrance.

Cette lacune est importante partout où le certificat fait office d'identifiant. Un ordinateur portable est perdu ou un employé quitte l'entreprise, le certificat qui lui avait été délivré est révoqué, et jusqu'au jour de son expiration il ouvre toujours une session sur votre serveur. La révocation n'est consultée que lorsqu'elle est demandée, via SSLOptions.SChannel_Options.Revocation.

Les paramètres de révocation sont lus pendant la validation d'un certificat client. Ils n'ont donc aucun effet tant que SSLOptions.VerifyCertificate ne vaut pas True, puisque c'est cette propriété qui amène le serveur à demander un certificat client. Le fait qu'un client qui ne présente aucun certificat soit refusé ou laissé passer relève d'une décision distincte, prise par 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;

Le statut est récupéré pendant la construction de la chaîne de certificats, ce qui signifie que le point de distribution CRL ou le répondeur OCSP nommé par le certificat client est contacté durant le handshake. C'est pourquoi la vérification est désactivée par défaut : elle place une requête sortante sur le chemin de chaque connexion acceptée par le serveur.

Check

Sélectionne quelle partie de la chaîne du client voit son statut de révocation consulté.

scrcDisabled Valeur par défaut. Aucun statut de révocation n'est récupéré et aucun n'est requis.
scrcEndCertificate Seul le certificat client lui-même est vérifié. L'option la moins coûteuse, une seule consultation par connexion.
scrcChainExcludeRoot Le certificat client et les certificats intermédiaires qui l'ont délivré sont vérifiés, la racine ne l'est pas. Le choix habituel, car la racine de l'autorité de certification qui délivre vos certificats clients publie rarement une CRL pour elle-même.
scrcChain Toute la chaîne, y compris la racine.

Timeout

Millisecondes accordées à l'ensemble de la récupération de révocation, et non par URL, de sorte qu'un répondeur qui ne répond pas ne puisse pas bloquer le handshake pendant que le serveur l'attend. Valeur par défaut 5000. Une valeur de zéro laisse la valeur par défaut de Windows en vigueur, qui peut être considérablement plus longue.

CacheOnly

Lorsqu'elle vaut True, seules les données de révocation que Windows a déjà mises en cache sont utilisées et le handshake ne va jamais sur le réseau, de sorte qu'une connexion entrante n'est jamais retardée par un répondeur. Un cache froid laisse alors le statut inconnu, ce que IgnoreNoRevocationCheck décide. Valeur par défaut False.

IgnoreRevocationOffline

Décide de ce qui se passe lorsque le répondeur n'a pas pu être joint. Valeur par défaut True, accepter le certificat client, ce qui correspond au comportement de type soft-fail. Définissez-la sur False pour rejeter à la place. Rejeter est plus strict, mais cela fait dépendre chaque nouvelle connexion de l'accessibilité du répondeur depuis le serveur, de sorte qu'une panne du répondeur devient une panne pour tous vos clients.

IgnoreNoRevocationCheck

Décide de ce qui se passe lorsque le certificat client ne publie aucun point de distribution CRL ni aucun répondeur OCSP, de sorte que son statut ne peut pas être établi. Valeur par défaut True, l'accepter. Les certificats délivrés par une autorité de certification interne ne comportent fréquemment aucune information de révocation, ne définissez donc cette propriété sur False qu'une fois certain que chaque certificat que vous remettez à un client en publie une.

Aucune des deux propriétés Ignore n'accepte jamais un certificat renvoyé comme confirmé révoqué. Ce résultat est toujours rejeté et le handshake échoue.

Statuts signalés

Lorsque la vérification de la chaîne refuse un client, la raison est l'une des suivantes :

ecCryptRevoked Le certificat client a été révoqué par son émetteur. Toujours rejeté.
ecCryptRevocationOffline Le répondeur n'a pas pu être joint. Rejeté uniquement lorsque IgnoreRevocationOffline vaut False.
ecCryptNoRevocationCheck Le certificat client ne publie aucune information de révocation. Rejeté uniquement lorsque IgnoreNoRevocationCheck vaut False.

Valeurs par défaut sécurisées

Définir SSLOptions.Preset sur tlspSecureDefaults active la vérification en tant que scrcChainExcludeRoot sur le serveur, ce qui correspond à ce que le même preset appliquait déjà côté client, et conserve les deux réglages soft-fail, de sorte qu'un client qui était admis auparavant l'est toujours. Une portée que vous avez choisie vous-même avant d'appliquer le preset reste inchangée.


oServer.SSLOptions.Preset := tlspSecureDefaults;

Remarques