La solicitud se anuló: no se pudo crear el canal seguro SSL / TLS

No podemos conectarnos a un servidor HTTPS utilizando WebRequest debido a este mensaje de error:

The request was aborted: Could not create SSL/TLS secure channel.

Sabemos que el servidor no tiene un certificado HTTPS válido con la ruta utilizada, pero para evitar este problema, utilizamos el siguiente código que hemos tomado de otra publicación de StackOverflow:

 private void Somewhere() { ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(AlwaysGoodCertificate); } private static bool AlwaysGoodCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors policyErrors) { return true; } 

El problema es que el servidor nunca valida el certificado y falla con el error anterior. ¿Alguien tiene alguna idea de lo que debería hacer?


Debo mencionar que un colega y yo realizamos pruebas hace unas semanas y funcionaba bien con algo similar a lo que escribí anteriormente. La única “gran diferencia” que hemos encontrado es que estoy usando Windows 7 y él estaba usando Windows XP. ¿Eso cambia algo?

Finalmente encontré la respuesta (no he notado mi fuente pero fue de una búsqueda);

Mientras que el código funciona en Windows XP, en Windows 7, debe agregar esto al principio:

 ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; // Use SecurityProtocolType.Ssl3 if needed for compatibility reasons 

Y ahora, funciona perfectamente.


APÉNDICE

Como lo menciona Robin French; PayPal ya no es compatible con SSL3, por lo que deberá usar TLS1.2. Página de información de Paypal

La solución a esto, en .NET 4.5 es

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

Si no tiene .NET 4.5, use

 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; 

El problema que tiene es que el usuario aspNet no tiene acceso al certificado. Tienes que dar acceso usando winhttpcertcfg.exe

Un ejemplo sobre cómo configurar esto es en: http://support.microsoft.com/kb/901183

Debajo del paso 2 en más información

EDITAR: en las versiones más recientes de IIS, esta función está integrada en la herramienta del administrador de certificados, y se puede acceder haciendo clic con el botón derecho en el certificado y utilizando la opción para administrar claves privadas. Más detalles aquí: https://serverfault.com/questions/131046/how-to-grant-iis-7-5-access-to-a-certificate-in-certificate-store/132791#132791

El error es genérico y hay muchas razones por las cuales la negociación SSL / TLS puede fallar. El más común es un certificado de servidor caducado o no válido, y usted se encargó de eso al proporcionar su propio enlace de validación de certificado de servidor, pero no es necesariamente la única razón. El servidor puede requerir autenticación mutua, puede configurarse con un conjunto de cifras no admitidas por su cliente, puede tener una deriva de tiempo demasiado grande para que el saludo tenga éxito y muchas más razones.

La mejor solución es utilizar el conjunto de herramientas de solución de problemas de SChannel. SChannel es el proveedor de SSPI responsable de SSL y TLS y su cliente lo utilizará para el intercambio de información. Eche un vistazo a las herramientas y configuraciones de TLS / SSL .

También vea Cómo habilitar el registro de eventos de Schannel .

Tuve este problema intentando presionar https://ct.mob0.com/Styles/Fun.png , que es una imagen distribuida por CloudFlare en su CDN que admite cosas alocadas como SPDY y extraños certificados redirigidos SSL.

En lugar de especificar Ssl3 como en la respuesta de Simons, pude solucionarlo bajando a Tls12 de esta manera:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; new WebClient().DownloadData("https://ct.mob0.com/Styles/Fun.png"); 

Algo que la respuesta original no tenía. Agregué más código para hacerlo a prueba de balas.

 ServicePointManager.Expect100Continue = true; ServicePointManager.DefaultConnectionLimit = 9999; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; 

Otra posibilidad es la importación incorrecta de certificados en la caja. Asegúrese de seleccionar la checkbox rodeada. Inicialmente no lo hice, por lo que el código se agotó o arrojó la misma excepción ya que no se pudo ubicar la clave privada.

diálogo de importación de certificado

Después de muchas largas horas con este mismo problema, descubrí que la cuenta de ASP.NET en la que se ejecutaba el servicio de cliente no tenía acceso al certificado. Lo arreglé yendo al Pool de aplicaciones IIS con el que se ejecuta la aplicación web, yendo a Configuración avanzada y cambiando la Identidad a la cuenta LocalSystem desde NetworkService .

