Pregunta

No somos capaces de conectarse a un servidor HTTPS utilizando WebRequest causa de 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álida con la ruta utilizada, pero a este problema de derivación, se utiliza el siguiente código que hemos tomado de otro post 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 servidor nunca valida el certificado y se produce el error anterior. ¿Alguien tiene alguna idea de lo que debo hacer?


Me debería mencionar que un colega y me llevaron a cabo pruebas hace unas semanas y que estaba trabajando bien con algo similar a lo que he escrito anteriormente. La única "diferencia importante" que hemos encontrado es que estoy usando Windows 7 y que estaba usando Windows XP. ¿Cambia algo?

¿Fue útil?

Solución

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

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

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

Y ahora, funciona perfectamente.


ADENDA

Como se ha mencionado por Robin francesa; si usted está recibiendo este problema durante la configuración de PayPal, por favor nota que no apoyar SSL3 a partir de diciembre de 2018. 3ª Tendrá que usar TLS. Aquí está la página PayPal al respecto.

Otros consejos

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

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

Si usted no tiene .NET 4.5 a continuación, utilizar

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

Asegúrese de que la configuración ServicePointManager se hace antes del HttpWebRequest se crea, de lo contrario no funcionará.

Obras:

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

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

Error:

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://google.com/api/")

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

El problema que tiene es que el usuario ASPNET no tiene acceso al certificado. Usted tiene que dar acceso utilizando la WinHttpCertCfg.exe

Un ejemplo sobre cómo configurar esta opción se encuentra en: http://support.microsoft.com/kb/901183

En el paso 2 en más información

EDIT: En las versiones más recientes de IIS, esta función está incorporada en la herramienta de administrador de certificados - y se puede acceder haciendo clic derecho en el certificado y el uso de la opción para la gestión de 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 no válido o caducado, y que se encargó de que al proporcionar su propio certificado de servidor gancho de validación, pero no es necesariamente la única razón. El servidor puede requerir la autenticación mutua, puede ser configurado con un suites de cifrado no soportados por su cliente, puede tener una deriva de tiempo demasiado grande para el apretón de manos para tener éxito y muchas más razones.

La mejor solución es utilizar el SChannel herramientas de solución de problemas de ajuste. SChannel es el proveedor SSPI responsable de SSL y TLS y su cliente va a usar para el apretón de manos. Echar un vistazo a TLS / SSL Herramientas y ajustes .

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

he tenido este problema tratando de golpear https://ct.mob0.com/Styles/Fun.png, que es una imagen distribuida por CloudFlare en él de CDN que los apoyos cosas locas como SPDY y certs redirección SSL extraños.

En lugar de especificar SSL3 como en Simons contesto yo era capaz de solucionarlo bajando a Tls12 como esto:

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

Después de muchas horas largas con este mismo problema me encontré con que el ASP.NET cuenta el servicio de cliente se ejecuta en no tener acceso al certificado. Me fijo por entrar en el grupo de aplicaciones IIS que las carreras de aplicaciones web bajo, entrar en Configuración avanzada, y cambiando la identidad de la cuenta de LocalSystem NetworkService.

Una mejor solución es conseguir el certificado de trabajo con la cuenta NetworkService defecto, pero esto funciona para pruebas funcionales rápida.

Algo que la respuesta original no tenía. He añadido algo más de código para que sea a prueba de balas.

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

Otra posibilidad es inadecuada importación certificado en el cuadro. Asegúrese de seleccionar la casilla de verificación cercado. Al principio yo no lo hice, así que el código era o bien el tiempo de espera o tirar misma excepción que la clave privada no pudo ser localizado.

diálogo importación certificado

El "Se anuló la solicitud: No se pudo crear SSL / TLS canal seguro" puede producirse una excepción si el servidor devuelve un HTTP 401 no autorizado respuesta a la petición HTTP

.

Se puede determinar si esto está ocurriendo mediante la activación de la tala System.Net a nivel de trazas para su aplicación cliente, como se describe en esta respuesta .

Una vez que la configuración de registro está en su lugar, ejecutar la aplicación y reproducir el error, a continuación, busque en la salida de registro para una línea como la siguiente:

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

En mi situación, yo estaba fallando para establecer una cookie en particular que el servidor estaba esperando, lo que lleva a que el servidor responde a la solicitud con el error 401, que a su vez dio lugar a la "No se pudo crear SSL / TLS canal seguro" excepción.

