TsgcWebSocketClient | SChannel Certificate Revocation

Wenn Sie TLSOptions.VerifyCertificate auf True setzen, wird sichergestellt, dass der Zertifikatskette des Servers vertraut wird und dass sie den Host benennt, zu dem die Verbindung hergestellt wird. Darüber, ob dieses Zertifikat seit seiner Ausstellung widerrufen wurde, sagt dies nichts aus.

Diese Lücke ist bedeutsam: Ein gestohlener privater Schlüssel, dessen Zertifikat widerrufen, aber noch nicht abgelaufen ist, authentifiziert sich weiterhin erfolgreich, und genau für diesen Fall gibt es den Widerruf. Der Widerruf wird nur geprüft, wenn dies angefordert wird, über TLSOptions.SChannel_Options.Revocation.


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

Der Status wird abgerufen, während die Zertifikatskette aufgebaut wird. Das bedeutet, dass der vom Zertifikat angegebene CRL-Verteilungspunkt oder OCSP-Responder während des Handshakes kontaktiert wird. Deshalb ist die Prüfung standardmäßig deaktiviert: Ihre Aktivierung erzeugt bei jeder neuen Verbindung zusätzlichen Netzwerkverkehr.

Check

Legt fest, für welchen Teil der Kette der Widerrufsstatus abgefragt wird.

scrcDisabled Standard. Es wird kein Widerrufsstatus abgerufen und keiner benötigt.
scrcEndCertificate Es wird nur das Serverzertifikat geprüft. Die günstigste Option, eine Abfrage pro Verbindung.
scrcChainExcludeRoot Das Serverzertifikat und die Zwischenzertifikate werden geprüft, das Stammzertifikat nicht. Die übliche Wahl, da ein selbstsigniertes Stammzertifikat nur selten eine CRL für sich selbst veröffentlicht.
scrcChain Die gesamte Kette einschließlich des Stammzertifikats.

Timeout

Millisekunden, die für den gesamten Abruf der Widerrufsinformationen zur Verfügung stehen, nicht pro URL, sodass ein Responder, der nicht antwortet, den Handshake nicht blockieren kann. Standard 5000. Der Wert null belässt den Windows-Standardwert in Kraft, der erheblich länger sein kann.

CacheOnly

Bei True werden nur Widerrufsdaten verwendet, die Windows bereits zwischengespeichert hat, und der Handshake greift nie auf das Netzwerk zu, sodass er nie verzögert wird. Bei einem leeren Cache bleibt der Status dann unbekannt, worüber IgnoreNoRevocationCheck entscheidet. Standard False.

IgnoreRevocationOffline

Entscheidet, was geschieht, wenn der Responder nicht erreicht werden konnte. Standard True, das Zertifikat wird akzeptiert, was dem Soft-Fail-Verhalten von Webbrowsern entspricht. Setzen Sie die Eigenschaft auf False, um es stattdessen abzulehnen. Die Ablehnung ist strenger, macht aber jede Verbindung davon abhängig, dass der Responder erreichbar ist, sodass ein Ausfall des Responders zu einem Ausfall Ihrer Anwendung wird.

IgnoreNoRevocationCheck

Entscheidet, was geschieht, wenn das Zertifikat überhaupt keinen CRL-Verteilungspunkt und keinen OCSP-Responder veröffentlicht, sodass sein Status nicht ermittelt werden kann. Standard True, es wird akzeptiert.

Keine der beiden Ignore-Eigenschaften akzeptiert jemals ein Zertifikat, das als bestätigt widerrufen zurückgemeldet wurde. Dieses Ergebnis wird immer abgelehnt.

Gemeldete Fehler

Wenn die Verbindung abgelehnt wird, erreicht der Grund das Ereignis OnSChannelVerifyPeer als einer der folgenden Werte:

ecCryptRevoked Das Zertifikat wurde von seinem Aussteller widerrufen. Wird immer abgelehnt.
ecCryptRevocationOffline Der Responder konnte nicht erreicht werden. Wird nur abgelehnt, wenn IgnoreRevocationOffline False ist.
ecCryptNoRevocationCheck Das Zertifikat veröffentlicht keine Widerrufsinformationen. Wird nur abgelehnt, wenn IgnoreNoRevocationCheck False ist.

Sichere Standardwerte

Das Setzen von TLSOptions.Preset auf tlspSecureDefaults aktiviert die Prüfung als scrcChainExcludeRoot, zusammen mit den übrigen gehärteten Standardwerten, und behält die beiden Soft-Fail-Einstellungen bei, sodass durch das Einschalten keine Verbindung unterbrochen wird, die zuvor funktioniert hat. Ein Umfang, den Sie vor dem Anwenden des Presets selbst gewählt haben, bleibt unverändert.


oClient.TLSOptions.Preset := tlspSecureDefaults;