«Основное соединение было закрыто: при отправке произошла непредвиденная ошибка». С SSL-сертификатом

Проблема. Я получаю это исключение. «ПОДХОДЯЩЕЕ СОЕДИНЕНИЕ БЫЛО ЗАКРЫТО: НЕОПРЕДЕЛЕННАЯ ОШИБКА ВОЗНИКНОВЕНА НА ОТПРАВЛЕНО» в моих журналах, и это нарушает нашу OEM-интеграцию с нашей системой электронного маркетинга в случайном порядке, варьируя от [1 часа – 4 часа]

Мой сайт размещен на сервере Windows 2008 R2 с IIS 7.5.7600. На этом веб-сайте имеется большое количество OEM-компонентов и обширная панель инструментов. Все работает отлично со всеми другими элементами веб-сайта, за исключением одного из наших компонентов электронной почты, которые мы используем в качестве решения iframe на нашей информационной панели. Как это работает, я отправляю httpWebRequestobject со всеми учетными данными, и я получаю URL-адрес, который я вставляю в iframe, и он работает. Но это работает только в течение некоторого времени [1 час – 4 часа], а затем я получаю следующее исключение. «ПОДХОДЯЩЕЕ СОЕДИНЕНИЕ ЗАКРЫТО: НЕОПРЕДЕЛЕННАЯ ОШИБКА, ВОЗНИКАЮЩАЯ НА ОТПРАВИТЬ», и даже если система пытается получить URL-адрес из httpWebRequest, с тем же исключением. Единственный способ заставить его работать снова – переработать пул приложений или что-либо редактируется в web.config. Я действительно исчерпал все возможности, о которых я мог думать.

Опция попыталась

Явно добавил, keep-alive = false

keep-alive = true

Увеличено время ожидания:

Я загрузил эту страницу на веб-сайт, не являющийся SSL, чтобы проверить, установил ли SSL-сертификат на нашем производственном сервере какое-то ограничение.

Любое направление к резолюции высоко ценится.

Код:

 Public Function CreateHttpRequestJson(ByVal url) As String Try Dim result As String = String.Empty Dim httpWebRequest = DirectCast(WebRequest.Create("https://api.xxxxxxxxxxx.com/api/v3/externalsession.json"), HttpWebRequest) httpWebRequest.ContentType = "text/json" httpWebRequest.Method = "PUT" httpWebRequest.ContentType = "application/x-www-form-urlencoded" httpWebRequest.KeepAlive = False 'ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 'TODO change the integratorID to the serviceproviders account Id, useremail Using streamWriter = New StreamWriter(httpWebRequest.GetRequestStream()) Dim json As String = New JavaScriptSerializer().Serialize(New With { _ Key .Email = useremail, _ Key .Chrome = "None", _ Key .Url = url, _ Key .IntegratorID = userIntegratorID, _ Key .ClientID = clientIdGlobal _ }) 'TODO move it to the web.config, Following API Key is holonis accounts API Key SetBasicAuthHeader(httpWebRequest, holonisApiKey, "") streamWriter.Write(json) streamWriter.Flush() streamWriter.Close() Dim httpResponse = DirectCast(httpWebRequest.GetResponse(), HttpWebResponse) Using streamReader = New StreamReader(httpResponse.GetResponseStream()) result = streamReader.ReadToEnd() result = result.Split(New [Char]() {":"})(2) result = "https:" & result.Substring(0, result.Length - 2) End Using End Using Me.midFrame.Attributes("src") = result Catch ex As Exception objLog.WriteLog("Error:" & ex.Message) If (ex.Message.ToString().Contains("Invalid Email")) Then 'TODO Show message on UI ElseIf (ex.Message.ToString().Contains("Email Taken")) Then 'TODO Show message on UI ElseIf (ex.Message.ToString().Contains("Invalid Access Level")) Then 'TODO Show message on UI ElseIf (ex.Message.ToString().Contains("Unsafe Password")) Then 'TODO Show message on UI ElseIf (ex.Message.ToString().Contains("Invalid Password")) Then 'TODO Show message on UI ElseIf (ex.Message.ToString().Contains("Empty Person Name")) Then 'TODO Show message on UI End If End Try End Function Public Sub SetBasicAuthHeader(ByVal request As WebRequest, ByVal userName As [String], ByVal userPassword As [String]) Dim authInfo As String = Convert.ToString(userName) & ":" & Convert.ToString(userPassword) authInfo = Convert.ToBase64String(Encoding.[Default].GetBytes(authInfo)) request.Headers("Authorization") = "Basic " & authInfo End Sub` 

