Ustawienie TLSOptions.VerifyCertificate na True potwierdza, że łańcuch certyfikatów serwera jest zaufany i że wskazuje hosta, z którym nawiązywane jest połączenie. Nie mówi natomiast nic o tym, czy ten certyfikat został unieważniony od chwili jego wystawienia.
Ta luka ma znaczenie: skradziony klucz prywatny, którego certyfikat został unieważniony, ale jeszcze nie wygasł, nadal uwierzytelnia się pomyślnie, a jest to dokładnie ten przypadek, któremu ma zapobiegać unieważnianie. Stan unieważnienia jest sprawdzany tylko wtedy, gdy zostanie to zażądane, za pomocą TLSOptions.SChannel_Options.Revocation.
oClient.TLS := True;
oClient.TLSOptions.IOHandler := iohSChannel;
oClient.TLSOptions.VerifyCertificate := True;
oClient.TLSOptions.SChannel_Options.Revocation.Check := scrcChainExcludeRoot;
Stan jest pobierany podczas budowania łańcucha certyfikatów, co oznacza, że punkt dystrybucji CRL lub responder OCSP wskazany przez certyfikat jest odpytywany w trakcie uzgadniania. Dlatego to sprawdzanie jest domyślnie wyłączone: jego włączenie dodaje ruch sieciowy do każdego nowego połączenia.
Określa, dla jakiej części łańcucha pobierany jest stan unieważnienia.
| scrcDisabled | Wartość domyślna. Stan unieważnienia nie jest pobierany ani wymagany. |
| scrcEndCertificate | Sprawdzany jest tylko certyfikat serwera. Najtańsza opcja, jedno zapytanie na połączenie. |
| scrcChainExcludeRoot | Sprawdzane są certyfikat serwera i certyfikaty pośrednie, certyfikat główny nie. Zwykły wybór, ponieważ samopodpisany certyfikat główny rzadko publikuje listę CRL dla samego siebie. |
| scrcChain | Cały łańcuch wraz z certyfikatem głównym. |
Liczba milisekund przeznaczona na całe pobranie informacji o unieważnieniu, a nie na pojedynczy adres URL, dzięki czemu responder, który nie odpowiada, nie może zablokować uzgadniania. Wartość domyślna to 5000. Wartość zero pozostawia w mocy domyślne ustawienie systemu Windows, które może być znacznie dłuższe.
Przy wartości True używane są wyłącznie dane o unieważnieniu, które system Windows ma już w pamięci podręcznej, a uzgadnianie nigdy nie sięga do sieci, więc nigdy nie jest opóźniane. Pusta pamięć podręczna pozostawia wówczas stan nieznany, o czym rozstrzyga IgnoreNoRevocationCheck. Wartość domyślna to False.
Rozstrzyga, co się dzieje, gdy nie udało się połączyć z responderem. Wartość domyślna to True, czyli zaakceptowanie certyfikatu, co odpowiada łagodnemu zachowaniu (soft-fail) stosowanemu przez przeglądarki internetowe. Ustaw ją na False, aby zamiast tego odrzucać połączenie. Odrzucanie jest bardziej restrykcyjne, ale uzależnia każde połączenie od dostępności respondera, więc awaria respondera staje się awarią Twojej aplikacji.
Rozstrzyga, co się dzieje, gdy certyfikat nie publikuje ani punktu dystrybucji CRL, ani respondera OCSP, więc jego stanu nie da się ustalić. Wartość domyślna to True, czyli zaakceptowanie go.
Żadna z właściwości Ignore nigdy nie akceptuje certyfikatu zwróconego jako potwierdzony jako unieważniony. Taki wynik jest zawsze odrzucany.
Gdy połączenie zostaje odrzucone, przyczyna trafia do zdarzenia OnSChannelVerifyPeer jako jedna z poniższych:
| ecCryptRevoked | Certyfikat został unieważniony przez wystawcę. Zawsze odrzucany. |
| ecCryptRevocationOffline | Nie udało się połączyć z responderem. Odrzucany tylko wtedy, gdy IgnoreRevocationOffline ma wartość False. |
| ecCryptNoRevocationCheck | Certyfikat nie publikuje żadnych informacji o unieważnieniu. Odrzucany tylko wtedy, gdy IgnoreNoRevocationCheck ma wartość False. |
Ustawienie TLSOptions.Preset na tlspSecureDefaults włącza sprawdzanie jako scrcChainExcludeRoot, wraz z pozostałymi zaostrzonymi ustawieniami domyślnymi, i zachowuje oba ustawienia łagodnego niepowodzenia, dzięki czemu jego włączenie nie psuje połączenia, które wcześniej działało. Zakres wybrany samodzielnie przed zastosowaniem presetu pozostaje nienaruszony.
oClient.TLSOptions.Preset := tlspSecureDefaults;