Używam HttpClient
do wykonywania wywołań WebApi przy użyciu języka C #. Wydaje się schludny i szybki w porównaniu do WebClient
. Jednak utknąłem podczas wykonywania Https
połączeń.
Jak mogę zrobić poniższy kod, aby wykonywać Https
połączenia?
HttpClient httpClient = new HttpClient();
httpClient.BaseAddress = new Uri("https://foobar.com/");
httpClient.DefaultRequestHeaders.Accept.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/xml"));
var task = httpClient.PostAsXmlAsync<DeviceRequest>(
"api/SaveData", request);
EDYCJA 1: Powyższy kod działa dobrze do wykonywania połączeń http. Ale kiedy zmieniam schemat na https to nie działa. Oto uzyskany błąd:
Połączenie podstawowe zostało zamknięte: nie można ustanowić relacji zaufania dla bezpiecznego kanału SSL / TLS.
EDYCJA 2: Zmiana schematu na https to: krok pierwszy.
Jak dostarczyć certyfikat i klucz publiczny / prywatny wraz z żądaniem C #.
c#
asp.net-web-api
dotnet-httpclient
Abhijeet
źródło
źródło
new Uri("https://foobar.com/");
Odpowiedzi:
Jeśli serwer obsługuje tylko wyższą wersję TLS, taką jak tylko TLS 1.2, nadal będzie się nie powieść, chyba że komputer kliencki jest domyślnie skonfigurowany do korzystania z wyższej wersji TLS. Aby rozwiązać ten problem, dodaj do kodu następujący kod.
Modyfikowanie przykładowego kodu byłoby
źródło
SecurityProtocolType.Tls12
nie mogłem znaleźć tych wartości wyliczenia, o których wspominałeśPo prostu określ HTTPS w identyfikatorze URI.
Foobar.com będzie musiał mieć zaufany certyfikat SSL, w przeciwnym razie Twoje połączenia zakończą się niepowodzeniem z niezaufanym błędem.
EDYTUJ odpowiedź: ClientCertificates z HttpClient
EDYTUJ Odpowiedź 2: Jeśli serwer, z którym się łączysz, wyłączył SSL, TLS 1.0 i 1.1 i nadal korzystasz z .NET Framework 4.5 (lub starszego), musisz dokonać wyboru
źródło
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
GetMyX509Certificate
?Twój kod powinien zostać zmodyfikowany w ten sposób:
Musisz po prostu użyć
https:
schematu URI. Jest to przydatna strona tutaj na MSDN o bezpiecznych połączeń HTTP. W rzeczy samej:Ponadto weź pod uwagę, że połączenia HTTPS używają certyfikatu SSL. Upewnij się, że Twoje bezpieczne połączenie ma ten certyfikat, w przeciwnym razie żądania zakończą się niepowodzeniem.
EDYTOWAĆ:
Co to znaczy, że nie działa? Żądania zawodzą? Został zgłoszony wyjątek? Wyjaśnij swoje pytanie.
Jeśli żądania nie powiodą się, problemem powinien być certyfikat SSL.
Aby rozwiązać problem, możesz użyć klasy,
HttpWebRequest
a następnie jej właściwościClientCertificate
. Ponadto możesz znaleźć tutaj przydatny przykład dotyczący tworzenia żądania HTTPS przy użyciu certyfikatu.Przykład jest następujący (jak pokazano na stronie MSDN połączonej wcześniej):
źródło
Podczas łączenia z
https
otrzymałem również ten błąd, dodaję tę linię wcześniejHttpClient httpClient = new HttpClient();
i łączę się pomyślnie:Wiem to z tej odpowiedzi i innej podobnej odpowiedzi, a komentarz wspomina:
Poza tym nie wypróbowałem metody w Another Answer, która używa
new X509Certificate()
lubnew X509Certificate2()
tworzy certyfikat, nie jestem pewien, czy po prostu tworzenie przeznew()
będzie działać, czy nie.EDYCJA: Niektóre odniesienia:
Utwórz certyfikat serwera z podpisem własnym w usługach IIS 7
Importowanie i eksportowanie certyfikatów SSL w usługach IIS 7
Konwertuj .pfx na .cer
Najlepsze rozwiązania dotyczące korzystania z ServerCertificateValidationCallback
Uważam, że wartość odcisku palca jest równa
x509certificate.GetCertHashString()
:Pobierz odcisk palca certyfikatu
źródło
Miałem ten sam problem podczas łączenia się z GitHubem, co wymaga agenta użytkownika. Dlatego wystarczy podać to, a nie wygenerować certyfikatu
źródło
123456789
??Istnieje nieglobalne ustawienie na poziomie
HttpClientHandler
:W ten sposób można włączyć najnowsze wersje TLS.
Zauważ, że wartość domyślna
SslProtocols.Default
to faktycznieSslProtocols.Ssl3 | SslProtocols.Tls
(sprawdzana dla .Net Core 2.1 i .Net Framework 4.7.1).źródło
Samo określenie HTTPS w identyfikatorze URI powinno załatwić sprawę.
Jeśli żądanie działa z HTTP, ale kończy się niepowodzeniem z HTTPS, z pewnością jest to problem z certyfikatem . Upewnij się, że dzwoniący ufa wystawcy certyfikatu i że certyfikat nie wygasł. Szybkim i łatwym sposobem sprawdzenia tego jest wykonanie zapytania w przeglądarce.
Możesz również chcieć sprawdzić na serwerze (czy jest twój i / lub jeśli możesz), czy jest skonfigurowany do obsługi żądań HTTPS prawidłowo.
źródło
Otrzymałem również błąd:
... z aplikacją docelową Xamarin Forms dla systemu Android próbującą zażądać zasobów od dostawcy interfejsu API, który wymagał protokołu TLS 1.3.
Rozwiązanie polegało na zaktualizowaniu konfiguracji projektu w celu wymiany klienta HTTP „zarządzanego” (.NET) platformy Xamarin (który nie obsługuje protokołu TLS 1.3 od wersji Xamarin Forms w wersji 2.5) i zamiast tego użyć natywnego klienta systemu Android.
To proste przełączanie projektu w Visual Studio. Zobacz zrzut ekranu poniżej.
źródło
Dodaj poniższe deklaracje do swojej klasy:
Po:
I:
Szczęśliwy? :)
źródło
Miałem ten problem iw moim przypadku rozwiązanie było głupio proste: otwórz Visual Studio z uprawnieniami administratora. Wypróbowałem wszystkie powyższe rozwiązania i nie działało, dopóki tego nie zrobiłem. Mam nadzieję, że zaoszczędzi to komuś cennego czasu.
źródło
Możesz spróbować użyć pakietu ModernHttpClient Nuget: Po pobraniu pakietu możesz go zaimplementować w następujący sposób:
źródło
Zgadzam się z felickz, ale chcę też dodać przykład do wyjaśnienia użycia w języku c #. Używam SSL w usłudze Windows w następujący sposób.
Jeśli mam zamiar używać go w aplikacji internetowej, po prostu zmieniam implementację po stronie proxy w następujący sposób:
źródło
W przypadku błędu:
Myślę, że musisz bezwarunkowo zaakceptować certyfikat z następującym kodem
jak napisał Oppositional w odpowiedzi na pytanie klienta .NET łączącego się z SSL Web API .
źródło