Я изо всех сил пытаюсь заставить мое приложение Windows 8 взаимодействовать с моим тестовым веб-API через SSL.
Похоже, что HttpClient / HttpClientHandler не предоставляет и возможность игнорировать ненадежные сертификаты, такие как WebRequest, позволяет вам (хотя и «хакерским» способом ServerCertificateValidationCallback
).
Любая помощь приветствуется!
c#
.net
windows-8
windows-runtime
Джейми
источник
источник
Ответы:
В Windows 8.1 теперь вы можете доверять недействительным сертификатам SSL. Вам нужно либо использовать Windows.Web.HttpClient, либо, если вы хотите использовать System.Net.Http.HttpClient, вы можете использовать адаптер обработчика сообщений, который я написал: http://www.nuget.org/packages/WinRtHttpClientHandler
Документы находятся на GitHub: https://github.com/onovotny/WinRtHttpClientHandler.
источник
Быстрое и грязное решение - использовать
ServicePointManager.ServerCertificateValidationCallback
делегат. Это позволяет вам обеспечить собственную проверку сертификата. Проверка применяется глобально во всем домене приложения.Я использую это в основном для модульного тестирования в ситуациях, когда я хочу работать с конечной точкой, которую я размещаю в процессе, и пытаюсь поразить ее с помощью клиента WCF или
HttpClient
.Для производственного кода вам может потребоваться более мелкозернистый элемент управления, и было бы лучше использовать свойство
WebRequestHandler
и егоServerCertificateValidationCallback
делегат (см . Ответ dtb ниже ). Или ctacke ответьте, используяHttpClientHandler
. Я предпочитаю любой из этих двух сейчас, даже с моими интеграционными тестами, чем то, как я это делал раньше, если я не могу найти другой крючок.источник
ServicePointManager.GetServicePoint(Uri)
(см. Документацию ), чтобы получить точку обслуживания, которая применяется только к вызовам этого URI. Затем вы можете установить свойства и обрабатывать события на основе этого подмножества.Взгляните на класс WebRequestHandler и его свойство ServerCertificateValidationCallback :
источник
derived class
?HttpClientHandler
?Если вы пытаетесь сделать это в стандартной библиотеке .NET, вот простое решение со всеми рисками возврата
true
в обработчике. Я оставляю безопасность на ваше усмотрение.источник
Или вы можете использовать для HttpClient в
Windows.Web.Http
пространстве имен:источник
System.Net.Http
,System.Web
иWindows.Web.Http
вместе?Если вы используете,
System.Net.Http.HttpClient
я считаю, что правильный образецисточник
В большинстве ответов здесь предлагается использовать типичный шаблон:
из-за интерфейса IDisposable. Пожалуйста, не надо!
Microsoft сообщает вам, почему:
А здесь вы можете найти подробный анализ того, что происходит за кулисами: https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
Относительно вашего вопроса SSL и на основе https://docs.microsoft.com/en-us/azure/architecture/antipatterns/improper-instantiation/#how-to-fix-the-problem
Вот ваша выкройка:
источник
Если это для приложения среды выполнения Windows, вам необходимо добавить самозаверяющий сертификат в проект и указать его в appxmanifest.
Документы здесь: http://msdn.microsoft.com/en-us/library/windows/apps/hh465031.aspx
То же самое, если он из ЦС, которому не доверяют (например, частного ЦС, которому сама машина не доверяет) - вам нужно получить общедоступный сертификат ЦС, добавить его в качестве содержимого в приложение, а затем добавить его в манифест.
Как только это будет сделано, приложение увидит в нем правильно подписанный сертификат.
источник
У меня нет ответа, но у меня есть альтернатива.
Если вы используете Fiddler2 для мониторинга трафика и включите расшифровку HTTPS, ваша среда разработки не будет жаловаться. Это не будет работать на устройствах WinRT, таких как Microsoft Surface, поскольку на них нельзя устанавливать стандартные приложения. Но ваш компьютер Win8 разработки будет в порядке.
Чтобы включить шифрование HTTPS в Fiddler2, перейдите в Инструменты> Параметры Fiddler> HTTPS (вкладка)> Установите флажок «Расшифровать трафик HTTPS» .
Я буду следить за этой веткой, надеясь, что у кого-то найдется элегантное решение.
источник
Я нашел пример в этом клиенте Kubernetes, где они использовали X509VerificationFlags.AllowUnknownCertificateAuthority для доверия самозаверяющим самоподписанным корневым сертификатам. Я немного переработал их пример для работы с нашими собственными корневыми сертификатами в кодировке PEM. Надеюсь, это кому-то поможет.
источник
Я нашел в Интернете пример, который, кажется, работает хорошо:
Сначала вы создаете новый ICertificatePolicy
Затем просто используйте это перед отправкой вашего http-запроса следующим образом:
http://www.terminally-incoherent.com/blog/2008/05/05/send-a-https-post-request-with-c/
источник
ServicePointManager.CertificatePolicy
устарел: docs.microsoft.com/en-us/dotnet/framework/whats-new/…