samsung - "La conexión subyacente se cerró: se produjo un error inesperado en un envío". Con certificado SSL
la aplicacion sufrio un error interno al cargar las bibliotecas ssl (8)
Problema: Obtengo esta excepción "LA CONEXIÓN SUBYACENTE FUE CERRADA: UN ERROR INESPERADO OCURRIDO EN UN ENVÍO" en mis registros y está rompiendo nuestra integración OEM con nuestro sistema de marketing por correo electrónico en momentos aleatorios que varían desde [1 hora - 4 horas]
Mi sitio web está alojado en Windows Server 2008 R2 con IIS 7.5.7600. Este sitio web tiene una gran cantidad de componentes OEM y un tablero integral. Todo funciona bien con todos los otros elementos del sitio web, excepto con uno de nuestro componente de marketing por correo electrónico que estamos utilizando como una solución de marco flotante en nuestro panel. La forma en que funciona es que envío un httpWebRequestobject con todas las credenciales y recibo una URL que pongo en un iframe y funciona. Pero solo funciona durante un tiempo [1 hora - 4 horas] y luego obtengo la siguiente excepción "LA CONEXIÓN SUBYACENTE FUE CERRADA: SE PRODUJO UN ERROR INESPERADO EN UN ENVÍO" e incluso si el sistema intenta obtener la URL de httpWebRequest falla con la misma excepción La única forma de volver a hacerlo funcionar es reciclando el grupo de aplicaciones o todo se edita en web.config. Estoy realmente agotado toda la opción que se me ocurre.
Opción probada
Agregado explícitamente, keep-alive = false
keep-alive = true
Aumentó el tiempo de espera: <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />
He subido esta página a un sitio web que no pertenece a SSL para verificar si el certificado SSL en nuestro servidor de producción está realizando la conexión para indicar cómo.
Cualquier dirección hacia la resolución es muy apreciada.
Código:
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`
Descubrí que esto es una señal de que el servidor en el que está implementando el código tiene instalado un antiguo .NET Framework que no admite TLS 1.1 o TLS 1.2. Pasos para arreglar:
- Instalar el .NET Runtime más reciente en sus servidores de producción (IIS y SQL)
- Instalar el último .NET Developer Pack en sus máquinas de desarrollo.
- Cambie la configuración de "Marco de destino" en sus proyectos de Visual Studio al último .NET Framework.
Puede obtener el último .NET Developer Pack y Runtime desde esta URL: http://getdotnet.azurewebsites.net/target-dotnet-platforms.html
El siguiente código resolvió el problema
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Ssl3
El siguiente código resolvió mi problema:
request.ProtocolVersion = HttpVersion.Version10; // THIS DOES THE TRICK
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
En mi caso, el sitio al que me estoy conectando se ha actualizado a TLS 1.2. Como resultado, tuve que instalar .net 4.5.2 en mi servidor web para poder admitirlo.
He estado teniendo el mismo problema por días con una integración que también simplemente "solía funcionar antes".
Fuera de pura depresión, lo intenté
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
Esto lo resolvió para mí ... aunque la integración solo hace uso estricto de SSLv3.
Llegué a la conclusión de que algo no funcionaba desde que Fiddler informó haber dicho que hay un "cifrado de negociación de TLS vacío" o algo por el estilo.
¡Espero que funcione!
Para mí fue tls12:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Si está atrapado con .Net 4.0 y el sitio de destino usa TLS 1.2, necesita la siguiente línea. ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
fuente: Soporte TLS 1.2 y .NET: cómo evitar errores de conexión
Usar un proxy de depuración HTTP puede causar esto, como Fiddler.
Estaba cargando un certificado PFX desde un archivo local (autenticación a Apple.com) y falló porque Fiddler no pudo pasar este certificado.
Intente desactivar Fiddler para verificar y, si esa es la solución, probablemente deba instalar el certificado en su máquina o de alguna manera que Fiddler pueda usarlo.