Mam problem z komunikacją mojej aplikacji Windows 8 z testowym interfejsem API sieci Web przez SSL.
Wygląda na to, że HttpClient / HttpClientHandler nie zapewnia, a opcja ignorowania niezaufanych certyfikatów, takich jak WebRequest, umożliwia Ci to (choć w „hacky” sposób ServerCertificateValidationCallback
).
Każda pomoc byłaby bardzo mile widziana!
c#
.net
windows-8
windows-runtime
Jamie
źródło
źródło
Odpowiedzi:
W systemie Windows 8.1 możesz teraz ufać nieprawidłowym certyfikatom SSL. Musisz użyć Windows.Web.HttpClient lub jeśli chcesz użyć System.Net.Http.HttpClient, możesz użyć adaptera obsługi komunikatów, który napisałem: http://www.nuget.org/packages/WinRtHttpClientHandler
Dokumenty są na GitHub: https://github.com/onovotny/WinRtHttpClientHandler
źródło
Szybkim i brudnym rozwiązaniem jest skorzystanie z
ServicePointManager.ServerCertificateValidationCallback
delegata. Pozwala to na zapewnienie własnej walidacji certyfikatu. Walidacja jest stosowana globalnie w całej domenie aplikacji.Używam tego głównie do testów jednostkowych w sytuacjach, w których chcę uruchomić punkt końcowy, który hostuję w procesie i próbuję trafić go za pomocą klienta WCF lub
HttpClient
.W przypadku kodu produkcyjnego możesz potrzebować dokładniejszej kontroli i lepiej byłoby użyć właściwości
WebRequestHandler
i jejServerCertificateValidationCallback
delegata (patrz odpowiedź dtb poniżej ). Lub ctacke odpowiedź za pomocąHttpClientHandler
. Wolę jeden z tych dwóch teraz, nawet w moich testach integracji, niż sposób, w jaki to robiłem, chyba że nie mogę znaleźć żadnego innego zaczepu.źródło
ServicePointManager.GetServicePoint(Uri)
(zobacz dokumentację ), aby uzyskać punkt obsługi, który dotyczy tylko wywołań tego identyfikatora URI. Następnie można ustawić właściwości i obsługiwać zdarzenia na podstawie tego podzbioru.Przyjrzyj się klasie WebRequestHandler i jej właściwości ServerCertificateValidationCallback :
źródło
derived class
?HttpClientHandler
?Jeśli próbujesz to zrobić w bibliotece .NET Standard, oto proste rozwiązanie, z całym ryzykiem związanym z powrotem
true
do programu obsługi. Bezpieczeństwo pozostawiam tobie.źródło
Lub możesz użyć dla HttpClient w
Windows.Web.Http
przestrzeni nazw:źródło
System.Net.Http
,System.Web
aWindows.Web.Http
razem?Jeśli używasz,
System.Net.Http.HttpClient
uważam, że prawidłowy wzór jestźródło
Większość odpowiedzi sugeruje użycie typowego wzoru:
ze względu na interfejs IDisposable. Proszę, nie rób tego!
Microsoft wyjaśnia, dlaczego:
A tutaj możesz znaleźć szczegółową analizę tego, co dzieje się za kulisami: https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
Jeśli chodzi o Twoje pytanie dotyczące SSL i na podstawie https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/#how-to-fix-the-problem
Oto twój wzór:
źródło
Jeśli dotyczy to aplikacji środowiska wykonawczego systemu Windows, musisz dodać certyfikat z podpisem własnym do projektu i odwołać się do niego w pliku appxmanifest.
Dokumenty są tutaj: http://msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx
To samo, jeśli pochodzi z niezaufanego urzędu certyfikacji (np. Prywatnego urzędu certyfikacji, któremu sama maszyna nie ufa) - musisz uzyskać publiczny certyfikat urzędu certyfikacji, dodać go jako zawartość do aplikacji, a następnie dodać do manifestu.
Gdy to zrobisz, aplikacja zobaczy go jako poprawnie podpisany certyfikat.
źródło
Nie mam odpowiedzi, ale mam alternatywę.
Jeśli używasz Fiddlera2 do monitorowania ruchu i włączasz deszyfrowanie HTTPS, Twoje środowisko programistyczne nie będzie narzekać. To nie zadziała na urządzeniach WinRT, takich jak Microsoft Surface, ponieważ nie można na nich zainstalować standardowych aplikacji. Ale twój programistyczny komputer z Win8 będzie w porządku.
Aby włączyć szyfrowanie HTTPS w Fiddler2, przejdź do Narzędzia> Opcje Fiddlera > HTTPS (karta)> Zaznacz „Odszyfruj ruch HTTPS” .
Będę miał na oku ten wątek mając nadzieję, że ktoś znajdzie eleganckie rozwiązanie.
źródło
Znalazłem przykład w tym kliencie Kubernetes, w którym używali X509VerificationFlags.AllowUnknownCertificateAuthority, aby ufać certyfikatom głównym z podpisem własnym. Lekko przerobiłem ich przykład, aby działał z naszymi własnymi certyfikatami głównymi zakodowanymi w PEM. Mam nadzieję, że to komuś pomoże.
źródło
Znalazłem przykład online, który wydaje się działać dobrze:
Najpierw utwórz nowy ICertificatePolicy
Następnie użyj tego przed wysłaniem żądania http w następujący sposób:
http://www.terminally-incoherent.com/blog/2008/05/05/send-a-https-post-request-with-c/
źródło
ServicePointManager.CertificatePolicy
jest przestarzałe: docs.microsoft.com/en-us/dotnet/framework/whats-new/ ...