Server SSL | Revoca del certificato client con SChannel

Impostare SSLOptions.VerifyCertificate su True fa sì che il server richieda un certificato a ogni client in entrata e validi la catena presentata. Questa validazione stabilisce che la catena del client è attendibile. Non dice nulla sul fatto che il certificato client sia stato revocato dopo essere stato emesso.

Questa lacuna è importante ovunque il certificato costituisca la credenziale: un portatile viene smarrito oppure un dipendente lascia l'azienda, il certificato emesso a suo nome viene revocato e, fino al giorno della scadenza, continua ad aprire una sessione sul server. La revoca viene verificata solo quando viene richiesta esplicitamente, tramite SSLOptions.SChannel_Options.Revocation.

Le impostazioni di revoca vengono lette durante la validazione di un certificato client, quindi non hanno alcun effetto se SSLOptions.VerifyCertificate non è True, che è ciò che induce il server a richiedere un certificato client. Se un client che non presenta alcun certificato debba essere rifiutato o lasciato passare è una decisione a parte, presa da 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;

Lo stato viene recuperato durante la costruzione della catena di certificati, quindi il punto di distribuzione CRL o il responder OCSP indicato dal certificato client viene contattato durante l'handshake. Per questo motivo il controllo è disabilitato per impostazione predefinita: inserisce una richiesta in uscita nel percorso di ogni connessione accettata dal server.

Check

Seleziona quale parte della catena del client 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 client stesso. L'opzione meno costosa, una sola ricerca per connessione.
scrcChainExcludeRoot Vengono verificati il certificato client e i certificati intermedi che lo hanno emesso, la radice no. La scelta abituale, perché la radice della CA che emette i certificati client 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 mentre il server lo attende. 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 una connessione in entrata non viene mai ritardata da un responder. 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 client, che è il comportamento soft-fail. Impostarlo su False per rifiutarlo. Il rifiuto è più rigoroso, ma rende ogni nuova connessione dipendente dalla raggiungibilità del responder dal server, quindi un'interruzione del responder diventa un'interruzione per tutti i client.

IgnoreNoRevocationCheck

Decide cosa succede quando il certificato client 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. I certificati emessi da una CA interna spesso non contengono informazioni di revoca, quindi impostare questa proprietà su False solo dopo avere accertato che ogni certificato consegnato a un client ne pubblichi una.

Nessuna delle due proprietà Ignore accetta mai un certificato risultato confermato revocato. Questo esito viene sempre rifiutato e l'handshake fallisce.

Stati segnalati

Quando la verifica della catena rifiuta un client, il motivo è uno dei seguenti:

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

Impostazioni predefinite sicure

Impostare SSLOptions.Preset su tlspSecureDefaults abilita il controllo come scrcChainExcludeRoot sul server, in linea con quanto lo stesso preset applicava già sul client, e mantiene le due impostazioni soft-fail, quindi un client che prima veniva ammesso continua a essere ammesso. Un ambito scelto autonomamente prima di applicare il preset resta invariato.


oServer.SSLOptions.Preset := tlspSecureDefaults;

Note