Я использую HttpClient
для звонков WebApi с использованием C #. Кажется аккуратным и быстрым способом по сравнению с WebClient
. Однако я застрял во время Https
звонков.
Как я могу сделать код ниже, чтобы совершать Https
звонки?
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);
РЕДАКТИРОВАТЬ 1: приведенный выше код отлично работает для http-звонков. Но когда я меняю схему на https, она не работает. Вот полученная ошибка:
Базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL / TLS.
РЕДАКТИРОВАТЬ 2: Изменение схемы на https: шаг первый.
Как мне предоставить сертификат и открытый / закрытый ключ вместе с C # запросом.
c#
asp.net-web-api
dotnet-httpclient
Abhijeet
источник
источник
new Uri("https://foobar.com/");
Ответы:
Если сервер поддерживает только более высокую версию TLS, например, только TLS 1.2, он все равно не будет работать, если ваш клиентский ПК не настроен на использование более высокой версии TLS по умолчанию. Чтобы преодолеть эту проблему, добавьте следующее в ваш код.
Модифицируя ваш пример кода, это будет
источник
SecurityProtocolType.Tls12
не удалось найти перечисленные вами значения перечисленийПросто укажите HTTPS в URI.
Foobar.com должен иметь доверенный сертификат SSL, иначе ваши звонки не будут выполнены из-за ненадежной ошибки.
РЕДАКТИРОВАТЬ Ответ: ClientCertificates с HttpClient
РЕДАКТИРОВАТЬ Ответ 2: Если сервер, к которому вы подключаетесь, отключил SSL, TLS 1.0 и 1.1, и вы все еще используете .NET Framework 4.5 (или ниже), вам нужно сделать выбор
источник
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, sslPolicyErrors) => true;
GetMyX509Certificate
?Ваш код должен быть изменен следующим образом:
Вы просто должны использовать
https:
схему URI. Там есть полезная страница здесь на MSDN о защищенных соединениях HTTP. На самом деле:Кроме того, учтите, что соединения HTTPS используют сертификат SSL. Убедитесь, что ваше безопасное соединение имеет этот сертификат, иначе запросы не будут выполнены.
РЕДАКТИРОВАТЬ:
Что это значит не работает? Сбой запросов? Исключение брошено? Уточни свой вопрос.
Если запросы терпят неудачу, то проблема должна быть в сертификате SSL.
Чтобы решить эту проблему, вы можете использовать класс,
HttpWebRequest
а затем его свойствоClientCertificate
. Кроме того, вы можете найти здесь полезный пример того, как сделать HTTPS-запрос с использованием сертификата.Примером является следующий (как показано на странице MSDN, связанной ранее):
источник
При подключении
https
я тоже получаю эту ошибку, я добавляю эту строку раньшеHttpClient httpClient = new HttpClient();
и успешно подключаюсь:Я знаю это из этого ответа и другого подобного ответа, а комментарий упоминает:
Кроме того, я не пробовал метод в другом ответе, который использует
new X509Certificate()
илиnew X509Certificate2()
для создания сертификата, я не уверен, что просто создатьnew()
будет работать или нет.РЕДАКТИРОВАТЬ: Некоторые ссылки:
Создайте самоподписанный сертификат сервера в IIS 7
Импорт и экспорт SSL-сертификатов в IIS 7
Конвертировать .pfx в .cer
Лучшие практики для использования ServerCertificateValidationCallback
Я считаю, что значение отпечатка равно
x509certificate.GetCertHashString()
:Получить отпечаток сертификата
источник
У меня была такая же проблема при подключении к GitHub, которая требует агента пользователя. Таким образом, достаточно предоставить это, а не генерировать сертификат
источник
123456789
??Существует неглобальная настройка на уровне
HttpClientHandler
:Таким образом, один включает последние версии TLS.
Обратите внимание, что значение по умолчанию
SslProtocols.Default
фактическиSslProtocols.Ssl3 | SslProtocols.Tls
(проверено для .Net Core 2.1 и .Net Framework 4.7.1).источник
Простое указание HTTPS в URI должно помочь.
Если запрос работает с HTTP, но не работает с HTTPS, то это, безусловно, проблема с сертификатом . Убедитесь, что вызывающий абонент доверяет издателю сертификата и что срок действия сертификата не истек. Быстрый и простой способ проверить это - попытаться выполнить запрос в браузере.
Вы также можете захотеть проверить на сервере (если он ваш и / или если вы можете), чтобы он был настроен для правильного обслуживания запросов HTTPS.
источник
Я также получил ошибку:
... с приложением-мишенью для Android Xamarin Forms, пытающимся запросить ресурсы у поставщика API, для которого требуется TLS 1.3.
Решение состояло в том, чтобы обновить конфигурацию проекта для замены «управляемого» (.NET) http-клиента Xamarin (который не поддерживает TLS 1.3 с Xamarin Forms v2.5) и вместо этого использовать собственный клиент Android.
Это простой проект переключения в визуальной студии. Смотрите скриншот ниже.
источник
Добавьте следующие объявления в ваш класс:
После:
И:
Счастливый? :)
источник
У меня была эта проблема, и в моем случае решение было глупо простым: открыть Visual Studio с правами администратора. Я попробовал все вышеупомянутые решения, и это не сработало, пока я не сделал это. Надеюсь, это сэкономит кому-то драгоценное время.
источник
Вы можете попробовать использовать пакет Nuget ModernHttpClient: после загрузки пакета вы можете реализовать его следующим образом:
источник
Я согласен с felickz, но также хочу добавить пример для пояснения использования в c #. Я использую SSL в Windows службы следующим образом.
Если я собираюсь использовать его в веб-приложении, я просто изменяю реализацию на стороне прокси следующим образом:
источник
Для ошибки:
Я думаю, что вам нужно безоговорочно принять сертификат со следующим кодом
Как написал Оппозиционный в своем ответе на вопрос .NET клиент подключается к ssl Web API .
источник