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)
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
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
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. –