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