Существующее соединение было принудительно закрыто удаленным узлом с помощью Когнитивного поиска Azure в Windows Server 2008 SP2

У нас есть сайт, который извлекает продукты из Когнитивного поиска Azure. В среду, 26 февраля 2020 г., около 14:00 по восточному стандартному времени мы внезапно начали замечать следующие ошибки:

[SocketException (0x2746): существующее соединение было принудительно закрыто удаленным узлом] System.Net.Sockets.Socket.EndReceive (IAsyncResult asyncResult) +8156963 System.Net.Sockets.NetworkStream.EndRead (IAsyncResult asyncResult) +48

[IOException: невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом.] System.Net.TlsStream.EndWrite (IAsyncResult asyncResult) +298 System.Net.ConnectStream.WriteHeadersCallback (IAsyncResult ar) +150

[WebException: базовое соединение было закрыто: при отправке произошла непредвиденная ошибка.] System.Net.HttpWebRequest.EndGetRequestStream (IAsyncResult asyncResult, TransportContext & context) +334 System.Net.Http.HttpClientHandler.GetRequestStreamCallbackes (IAsync)

Сайт работает на Windows Server 2008 SP2. После первого сообщения о проблеме я проверил нашу промежуточную среду и обнаружил, что та же проблема возникла и там. Первоначальный тест на моей виртуальной машине разработки также выявил проблему. Раньше мне приходилось сталкиваться с подобными проблемами, поэтому я добавил следующее в метод Application_Start в файле Global.asax.cs проекта:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Это устранило проблему на моей виртуальной машине разработки (Windows Server 2008 R2), но когда я развернул исправление для промежуточной и производственной среды, ошибка все еще сохранялась. Основываясь на множестве различных поисков, я сделал следующее, чтобы попытаться исправить проблему:

  • Обновите фреймворк с 4.5.1 до 4.6.1
  • Обновите пакет NuGet Microsoft.Azure.Search с 3.0.4 до 10.1.0
  • Обновите ключи реестра на сервере с помощью IIS Crypto
  • Развернуты все последние исправления безопасности (убедился, что KB4019276 применен, поскольку это упоминалось во многих статьях)

Ничего из этого не сработало. Я использовал Wireshark на сервере и обнаружил, что когда он вызывает Azure, он использует протокол SSL, а не TLS 1.2. Я также пробовал использовать HttpClient для прямого вызова службы поиска Azure, но это привело к той же ошибке. Интересно, что в сети есть еще один сервер, который также является Windows Server 2008 SP2, у которого нет проблем с вызовом службы поиска Azure для загрузки продуктов в поисковый индекс через HttpClient.

Есть идеи, как мы можем получить вызов для использования TLS 1.2 вместо SSL? Ниже приведены некоторые статьи, которые я просмотрел, чтобы попытаться решить эту проблему:


person Derek Curtis    schedule 28.02.2020    source источник
comment
Привет, Дерек, ответ Лиама на может оказаться полезным stackoverflow.com/questions/60416533/.   -  person Jennifer Marsman - MSFT    schedule 28.02.2020


Ответы (1)


Для большинства этих разделов реестра в SChannel требуется полная перезагрузка ОС, а не только перезапуск IIS. Вы не упомянули, пробовали ли вы это уже в производственной среде, но это то, что нужно проверить, особенно если у вас есть работающая коробка 2K8 SP2 в качестве справки.

person Steve Maine    schedule 28.02.2020