Lavorando con i webservice vi sarà senz'altro capitato di volere testare uno scenario SSL in un ambiente di sviluppo; in questi casi si usa installare sul web server un certificato SSL di prova autogenerato, non quindi trusted da una authority di certificazione, potenzialmente riportante con un Common Name diverso dall'host name del web server...
Questo tipo di scenario produce il seguente errore con le classi proxy generate da Visual Studio:
System.Net.WebException. The underlying connection was closed. Could not establish trust relationship with remote server.
Questo è giusto che accada in uno scenario di produzione ma può essere necessario bypassare il problema in fase di sviluppo o testing.
Il workaround è quello di creare sul client una classe di validazione dei certificati custom che ritorni sempre un esito positivo, e di associarla alla proprietà CertificatePolicy del ServicePointManager prima di effettuare la chiamata.
Ecco il codice per la classe:
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class MyPolicy : ICertificatePolicy {
public bool CheckValidationResult(
ServicePoint srvPoint
, X509Certificate certificate
, WebRequest request
, int certificateProblem) {
//Ritorna sempre True per forzare l'accettazione dei certificati.
return true;
}
}
e quello da scrivere prima di invocare il webmethod:
System.Net.ServicePointManager.CertificatePolicy = new MyPolicy();