У нас есть сайт, который извлекает продукты из Когнитивного поиска 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? Ниже приведены некоторые статьи, которые я просмотрел, чтобы попытаться решить эту проблему: