Подтвердить что ты не робот

"Основное соединение было закрыто: произошла непредвиденная ошибка при отправке". С 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

Увеличено время ожидания: <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />

Я загрузил эту страницу на сайт, не являющийся 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`
4b9b3361

Ответ 1

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Ответ 3

В приведенном ниже коде рассмотрена проблема

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Ssl3

Ответ 4

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

Ответ 5

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

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

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

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

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

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

Ответ 6

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

  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
  </startup>

Вот решение:

  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, поэтому wed должен использовать численное представление этого значения перечисления:

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

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

Ответ 7

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

  1. Установка последней версии .NET Runtime на ваших производственных серверах (IIS & SQL)
  2. Установка последней версии .NET Developer Pack на ваших машинах разработки.
  3. Измените настройки "Целевой фреймворк" в ваших проектах Visual Studio на последнюю .NET Framework.

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

Ответ 8

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

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

Приведенный ниже ответ может помочь вам диагностировать проблему, включив TLS 1.0, SSL 2 и SSL3, но, чтобы быть совершенно ясным, вы не хотите делать это в долгосрочной перспективе, так как все три из этих протоколов считаются небезопасными и больше не должны используется:

Чтобы заставить 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 была страницей, которая изначально дала мне идею взглянуть на эти настройки.

Ответ 9

Просто добавь:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Ответ 10

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

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

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

Ответ 11

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

request.ProtocolVersion = HttpVersion.Version10; // THIS DOES THE TRICK
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

Ответ 12

Это, если помогает кому-то, наша проблема с отсутствующим сертификатом. Среда - это стандарт Windows Server 2016 с.Net 4.6.

Существует автономный URI службы WCF https, для которого Service.Open() будет выполняться без ошибок. Другой поток будет продолжать доступ к https://OurIp: 443/OurService? Wsdl для обеспечения доступности этой службы. Доступ к WSDL, с которым вы столкнулись:

Основное соединение было закрыто: при отправке произошла непредвиденная ошибка.

Использование ServicePointManager.SecurityProtocol с соответствующими настройками не помогло. Игра с ролями и функциями сервера тоже не помогла. Затем вмешался Джезе Джордж, SE, разрешив проблему через пару минут. Jaise установила самоподписанный сертификат в IIS, пытаясь решить проблему. Это он сделал для решения этой проблемы:

(1) Откройте диспетчер IIS (inetmgr) (2) Нажмите узел сервера на левой панели и дважды щелкните "Сертификаты сервера". (3) Нажмите "Создать самоподписанный сертификат" на правой панели и введите все, что хотите для дружественного имени. (4) Нажмите "Веб-сайт по умолчанию" на левой панели, нажмите "Привязки" на правой панели, нажмите "Добавить", выберите "https", выберите только что созданный сертификат и нажмите "ОК" (5) Доступ URL https, он должен быть доступен.

Ответ 13

Вы просто меняете версию своего приложения с 4.0 на 4.6 и публикуете этот код.

Также добавьте ниже строки кода:

httpRequest.ProtocolVersion = HttpVersion.Version10; 
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;