2015-09-08 15 views
5

Si verifica un servizio API REST che esponga un endpoint https://. Recentemente abbiamo cambiato il nostro certificato SSL e diversi utenti, principalmente utenti libcurl e Java, si sono lamentati del fatto che non possono più validare il certificato e che i loro programmi si rifiutano di connettersi al nostro servizio. Altri utenti, inclusi utenti .NET, non hanno riscontrato problemi. Firefox è anche felice di aprire le pagine sul sito con quel certificato.Come si esegue il controllo del certificato SSL più difficile possibile con il codice .NET?

Abbiamo bisogno di creare un codice che convalidi i certificati il ​​modo più difficile possibile prima di utilizzarli in produzione.

ho predisposto un pezzo di codice che crea un oggetto X509Certificate2 per il certificato e poi cerca di X509Chain.Build() da esso:

var certDataArray = File.ReadAllBytes(path); 
var cert = new X509Certificate2(certDataArray, password); 
var chain = new X509Chain(); 
var result = chain.Build(cert); 
var status = chain.ChainStatus; 

Questo codice viene eseguito bene per il nostro certificato precedente (che non è ancora scaduto) e non riesce (Build() restituisce false e X509Chain.ChainStatus contiene un numero di elementi - X509ChainStatusFlags.RevocationStatusUnknown, X509ChainStatusFlags.PartialChain, X509ChainStatusFlags.OfflineRevocation). Quindi sembra che per questo specifico certificato questo controllo sia sufficiente.

È il numero X509Chain.Build() sufficiente a garantire che tutti i nostri utenti possano convalidare il certificato con successo? Sono necessari altri controlli?

+0

Cosa hai modificato nel certificato? Hai usato una nuova CA/emittente? –

+0

@ stephen.vakil Il nuovo certificato proviene da un'altra CA e c'era qualcosa di sbagliato in quell'infrastruttura della CA che impediva una convalida approfondita. Importa davvero? – sharptooth

risposta

3

Il codice X509ChainStausFlags.PartialChain indica che si è verificato un problema. Almeno un certificato nella catena a) non ha un emittente che è già presente negli archivi di certificati locali e b) non ha un'estensione di accesso alle informazioni dell'autorità risolvibile che consente al sistema di scaricare il certificato (sebbene ciò potrebbe anche essere un errore di rete).

Se il certificato mancante è la radice, quindi fornirlo a chain.ChainPolicy.ExtraStore (prima di chiamare Build) cambierebbe X509ChainStatusFlags.PartialChain in X509ChainStatusFlags.UntrustedRoot. Se si tratta di un intermedio, potrebbe portare a un successo nella costruzione della catena.

Il codice OfflineRevocation sembra strano, dal momento che non è stato specificato X509RevocationMode.Offline (almeno non nel proprio frammento qui).

Problemi correlati