La raíz de esta excepción en mi caso fue que en algún momento de código se le llamaba la siguiente:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

Esto es realmente malo. No sólo está instruyendo .NET para utilizar un protocolo inseguro, pero esto afecta a cada nuevo cliente Web (y similares) solicitud hecha después dentro de su dominio de aplicación. (Tenga en cuenta que las peticiones entrantes web no se ven afectados en su aplicación ASP.NET, pero las solicitudes WebClient nuevos, como para hablar, en un servicio web externo, lo son).

En mi caso, no era realmente necesaria, por lo que sólo podía suprimir la exposición y todas mis otras peticiones web empezado bien a trabajar de nuevo. Con base en mi lectura en otro lugar, he aprendido un par de cosas:

  • Esta es una configuración global en su dominio de aplicación, y si usted tiene actividad simultánea, no se puede establecer de forma fiable a un valor, hacer su acción, y luego fijarlo de nuevo. Otra acción puede tener lugar durante esa pequeña ventana y ser impactado.
  • El ajuste correcto es dejarlo por defecto. Esto permite que .NET para continuar con el uso de lo que es el valor más seguro predeterminado conforme pasa el tiempo y de actualizar los marcos. Si se establece en TLS12 (que es el más seguro de este escrito) funcionará ahora pero en 5 años puede empezar a causar problemas misteriosos.
  • Si realmente necesita para establecer un valor, se debe considerar hacerlo en una aplicación especializada separada o dominio de aplicación y encontrar una manera de hablar entre ella y su piscina principal. Debido a que es un solo valor global, tratando de manejar dentro de un grupo de aplicación ocupado sólo dará lugar a problemas. Esta respuesta: https://stackoverflow.com/a/26754917/7656 ofrece una posible solución a través de un proxy personalizado . (Tenga en cuenta que no he implementado personalmente.)

Éste está trabajando para mí 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 se puede decir que hay un montón de razones que esto podría suceder. Pensé que iba a añadir la causa que me encontré ...

