2012-06-27 20 views
19

Próbuję wysłać żądanie przez SSL. Certyfikat jest już zainstalowany na komputerze i działa przez przeglądarkę.Błąd: C# Podstawowe połączenie zostało zamknięte: Nie można ustanowić relacji zaufania dla bezpiecznego kanału SSL/TLS

Używam tego wniosek:

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()); 

Za pomocą tego kodu otrzymuję ten błąd:

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.

Na czym polega problem?

+1

rzucić okiem na ten post, mayb może pomóc u do http://stackoverflow.com/questions/703272/could-not-establish-trust-relationship-for-ssl-tls-secure- channel-soap – JohnnBlade

+0

Dzięki Johnn Blade –

+0

Możliwy duplikat [C# Ignoruj ​​błędy certyfikatu?] (http://stackoverflow.com/questions/2675133/c-sharp-ignore-certificate-errors) –

Odpowiedz

45

I rozwiązać problem z tym:

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

To rozwiązanie może być potencjalnym zagrożeniem bezpieczeństwa, ponieważ wyłączają sprawdzanie certyfikatu SSL. Jeśli jest to kod produkcyjny, sprawdź ryzyko związane z serwerem, z którym się łączysz. – Amzath

+0

Jak to zrobić w Windows Phone 8? ServicePointManager nie znajduje się w pliku referencyjnym http://cmsresources.windowsphone.com/devcenter/en-us/downloads/064028-microsoft-poster.pdf –

+1

Problem przydarzył mi się podczas kierowania żądań z mojej aplikacji przez Fiddlera. Dodanie delegowanej sztuczki, aby nie potwierdzić certyfikatu, pomogło mi uruchomić telefon z powodzeniem, a także zobaczyć odpowiedź w Skrzypku. –

-3

To jest kod klienta, prawda? Masz dostęp do URL-a HTTPS, prawda? Myślę, że problem dotyczy certyfikatu serwera, którego stos TLS po stronie klienta nie może sprawdzić. Po połączeniu się z tym adresem URL za pomocą przeglądarki działa ono bezproblemowo lub czy pojawia się ostrzeżenie o niezgodności certyfikatu?

+0

Tak, to jest kod klienta. Tak, im dostęp przez https. Kiedy podłączam się do przeglądarki działa to płynnie i nie widzę żadnego ostrzeżenia .. –

+0

Jeśli czujesz się komfortowo z analizatorami sieci (np. Wireshark of NetMon), możesz po prostu wyczuć ruch i zobaczyć, z jakim hostem rozmawiasz, jaki certyfikat to robi obecne i jeśli uzgadnianie TLS zakończy się z błędami lub bez nich. W przeciwnym razie odnośnik, który masz dla odniesienia, jest dobrym początkiem. Jeśli to nie pomoże, możesz zacząć rozlewać tutaj coraz więcej szczegółów dotyczących konfiguracji (adres URL, z którego korzystasz, certyfikat zainstalowany na serwerze, konfiguracja sieci - serwery proxy itp.). – Kastorskij

0

upewnić się, że certyfikat jest właściwie zaufanym. Czy certyfikat główny został dodany do właściwego magazynu certyfikatów (Zaufane główne urzędy certyfikacji na komputerze lokalnym)?

Napotkano ten błąd, gdy (zaufany) główny certyfikat dla certyfikatu (samopodpisanego) został dodany do zaufanych głównych urzędów certyfikacji dla bieżącego użytkownika). Przeniesienie certyfikatu głównego do magazynu głównego Root na komputerze lokalnym rozwiązało mój problem.