2012-06-27 36 views
19

Sto tentando di effettuare una richiesta tramite SSL. Il certificato è già installato sulla macchina e funziona tramite browser.Errore: C# La connessione sottostante è stata chiusa: Impossibile stabilire la relazione di trust per il canale protetto SSL/TLS

Sto usando questa richiesta:

System.Text.ASCIIEncoding encoding = new System.Text.ASCIIEncoding(); 
byte[] data = encoding.GetBytes(request.Content.OuterXml.ToString()); 
string password = "XXXX"; 
X509Certificate2 cert = new X509Certificate2("c:\\zzzz.p12", password); 
string key = cert.GetPublicKeyString(); 
string certData = Encoding.ASCII.GetString(cert.Export(X509ContentType.Cert)); 

Uri uri = new Uri(request.Url); 
HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(uri); 
myRequest.Credentials = new NetworkCredential(request.User, request.Password.ToString()); 
myRequest.Method = "PUT"; 
myRequest.ContentType = request.ContentType; 
myRequest.ContentLength = data.Length; 
myRequest.ClientCertificates.Add(cert); 

Stream newStream = myRequest.GetRequestStream(); 
newStream.Write(data, 0, data.Length); 
newStream.Close(); 

System.IO.StreamReader st = new StreamReader(((HttpWebResponse)myRequest.GetResponse()).GetResponseStream()); 

Utilizzando questo codice ottengo questo errore:

The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel. ---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure.

Qual è il problema?

+1

un'occhiata a questo post, mayb è u può aiutare a http://stackoverflow.com/questions/703272/could-not-establish-trust-relationship-for-ssl-tls-secure- channel-soap – JohnnBlade

+0

Grazie Johnn Blade –

+0

Possibile duplicato di [C# Ignora errori del certificato?] (http://stackoverflow.com/questions/2675133/c-sharp-ignore-certificate-errors) –

risposta

45

ho risolto il problema con questo:

ServicePointManager.ServerCertificateValidationCallback = new   
RemoteCertificateValidationCallback 
(
    delegate { return true; } 
); 
+13

Questa soluzione potrebbe essere una potenziale minaccia per la sicurezza stanno disattivando la convalida del certificato SSL. Se questo è il codice di produzione, comprendere il rischio del server a cui ci si sta connettendo. – Amzath

+0

Come può essere fatto in Windows Phone 8? ServicePointManager non è nel riferimento http://cmsresources.windowsphone.com/devcenter/en-us/downloads/064028-microsoft-poster.pdf –

+1

Il problema mi è accaduto durante il funneling delle richieste dalla mia app tramite Fiddler. E l'aggiunta del trucco delegato per non convalidare il certificato mi ha aiutato a eseguire correttamente la mia chiamata, nonché a vedere la risposta in Fiddler. –

-3

Questo è il codice cliente, giusto? E stai accedendo a un URL HTTPS, vero? Penso che il problema sia con il certificato del server, che lo stack TLS sul lato client non può validare. Quando ci si connette a quell'URL tramite browser, funziona senza problemi o viene visualizzato un avviso sulla mancata corrispondenza dei certificati?

+0

Sì, questo è un codice client. Si sto accedendo tramite https. Quando mi collego al browser funziona senza problemi e non vedo alcun avvertimento .. –

+0

Se ti senti a tuo agio con gli analizzatori di rete (ad esempio, Wireshark di NetMon) puoi semplicemente annusare il tuo traffico e vedere con quale host stai parlando, che certificato lo fa presente e se l'handshake TLS completa con o senza errori. Altrimenti, il collegamento che hai ottenuto come riferimento è un buon inizio. Se questo non ti aiuta puoi iniziare a versare qui ulteriori e più dettagli della tua configurazione (URL a cui stai accedendo, certificato installato sul server, configurazione di rete - proxy, ecc.) – Kastorskij

0

Assicurarsi che il certificato sia correttamente attendibile. Il certificato di origine è stato aggiunto all'archivio certificati corretto (CA di root attendibili sul computer locale)?

ho incontrato questo errore quando il (proprio fatta) certificato di origine per un (auto firmato) il certificato era stato aggiunto alla radice attendibile di CA per l'utente corrente). Lo spostamento del certificato di root nell'archivio CA principale su Local Machine ha risolto il problema.

Problemi correlati