2015-10-07 27 views
36

Próbuję ustanowić połączenie SSL/TLS z serwerem testowym z samopodpisanym certyfikatem. Komunikacja przez niezabezpieczony kanał działała bez problemów.Nie można utworzyć bezpiecznego kanału SSL/TLS pomimo ustawienia ServerCertificateValidationCallback

Oto mój przykładowy kod, który napisałem na podstawie tego rozwiązania: Allowing Untrusted SSL Certificates with HttpClient C# Ignore certificate errors? .NET client connecting to ssl Web API

ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true; 

var c = new HttpClient(); 
var r = c.GetAsync("https://10.3.0.1:8443/rest/v1").Result; 
if (r.IsSuccessStatusCode) 
{ 
    Log.AddMessage(r.Content.Get<string>()); 
} 
else 
{ 
    Log.AddMessage(string.Format("{0} ({1})", (int)r.StatusCode, r.ReasonPhrase)); 
} 

próbował również to:

var handler = new WebRequestHandler(); 
handler.ServerCertificateValidationCallback = delegate { return true; }; 
var c = new HttpClient(handler); 
... 

i ten

ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

ale za każdym razem mam wyjątek:

InnerException: System.Net.Http.HttpRequestException 
    _HResult=-2146233088 
    _message=An error occurred while sending the request. 
    HResult=-2146233088 
    IsTransient=false 
    Message=An error occurred while sending the request. 
    InnerException: System.Net.WebException 
     _HResult=-2146233079 
     _message=The request was aborted: Could not create SSL/TLS secure channel. 
     HResult=-2146233079 
     IsTransient=false 
     Message=The request was aborted: Could not create SSL/TLS secure channel. 
     Source=System 
     StackTrace: 
      at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
      at System.Net.Http.HttpClientHandler.GetResponseCallback(IAsyncResult ar) 
     InnerException: 

Co robię źle? Dlaczego nie mogę połączyć się z tym serwerem (który ma nieprawidłowy certyfikat z podpisem własnym)

Odpowiedz

82

Robisz to dobrze z ServerCertificateValidationCallback. To nie jest problem, z którym masz do czynienia. Problem, z którym masz do czynienia, to najprawdopodobniej wersja protokołu SSL/TLS.

Na przykład, jeśli twój serwer oferuje tylko SSLv3 i TLSv10, a Twój klient potrzebuje protokołu TLSv12, otrzymasz ten komunikat o błędzie. Musisz upewnić się, że zarówno klient, jak i serwer mają obsługiwaną wspólną wersję protokołu.

Kiedy potrzebny jest klient, który jest w stanie połączyć się jak wielu serwerach, jak to możliwe (zamiast być tak bezpieczne, jak to możliwe) Używam tego (wraz z ustawieniem zwrotnego walidacji):

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 
+1

Mam podobny problem. Z powodu ataku POODLE jesteśmy zmuszeni wyłączyć TLS 1.0 na naszym serwerze. Gdy to zrobię, aplikacja innej firmy przestanie działać. Dekompilacja assambly pokazuje kod podobny do twojego. Używa on polecenia webclientc.SendAsync zamiast GetAsync. Jeśli skopiuję kod do konsoli programu na potrzeby testowania, mogę odtworzyć błąd, a po dodaniu ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 to działa. Pomyślałem, że będzie jakiś rodzaj uścisku dłoni pomiędzy serwerem a klientem, aby odkryć, z której wersji TLS korzystać? Dlaczego nie wybiera automatycznie wersji 1.1, gdy 1.0 jest wyłączony? – Engern

+0

Należy pamiętać, że zalecana wersja to TLS 1.2.I tak, jeśli obie strony mają włączoną określoną wersję protokołu, zostanie ona użyta, ale jeśli jedna strona obsługuje tylko protokoły i wersje, które nie są obsługiwane przez drugą stronę, nie można ustanowić połączenia. Aby upewnić się, że aplikacja będzie działać, należy jawnie ustawić "ServicePointManager.SecurityProtocol" po obu stronach, ponieważ jak mówi nam MSDN, domyślna wartość może być różna dla każdej maszyny w zależności od oprogramowania i konfiguracji. – Wapac

+0

Niesamowita odpowiedź! Miałem problemy, gdy zmieniłem adres URL Live na PayPal na sandbox, który wydaje się używać innego protokołu bezpieczeństwa. Użyj tej odpowiedzi, gdy korzystasz z piaskownicy PayPal. –

9

Wystarczy jako uzupełnienie dla każdego, kto nadal działa w tym - ja dodaje opcje ServicePointManager.SecurityProfile jak zauważono w roztworze:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 