Una mejor solución es hacer que el certificado funcione con la cuenta predeterminada de NetworkService , pero esto funciona para pruebas funcionales rápidas.

Este me funciona en MVC webclient

  public string DownloadSite(string RefinedLink) { try { Uri address = new Uri(RefinedLink); ServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12; using (WebClient webClient = new WebClient()) { var stream = webClient.OpenRead(address); using (StreamReader sr = new StreamReader(stream)) { var page = sr.ReadToEnd(); return page; } } } catch (Exception e) { log.Error("DownloadSite - error Lin = " + RefinedLink, e); return null; } } 

Como puede ver, hay muchas razones por las que esto podría suceder. Pensé que agregaría la causa que encontré …

Si establece el valor de WebRequest.Timeout en 0 , esta es la excepción que se lanza. Debajo está el código que tenía … (Excepto en lugar de un 0 codificado para el valor de tiempo de espera, tenía un parámetro que se ajustó inadvertidamente a 0 ).

 WebRequest webRequest = WebRequest.Create(@"https://myservice/path"); webRequest.ContentType = "text/html"; webRequest.Method = "POST"; string body = "..."; byte[] bytes = Encoding.ASCII.GetBytes(body); webRequest.ContentLength = bytes.Length; var os = webRequest.GetRequestStream(); os.Write(bytes, 0, bytes.Length); os.Close(); webRequest.Timeout = 0; //setting the timeout to 0 causes the request to fail WebResponse webResponse = webRequest.GetResponse(); //Exception thrown here ... 

La excepción “La solicitud se anuló: No se pudo crear SSL / TLS de canal seguro” puede ocurrir si el servidor devuelve una respuesta HTTP 401 no autorizada a la solicitud HTTP.

Puede determinar si esto está sucediendo activando el registro de System.Net a nivel de rastreo para su aplicación cliente, como se describe en esta respuesta .

Una vez que la configuración de registro está en su lugar, ejecute la aplicación y reproduzca el error, luego busque en el resultado de registro una línea como esta:

 System.Net Information: 0 : [9840] Connection#62912200 - Received status line: Version=1.1, StatusCode=401, StatusDescription=Unauthorized. 

En mi situación, no establecía una cookie concreta que el servidor esperaba, lo que hacía que el servidor respondiera a la solicitud con el error 401, que a su vez llevaba a la excepción “No se pudo crear SSL / TLS seguro”.

Asegúrese de que las configuraciones de ServicePointManager estén hechas antes de que HttpWebRequest esté hecho, de lo contrario no funcionará.

Trabajos:

  ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/") 

Falla:

  HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/") ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12 | SecurityProtocolType.Ssl3; 

He luchado con este problema todo el día.

Cuando creé un nuevo proyecto con .NET 4.5, finalmente lo conseguí.

Pero si bajé a 4.0 obtuve el mismo problema otra vez, y fue irreversable para ese proyecto (incluso cuando intenté actualizar a 4.5 nuevamente).

Extraño ningún otro mensaje de error, pero “La solicitud se anuló: no se pudo crear el canal seguro de SSL / TLS”. surgió por este error

Otra posible causa de la The request was aborted: Could not create SSL/TLS secure channel error de The request was aborted: Could not create SSL/TLS secure channel es una falta de coincidencia entre los valores de cipher_suites configurados de su PC cliente y los valores que el servidor está configurado como dispuesto y capaz de aceptar . En este caso, cuando su cliente envía la lista de valores de cipher_suites que puede aceptar en su mensaje inicial de establecimiento de enlace / negociación de SSL “Hola de cliente”, el servidor ve que ninguno de los valores proporcionados es aceptable y puede devolver una “Alerta”. “respuesta en lugar de proceder al paso” Servidor Hola “del protocolo de enlace SSL.

Para investigar esta posibilidad, puede descargar Microsoft Message Analyzer y utilizarlo para ejecutar un seguimiento en la negociación de SSL que ocurre cuando intenta y no puede establecer una conexión HTTPS con el servidor (en su aplicación C #).

Si puede hacer una conexión HTTPS exitosa desde otro entorno (por ejemplo, la máquina con Windows XP que mencionó) o posiblemente al presionar la URL HTTPS en un navegador que no sea de Microsoft que no use la configuración de la suite de cifrado del sistema operativo, como Chrome o Firefox), ejecute otro rastreo de Message Analyzer en ese entorno para capturar lo que sucede cuando la negociación SSL tiene éxito.