10 Solutions collect form web for “«Основное соединение было закрыто: при отправке произошла непредвиденная ошибка». С SSL-сертификатом”

Для меня это было tls12:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

Если вы застряли с .Net 4.0, а целевой сайт использует TLS 1.2, вам понадобится следующая строка. ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

источник: поддержка TLS 1.2 и .NET: как избежать ошибок подключения

Приведенный ниже код разрешил проблему

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Ssl3 

В моем случае сайт, к которому я подключаюсь, обновился до TLS 1.2. В результате мне пришлось установить .net 4.5.2 на моем веб-сервере, чтобы поддержать его.

Я обнаружил, что это признак того, что на сервере, на котором выполняется развертывание кода, установлена ​​старая платформа .NET, которая не поддерживает TLS 1.1 или TLS 1.2. Шаги для исправления:

  1. Установка последней версии .NET Runtime на рабочих серверах (IIS и SQL)
  2. Установка последнего пакета .NET Developer Pack на ваших машинах разработки.
  3. Измените настройки «Target framework» в ваших проектах Visual Studio на последнюю платформу .NET.

Вы можете получить последнюю версию .NET Developer Pack и Runtime с этого URL-адреса: http://getdotnet.azurewebsites.net/target-dotnet-platforms.html

У меня была такая же проблема в течение нескольких дней с интеграцией, которая также просто «использовалась раньше».

Из явной депрессии я просто попробовал

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3; 

Это разрешило это для меня … хотя интеграция строго использует SSLv3.

Я пришел к осознанию того, что что-то, если с того времени, как Fiddler сообщил, что существует «пустой TLS-переговорный шифр» или что-то подобное.

Надеюсь, это сработает!

Перейдите в свой web.config / App.config, чтобы проверить, какое время выполнения .net вы используете.

     

Вот решение:

  1. .NET 4.6 и выше. Вам не нужно выполнять дополнительную работу по поддержке TLS 1.2, она поддерживается по умолчанию.

  2. .NET 4.5. Поддерживается TLS 1.2, но это не протокол по умолчанию. Вам нужно отказаться от использования. Следующий код сделает TLS 1.2 по умолчанию, убедитесь, что он выполнил его перед подключением к защищенному ресурсу:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12

  1. .NET 4.0. TLS 1.2 не поддерживается, но если у вас установлен .NET 4.5 (или выше), вы все равно можете выбрать TLS 1.2, даже если ваша инфраструктура приложения не поддерживает его. Единственная проблема заключается в том, что SecurityProtocolType в .NET 4.0 не имеет записи для TLS1.2, поэтому нам нужно будет использовать численное представление этого значения enums:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

  1. .NET 3.5 или ниже. TLS 1.2 не поддерживается (*), и нет обходного пути. Обновите приложение до более новой версии фреймворка.

У нас была эта проблема, когда веб-сайт, который обращался к нашему API, получал сообщение «Основное соединение было закрыто: произошла непредвиденная ошибка при отправке».

Их код представлял собой смесь .NET 3.x и 2.2, которая, как я понимаю, означает, что они используют TLS 1.0.

