Quando invochiamo un Web Service o utilizziamo le classi HttpWebRequest o WebClient su un sito protetto con SSL ma con certificato non valido (scaduto, emesso da una certification authority non fidata, oppure che non combacia col sito sul quale è usato) viene generata un'eccezione.
Una soluzione per risolvere il problema al volo e poter fare debug può essere quella di creare una classe che implementa l'interfaccia ICertificatePolicy e ritornare true per accettare ogni tipo di certificato:
public class AccettaTutto : ICertificatePolicy
{
public bool CheckValidationResult(ServicePoint sPoint,
X509Certificate cert, WebRequest wRequest,int certProb)
{
return true;
}
}
A questo punto è sufficiente assegnare la classe creata alla proprietà CertificatePolicy della classe ServicePointManager :
ServicePointManager.CertificatePolicy = new AccettaTutto();
E' chiaro che una soluzione di questo tipo non dovrebbe mai essere implementata in produzione.
Se per qualsiasi motivo non si riesce ad ottenere un certificato valido, si può sempre implementare l'interfaccia ma verificare il certificato ricevuto e l'errore riscontrato, per accettare solo il caso specifico del proprio certificato, partendo da quello mostrato qui.
Ad esempio si può decidere di accettare un certificato scaduto, il cui nome però corrisponde a quello del sito e che ha una CA trusted, e di rifiutare i certificati che non corrispondono al sito richiesto o emessi da CA non trusted.
Nel caso di interrogazioni a più siti, bisogna memorizzarsi la CertificatePolicy prima di cambiarla, per poterla ripristinare appena finite le interrogazioni al sito col certificato non valido.