Si se establece el valor de WebRequest.Timeout a 0, esta es la excepción que se inicia. A continuación se muestra el código que tenía ... (excepto que en lugar de un 0 no modificable por el valor de tiempo de espera, que tenía un parámetro que se estableció de forma inadvertida 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 ...

Otra posible causa del error The request was aborted: Could not create SSL/TLS secure channel es un falta de coincidencia entre los valores configurados cipher_suites de su PC cliente, y los valores que el servidor está configurado como estar dispuesto y capaz de aceptar . En este caso, cuando el cliente envía la lista de valores cipher_suites que es capaz de aceptar en su primer reconocimiento de SSL / negociación "Cliente Hola" mensaje, el servidor ve que ninguno de los valores proporcionados son aceptables, y puede devolver un "Alerta "la respuesta en lugar de proceder a la 'etapa de servidor Hola' del protocolo de enlace SSL.

Para investigar esta posibilidad, se puede descargar Microsoft Message Analizador , y lo utilizan para ejecutar una traza en la negociación SSL que se produce al tratar de dejar de establecer una conexión HTTPS al servidor (en su aplicación de C #).

Si usted es capaz de hacer una conexión HTTPS éxito de otro entorno (por ejemplo, la máquina de Windows XP que usted ha mencionado - o, posiblemente, al golpear el HTTPS URL en un navegador no es de Microsoft que no utiliza la configuración del conjunto de cifrado del sistema operativo , como Chrome o Firefox), ejecutar otra traza de mensaje Analizador en ese entorno a la captura de lo que sucede cuando la negociación SSL tiene éxito.

Con suerte va a ver alguna diferencia entre los dos mensajes de cliente Hola que le permitirán determinar exactamente qué pasa con la negociación SSL no está causando que falle. Entonces usted debería ser capaz de hacer cambios en la configuración de Windows que permitirán que tenga éxito. IISCrypto es una gran herramienta a utilizar para esto (incluso para las PC del cliente, a pesar de la "IIS" nombre ).

Las dos claves del registro de Windows siguientes gobiernan los valores cipher_suites que su PC va a utilizar:

  • HKLM \ SOFTWARE \ Policies \ Microsoft \ Cryptography \ Configuración \ SSL \ 00010002
  • HKLM \ SYSTEM \ CurrentControlSet \ Control \ Cryptography \ Configuración \ Local \ SSL \ 00010002

Aquí hay una valoración crítica completa de cómo he investigado y resuelto un caso 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

he luchado con este problema todo el día.

Cuando creé un nuevo proyecto con .NET 4.5 que finalmente conseguí que funcione.

Pero si lo rebajó a 4,0 Tengo el mismo problema, y ??era irreversible para ese proyecto (incluso cuando traté de actualizar a 4.5 de nuevo).

Extraño ningún otro mensaje de error, pero "Se anuló la solicitud:. No se puede crear SSL / TLS canal seguro" se le ocurrió este error

En el caso de que el cliente es una máquina de las ventanas, una posible razón podría ser que el protocolo TLS o SSL requerida por el servicio no está activado.

Esto se puede configurar en:

  

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

Vaya a la configuración de "Seguridad" y elegir entre

  • Usar SSL 2.0
  • Usar SSL 3.0
  • Usar TLS 1.0
  • Usar TLS 1.1
  • Usar TLS 1.2

 introducir descripción de la imagen aquí

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

<httpRuntime targetFramework="4.5.2" />

y no con:

<httpRuntime targetFramework="4.6.1" />

En mi caso, la cuenta de servicio que ejecuta la aplicación no tiene permiso para acceder a la clave privada. Una vez me dio este permiso, el error se fue

  1. MMC
  2. certificados
  3. Expandir para personal
  4. seleccione cert
  5. botón derecho del ratón
  6. Todas las tareas
  7. Administrar claves privadas
  8. Agregar

Si está ejecutando su código de Visual Studio, Visual Studio intente ejecutar como administrador. Se ha solucionado el problema para mí.

Yo estaba teniendo el mismo tema y encontré esta respuesta funcionaba correctamente para mí. La clave es 3072. Este enlace proporciona los detalles en el '3072' arreglo.

ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

XmlReader r = XmlReader.Create(url);
SyndicationFeed albums = SyndicationFeed.Load(r);

En mi caso dos alimentaciones requiere la revisión:

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

System.NET.WebException: Se anuló la solicitud: ¿No podría crear   SSL / TLS canal seguro.

En nuestro caso, donde el uso de un proveedor de software, así que no tenemos acceso para modificar el código .NET. Al parecer .NET 4 no utilizará TLS v 1.2 a menos que haya un cambio.

La corrección para nosotros fue la adición de 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 nuestra "parche" al 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

Prueba esto:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

El arriba votó respuesta probablemente será suficiente para la mayoría de la gente. Sin embargo, en algunas circunstancias, puede continuar recibiendo un "canal seguro No se pudo crear SSL / TLS" error incluso después de obligar a TLS 1.2. Si es así, es posible que desee consultar este útil artículo para los pasos de solución de problemas adicionales. Para resumir: independiente de la edición de la versión TLS / SSL, el cliente y el servidor deben ponerse de acuerdo sobre un "conjunto de cifrado." Durante la fase de "apretón de manos" de la conexión SSL, el cliente mostrará una lista de sus suites de cifrado-soportados por el servidor para comprobar contra su propia lista. Sin embargo, en algunas máquinas de Windows, algunos de cifrado-suites comunes pueden haber sido desactivado (aparentemente debido a los intentos bien intencionados a la superficie de ataque de límite), disminuyendo la posibilidad de que el servidor del cliente y ponerse de acuerdo sobre un conjunto de cifrado. Si no se ponen de acuerdo, entonces es posible que vea "código de alerta fatal 40" en el visor de eventos y "No se pudo crear SSL / TLS canal seguro" en su programa de .NET.

El citado artículo explica cómo enumerar todos los conjuntos de cifrado soportados potencialmente de una máquina y habilitar conjuntos de cifrado adicionales a través del registro de Windows. Para comprobar la cual ayuda conjuntos de cifrado están activados en el cliente, intente visitar esta página de diagnóstico en MSIE . (El uso de seguimiento System.Net puede dar resultados más definitivos.) Para comprobar qué suites de cifrado soportadas por el servidor, prueba a esta herramienta en línea (suponiendo que el servidor es accesible por Internet). No hace falta decir que ediciones del Registro debe hacerse con precaución , en especial cuando se trata de redes. (¿Es la máquina de una máquina virtual alojada remoto? Si se va a romper redes, sería la máquina virtual será accesible a todos?)

En el caso de mi empresa, nos permitió varias suites adicionales "ECDHE_ECDSA" a través del registro de edición, para arreglar un problema inmediato y protegerse contra futuros problemas. Pero si usted no puede (o no) de modificar el Registro, a continuación, numerosas soluciones alternativas (no necesariamente bastante) vienen a la mente. Por ejemplo:. Su programa .NET podría delegar su tráfico SSL a un programa de Python independiente (que puede trabajar en sí, por la misma razón que las solicitudes Chrome pueden tener éxito donde las solicitudes de MSIE fallan en una máquina afectada)

El problema para mí fue que yo estaba tratando de desplegar en IIS como un servicio web, he instalado el certificado en el servidor, pero el usuario que ejecuta IIS no tiene los permisos correctos en el certificado.

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

En mi caso he tenido este problema cuando un servicio de Windows intentó conectado a un servicio web. Buscando en los eventos de Windows, finalmente, me encontré con un código de error.

  

Evento ID 36888 (Schannel) se eleva:

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

Por último, se relaciona con una revisión de Windows. En mi caso: KB3172605 y KB3177186

La solución propuesta en el foro de VMware fue agregar una entrada del registro de Windows. Después de añadir el siguiente registro todo trabaja muy bien.

  

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

"ClientMinKeyBitLength" = dword: 00000200

Al parecer, se ha relacionado con un valor que falta en el https apretón de manos en el lado del cliente.

Lista de su revisión de Windows:

wmic qfe list

Solución Hilo:

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

La esperanza es ayuda.

Ninguna de las respuestas trabajado para mí.

Esto es lo que ha funcionado:

En lugar de inicializar mi X509Certifiacte2 como esto:

   var certificate = new X509Certificate2(bytes, pass);

Lo hice así:

   var certificate = new X509Certificate2(bytes, pass, X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable);

Aviso del X509KeyStorageFlags.Exportable !!

Yo no cambió el resto del código (el WebRequest sí mismo):

// I'm not even sure the first two lines are necessary:
ServicePointManager.Expect100Continue = true; 
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

request = (HttpWebRequest)WebRequest.Create(string.Format("https://{0}.sii.cl/cvc_cgi/dte/of_solicita_folios", server));
request.Method = "GET";
request.Referer = string.Format("https://hercules.sii.cl/cgi_AUT2000/autInicio.cgi?referencia=https://{0}.sii.cl/cvc_cgi/dte/of_solicita_folios", servidor);
request.UserAgent = "Mozilla/4.0";
request.ClientCertificates.Add(certificate);
request.CookieContainer = new CookieContainer();

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    // etc...
}

De hecho, ni siquiera estoy seguro de que las dos primeras líneas son necesarias ...

Esta pregunta puede tener muchas respuestas, ya que se trata de un mensaje de error genérico. Nos encontramos con este problema en algunos de nuestros servidores, pero no nuestras máquinas de desarrollo. Después de extraer la mayor parte de nuestro cabello, nos pareció que era un error de Microsoft.

https://support.microsoft.com/en-us/help/4458166/applications-that-rely-on-tls-1-2-strong-encryption-experience-connect

En esencia, MS supone que desea cifrado más débil, pero el sistema operativo está parcheado para permitir sólo TLS 1.2, por lo que recibe el temido "Se anuló la solicitud:. No se puede crear SSL / TLS canal seguro"

Hay tres correcciones.

1) parchear el sistema operativo con la actualización correcta: http: / /www.catalog.update.microsoft.com/Search.aspx?q=kb4458166

2) añada un ajuste a su archivo app.config / web.config.

3) Añadir una configuración de registro que ya se ha mencionado en otra respuesta.

Todo esto se menciona en el artículo de la base de conocimientos que he publicado.

Se puede tratar de instalar un certificado de demostración (algunos proveedores de SSL ofertas de forma gratuita durante un mes) para estar seguro de si el problema está relacionado con la validez o no cert.

Mientras este es un enlace relativamente "en vivo" pensé que iba a añadir una nueva opción. Esa posibilidad es que el servicio ya no está apoyando SSL 3.0 debido al problema con el ataque del caniche. Echa un vistazo a la declaración de Google en esto. Me encontré con este problema con varios servicios web a la vez y se dio 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 / este-caniche-bites-explotación-ssl-30.html

Esto ocurría para mí en un solo sitio, y resulta que sólo tenía el cifrado RC4 disponible. En un esfuerzo previo para endurecer el servidor, que había desactivado el sistema de cifrado RC4, una vez que se vuelva a habilitar esta el problema fue solucionado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top