Con suerte, verá una diferencia entre los dos mensajes de Client Hello que le permitirán identificar exactamente qué pasa con la negociación SSL fallida que hace que falle. Entonces debería poder hacer cambios de configuración en Windows que le permitirán tener éxito. IISCrypto es una gran herramienta para usar para esto (incluso para PC cliente, a pesar del nombre “IIS”).

Las siguientes dos claves de registro de Windows rigen los valores de cipher_suites que su PC usará:

  • HKLM \ SOFTWARE \ Policies \ Microsoft \ Cryptography \ Configuration \ SSL \ 00010002
  • HKLM \ SYSTEM \ CurrentControlSet \ Control \ Cryptography \ Configuration \ Local \ SSL \ 00010002

Aquí hay un informe completo de cómo investigué y resolví una instancia de esta variedad del problema Could not create SSL/TLS secure channel : http://blog.jonschneider.com/2016/08/fix-ssl-handshaking-error-in -windows.html

La raíz de esta excepción en mi caso fue que en algún punto del código se llamaba lo siguiente:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; 

Esto es realmente malo No solo le indica a .NET que use un protocolo inseguro, sino que esto afecta cada nueva solicitud de WebClient (y similar) realizada posteriormente dentro de su dominio de aplicación. (Tenga en cuenta que las solicitudes web entrantes no se ven afectadas en su aplicación ASP.NET, pero las nuevas solicitudes de WebClient, como para hablar con un servicio web externo, son).

En mi caso, en realidad no era necesario, así que simplemente pude eliminar la statement y todas mis otras solicitudes web comenzaron a funcionar bien otra vez. Basado en mi lectura en otro lugar, aprendí algunas cosas:

  • Esta es una configuración global en su dominio de aplicación, y si tiene actividad simultánea, no puede establecerla de manera confiable en un valor, realizar su acción y luego restablecerla. Otra acción puede tener lugar durante esa pequeña ventana y ser impactada.
  • La configuración correcta es dejarlo predeterminado. Esto permite que .NET continúe usando el valor predeterminado más seguro a medida que pasa el tiempo y actualiza los marcos. Establecerlo en TLS12 (que es el más seguro a partir de este escrito) funcionará ahora, pero en 5 años puede comenzar a causar problemas misteriosos.
  • Si realmente necesita establecer un valor, debe considerar hacerlo en una aplicación especializada independiente o dominio de aplicación y buscar la manera de hablar entre él y su grupo principal. Debido a que es un único valor global, tratar de administrarlo dentro de un grupo de aplicaciones ocupadas solo generará problemas. Esta respuesta: https://stackoverflow.com/a/26754917/7656 proporciona una posible solución a través de un proxy personalizado. (Tenga en cuenta que no lo he implementado personalmente).

En caso de que el cliente sea una máquina de Windows, una posible razón podría ser que el protocolo tls o ssl requerido por el servicio no esté activado.

Esto se puede configurar en:

Panel de control -> Red e Internet -> Opciones de Internet -> Avanzado

Desplácese hacia abajo a “Seguridad” y elija entre

  • Use SSL 2.0
  • Use SSL 3.0
  • Usa TLS 1.0
  • Usa TLS 1.1
  • Use TLS 1.2

enter image description here

Tuve este problema porque mi web.config tenía:

  

y no:

  

En mi caso, la cuenta de servicio que ejecuta la aplicación no tenía permiso para acceder a la clave privada. Una vez que di este permiso, el error desapareció

  1. mmc
  2. certificados
  3. Expandir a personal
  4. seleccionar cert
  5. botón derecho del ratón
  6. Todas las tareas
  7. Administrar claves privadas
  8. Añadir

Si está ejecutando su código desde Visual Studio, intente ejecutar Visual Studio como administrador. Solucionado el problema para mí.

Estaba teniendo el mismo problema y encontré que esta respuesta funcionó correctamente para mí. La clave es 3072. Este enlace proporciona los detalles sobre la corrección ‘3072’.

 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072; XmlReader r = XmlReader.Create(url); SyndicationFeed albums = SyndicationFeed.Load(r); 

