TsgcWebSocketClient | SChannel Certificate Revocation

Impostare TLSOptions.VerifyCertificate su True stabilisce che la catena di certificati del server è attendibile e che indica l'host a cui ci si sta connettendo. Non dice nulla sul fatto che quel certificato sia stato revocato dopo essere stato emesso.

Questa lacuna è importante: una chiave privata rubata il cui certificato è stato revocato ma non è ancora scaduto continua ad autenticarsi correttamente, ed è esattamente il caso per cui esiste la revoca. La revoca viene verificata solo quando viene richiesta esplicitamente, tramite TLSOptions.SChannel_Options.Revocation.


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

Lo stato viene recuperato durante la costruzione della catena di certificati, il che significa che il punto di distribuzione CRL o il responder OCSP indicato dal certificato viene contattato durante l'handshake. Per questo motivo il controllo è disabilitato per impostazione predefinita: abilitarlo aggiunge traffico di rete a ogni nuova connessione.

Check

Seleziona quale parte della catena viene sottoposta alla verifica dello stato di revoca.

scrcDisabled Predefinito. Non viene recuperato alcuno stato di revoca e non ne viene richiesto alcuno.
scrcEndCertificate Viene verificato solo il certificato del server. L'opzione meno costosa, una sola ricerca per connessione.
scrcChainExcludeRoot Vengono verificati il certificato del server e i certificati intermedi, la radice no. La scelta abituale, perché una radice autofirmata raramente pubblica una CRL per se stessa.
scrcChain L'intera catena, radice inclusa.

Timeout

Millisecondi consentiti per l'intero recupero delle informazioni di revoca, non per singolo URL, in modo che un responder che non risponde non possa bloccare l'handshake. Il valore predefinito è 5000. Il valore zero lascia in vigore l'impostazione predefinita di Windows, che può essere notevolmente più lunga.

CacheOnly

Quando è True, vengono utilizzati solo i dati di revoca già presenti nella cache di Windows e l'handshake non accede mai alla rete, quindi non subisce mai ritardi. Con la cache vuota lo stato rimane sconosciuto, caso deciso da IgnoreNoRevocationCheck. Il valore predefinito è False.

IgnoreRevocationOffline

Decide cosa succede quando non è stato possibile raggiungere il responder. Il valore predefinito è True, ossia accettare il certificato, che è il comportamento soft-fail utilizzato dai browser web. Impostarlo su False per rifiutarlo. Il rifiuto è più rigoroso, ma rende ogni connessione dipendente dalla raggiungibilità del responder, quindi un'interruzione del responder diventa un'interruzione dell'applicazione.

IgnoreNoRevocationCheck

Decide cosa succede quando il certificato non pubblica alcun punto di distribuzione CRL né alcun responder OCSP, quindi il suo stato non può essere stabilito. Il valore predefinito è True, ossia accettarlo.

Nessuna delle due proprietà Ignore accetta mai un certificato risultato confermato revocato. Questo esito viene sempre rifiutato.

Errori segnalati

Quando la connessione viene rifiutata, il motivo raggiunge l'evento OnSChannelVerifyPeer come uno dei seguenti:

ecCryptRevoked Il certificato è stato revocato dal suo emittente. Sempre rifiutato.
ecCryptRevocationOffline Non è stato possibile raggiungere il responder. Rifiutato solo quando IgnoreRevocationOffline è False.
ecCryptNoRevocationCheck Il certificato non pubblica alcuna informazione di revoca. Rifiutato solo quando IgnoreNoRevocationCheck è False.

Impostazioni predefinite sicure

Impostare TLSOptions.Preset su tlspSecureDefaults abilita il controllo come scrcChainExcludeRoot, insieme alle altre impostazioni predefinite rafforzate, e mantiene le due impostazioni soft-fail, quindi attivarlo non interrompe una connessione che prima funzionava. Un ambito scelto autonomamente prima di applicare il preset resta invariato.


oClient.TLSOptions.Preset := tlspSecureDefaults;