a mimo to w dalszym ciągu pojawia się taki sam „żądanie zostało przerwane: nie można utworzyć SSL/Bezpieczny kanał TLS "błąd. Próbowałem połączyć się z niektórymi starszymi serwerami głosowymi z interfejsami HTTPS SOAP API (tj. Pocztą głosową, systemami telefonicznymi IP itd. Zainstalowanymi wiele lat temu). Obsługują one tylko połączenia SSL3, które zostały ostatnio zaktualizowane wiele lat temu.

Można by pomyśleć, w tym SSl3 na liście SecurityProtocols zrobiłoby to tutaj, ale tak się nie stało. Jedynym sposobem mogę wymusić połączenie było to tylko protokół SSL3 i żadnych innych:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

Następnie połączenie przechodzi - wygląda na bug do mnie, ale to nie zacząć rzucać błędów do niedawna na narzędzia Dostarczam te serwery, które są tam od lat - uważam, że Microsoft zaczął wprowadzać zmiany systemowe, które zaktualizowały to zachowanie, aby wymusić połączenia TLS, chyba że nie ma innej alternatywy.

W każdym razie - jeśli nadal używasz tego przeciwko starym witrynom/serwerom, warto spróbować.

+0

Mamy moduł CUCMPowerShell do używania api AXL Cisco Unified Communications przez PowerShell, a twoja odpowiedź pomogła nam to naprawić, dodając '[System.Net.ServicePointManager] :: SecurityProtocol = [System.Net.SecurityProtocolType] :: Ssl3'. Dziękuję Ci! Pełny kod można zobaczyć w [Invoke-CUCMSOAPAPIFunction] (https://github.com/Tervis-Tumbler/CUCMPowerShell/blob/master/CUCMPowerShell.psm1#L181) –

+0

dzięki - to działało dla mnie! –

+1

@Jeff - Sprawdź powiązany artykuł. Myślę, że może to wyjaśnić, dlaczego Ssl3 nie działa i sugeruje dwa sposoby ponownego włączenia Ssl3. https://docs.microsoft.com/en-us/dotnet/framework/migration-guide/mitigation-tls-protocols – Scott

5

Zostaliśmy rozwiązywania tego samego problemu właśnie dzisiaj, i wszystko, co trzeba zrobić, to zwiększyć wersji runtime .NET

4.5.2 nie działa dla nas z powyższego problemu, natomiast 4.6.1 było OK

Jeśli trzeba zachować wersję .NET, a następnie ustawić

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; 
+1

Który z wariantów użyłeś i jak dokładnie? –

+1

Mam aplikację .NET 4.5, która od dzisiaj nie będzie działać z określoną witryną SSL. Jeśli zmienię na 4.6.1, to działa dobrze, ale tak naprawdę nie mogę się zmienić. Nie jestem pewien, co należy zrobić: | – Tsury

0

Jeśli używasz nową nazwę domeny, a masz zrobić wszystko powyższe i cię nadal występuje ten sam błąd, sprawdź, czy wyczyścisz pamięć podręczną DNS na swoim komputerze. Clear your DNS, aby uzyskać więcej informacji.

Windows® 8

Aby wyczyścić pamięć podręczną DNS, jeśli używasz Windows 8, wykonaj następujące kroki:

Na klawiaturze naciśnij klawisz Win + X, aby otworzyć menu WinX.

Kliknij prawym przyciskiem myszy Wiersz poleceń i wybierz opcję Uruchom jako administrator.

Uruchom następujące polecenie:

ipconfig/flushdns

Jeśli polecenie powiedzie, system zwraca następujący komunikat:

konfiguracji IP systemu Windows pomyślnie spłukuje rozpoznawania nazw DNS Cache.

Windows® 7

Aby wyczyścić pamięć podręczną DNS, jeśli używasz systemu Windows 7, wykonaj następujące czynności:

Kliknij przycisk Start.

Wpisz cmd w polu tekstowym Wyszukaj w menu Start.

Kliknij prawym przyciskiem myszy Wiersz poleceń i wybierz opcję Uruchom jako administrator.

Uruchom następujące polecenie:

ipconfig/flushdns

Jeśli polecenie powiedzie, system zwraca następujący komunikat: konfiguracji IP systemu Windows pomyślnie spłukuje rozpoznawania nazw DNS Cache.

+0

'ipconfig/flushdns' w języku C#? – Kiquenet

+0

Jest to język linii komend, a nie C#. – Aviva

Powiązane problemy