En mi caso, dos alimentaciones requieren la solución:

 https://www.fbi.gov/feeds/fbi-in-the-news/atom.xml https://www.wired.com/feed/category/gear/latest/rss 

System.Net.WebException: la solicitud se anuló: no se pudo crear el canal seguro SSL / TLS.

En nuestro caso, usamos un proveedor de software, por lo que no teníamos acceso para modificar el código .NET. Aparentemente .NET 4 no usará TLS v 1.2 a menos que haya un cambio.

La solución para nosotros fue agregar la clave SchUseStrongCrypto al registro. Puede copiar / pegar el siguiente código en un archivo de texto con la extensión .reg y ejecutarlo. Sirvió como nuestro “parche” para el problema.

 Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319] "SchUseStrongCrypto"=dword:00000001 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\v4.0.30319] "SchUseStrongCrypto"=dword:00000001 

Puede intentar instalar un certificado de demostración (algunos proveedores de SSL lo ofrecen de forma gratuita durante un mes) para asegurarse de que el problema esté relacionado con la validez del certificado o no.

Mientras este sea un enlace relativamente “en vivo” pensé que agregaría una nueva opción. Esa posibilidad es que el servicio ya no sea compatible con SSL 3.0 debido al problema con el ataque de Poodle. Consulte la statement de Google sobre esto. Encontré este problema con varios servicios web a la vez y me di cuenta de que algo tenía que estar pasando. Cambié a TLS 1.2 y todo está funcionando de nuevo.

http://googleonlinesecurity.blogspot.com/2014/10/this-poodle-bites-exploiting-ssl-30.html

El problema para mí era que estaba tratando de implementar en IIS como un servicio web, instalé el certificado en el servidor, pero el usuario que ejecuta IIS no tenía los permisos correctos en el certificado.

¿Cómo dar acceso a ASP.NET a una clave privada en un certificado en el almacén de certificados?

Esto me estaba sucediendo en un solo sitio, y resulta que solo tenía el cifrado RC4 disponible. En un esfuerzo previo para fortalecer el servidor, deshabilité el cifrado RC4, una vez que lo reactivaste, se solucionó el problema.

Además de las respuestas anteriores, asegúrese de haber importado el certificado CER, y NO el archivo PFX en su tienda local de máquinas. Un error común cuando tienes ambos archivos.

En mi caso, tuve este problema cuando un servicio de Windows intentó conectarse a un servicio web. Mirando en eventos de Windows finalmente encontré un código de error.

Evento ID 36888 (Schannel) se plantea:

 The following fatal alert was generated: 40. The internal error state is 808. 

Finalmente se relacionó con un Hotfix de Windows. En mi caso: KB3172605 y KB3177186

La solución propuesta en el foro vmware fue agregar una entrada de registro en Windows. Después de agregar el siguiente registro, todo funciona bien.

[HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ SecurityProviders \ SCHANNEL \ KeyExchangeAlgorithms \ Diffie-Hellman]

“ClientMinKeyBitLength” = dword: 00000200

Aparentemente está relacionado con un valor faltante en el protocolo de enlace https en el lado del cliente.

Enumere su Windows HotFix:

 wmic qfe list 

Hilo de solución:

https://communities.vmware.com/message/2604912#2604912

Espero que sea de ayuda.

El .NET ServicePointManager.SecurityProtocol predeterminado usa SSLv3 y TLS. Si está accediendo a un servidor Apache, hay una variable de configuración llamada SSLProtocol que por defecto es TLSv1.2. Puede configurar ServicePointManager.SecurityProtocol para usar el protocolo apropiado admitido por su servidor web o cambiar su configuración de Apache para permitir que todos los protocolos como este SSLProtocol .

Esto me solucionó, agregue el Servicio de red a los permisos. Haga clic derecho en el certificado> Todas las tareas> Administrar claves privadas> Agregar> Servicio de red

Me encontré con el mismo problema recientemente. Mi entorno se está ejecutando en .NET 4.6.1 con VB.NET. Así es como lo arreglé:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 ServicePointManager.ServerCertificateValidationCallback = New RemoteCertificateValidationCallback(AddressOf util.ValidateServerCertificate) 

y la función util.ValidateServerCertificate es:

 Public Function ValidateServerCertificate(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean Return True End Function