Чтобы заставить наш IIS отвечать на вызовы API, нам пришлось добавить параметры реестра на сервере IIS, чтобы явно включить версии TLS. ПРИМЕЧАНИЕ. После внесения этих изменений необходимо перезапустить сервер Windows (а не только службу IIS):

 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001 

Если это не так, вы также можете поэкспериментировать с добавлением записи для SSL 2.0:

 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Client] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\SSL 2.0\Server] "DisabledByDefault"=dword:00000000 "Enabled"=dword:00000001 

Чтобы быть ясным, это нехорошее решение, и правильным решением является заставить вызывающего пользователя использовать TLS 1.2, но вышеописанное может помочь диагностировать, что это проблема.

Вы можете ускорить добавление этих записей reg с помощью этого сценария powershell:

 $ProtocolList = @("SSL 2.0","SSL 3.0","TLS 1.0", "TLS 1.1", "TLS 1.2") $ProtocolSubKeyList = @("Client", "Server") $DisabledByDefault = "DisabledByDefault" $Enabled = "Enabled" $registryPath = "HKLM:\\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\" foreach($Protocol in $ProtocolList) { Write-Host " In 1st For loop" foreach($key in $ProtocolSubKeyList) { $currentRegPath = $registryPath + $Protocol + "\" + $key Write-Host " Current Registry Path $currentRegPath" if(!(Test-Path $currentRegPath)) { Write-Host "creating the registry" New-Item -Path $currentRegPath -Force | out-Null } Write-Host "Adding protocol" New-ItemProperty -Path $currentRegPath -Name $DisabledByDefault -Value "0" -PropertyType DWORD -Force | Out-Null New-ItemProperty -Path $currentRegPath -Name $Enabled -Value "1" -PropertyType DWORD -Force | Out-Null } } Exit 0 

Это модифицированная версия скрипта на странице справки Microsoft для настройки TLS для VMM . Эта статья basics.net была страницей, которая изначально дала мне представление об этих настройках.

Использование прокси-сервера отладки HTTP может вызвать это – например, Fiddler.

Я загружал сертификат PFX из локального файла (аутентификация на Apple.com), и он не удался, потому что Fiddler не смог передать этот сертификат.

Попробуйте отключить Fiddler, чтобы проверить, и если это решение, вам нужно, вероятно, установить сертификат на вашем компьютере или каким-то образом, что Fiddler может его использовать.

Следующий код решил мою проблему:

 request.ProtocolVersion = HttpVersion.Version10; // THIS DOES THE TRICK ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; 
  • Как несколько клиентов одновременно подключаются к одному порту, например 80, на сервере?
  • Присоединение темы к себе
  • Какой порт используется соединением Java RMI?
  • Возвращаемое значение для функции внутри блока
  • Выбор библиотеки пула Java JDBC в 2011/2012?
  • проверить подключение к Интернету в cocoa-приложении
  • Java обнаруживает потерянное соединение
  • HttpClient 4.0.1 - как освободить соединение?
  • Почему при запуске URL-адреса возникает исключение «java.net.ConnectException: Connection timed out»?
  • Interesting Posts

    Каковы истинные преимущества ExpandoObject?

    Сочетание клавиш для отправки файла в виде вложения электронной почты

    Как сериализовать class с интерфейсом?

    Исключение NullPointerException при попытке доступа к объекту @Inject в конструкторе

    Разница между статическими и финальными?

    В чем разница между атрибутами classа и экземпляра?

    Разница между Delegate.Invoke и Delegate ()

    Какие функции важны в сканере + устройство подачи листов для старых личных документов

    Параметр действия JSF2

    Как создать отдельные 7z-файлы из каждого выбранного каталога с помощью командной строки 7zip?

    От «аккумулятора, подключенного, но не заряжающего» до «критического процесса»,

    Wix генерирует одиночный идентификатор компонента для всего дерева

    Запутывание разделов Fedora на новой установке

    Странная проблема с VLC

    Как назвать / описать кнопку запуска Windows 7?

    Давайте будем гением компьютера.