servicio consumir consume con c# .net ssl trust

c# - consumir - ssl java web service



No se pudo establecer una relación de confianza para el canal seguro SSL/TLS-SOAP (15)

Tengo una llamada de servicio web simple, generada por una aplicación de Windows .NET (C #) 2.0, a través del proxy de servicio web generado por Visual Studio, para un servicio web también escrito en C # (2.0). Esto ha funcionado durante varios años, y continúa haciéndolo en una docena de lugares donde se está ejecutando.

Una nueva instalación en un sitio nuevo se está ejecutando en un problema. Al intentar invocar el servicio web, falla con el mensaje que dice:

No se pudo establecer una relación de confianza para el canal seguro SSL / TLS

La URL del servicio web utiliza SSL (https: //), pero ha estado funcionando durante mucho tiempo (y continúa haciéndolo) desde muchas otras ubicaciones.

Donde miro ¿Podría tratarse de un problema de seguridad entre Windows y .NET que sea exclusivo de esta instalación? Si es así, ¿dónde establezco relaciones de confianza? ¡Estoy perdido!


Acabo de encontrar este problema. Mi resolución fue actualizar la hora del sistema sincronizando manualmente con los servidores de hora. Para hacer esto puedes:

  • Haga clic derecho en el reloj en la barra de tareas
  • Seleccione Adjust Date/Time
  • Seleccione la pestaña de Internet Time
  • Haga clic en Change Settings
  • Seleccione Update Now

En mi caso, esto se estaba sincronizando incorrectamente, así que tuve que hacer clic varias veces antes de que se actualizara correctamente. Si continúa actualizándose incorrectamente, incluso puede intentar usar un servidor de tiempo diferente del desplegable del servidor.


En mi caso, estaba intentando probar SSL en mi entorno de Visual Studio utilizando IIS 7.

Esto es lo que terminé haciendo para que funcione:

  • Bajo mi sitio en la sección ''Enlaces ...'' a la derecha en IIS, tuve que agregar el enlace ''https'' al puerto 443 y seleccionar "Certificado de desarrollo IIS Express".

  • Debajo de mi sitio, en la sección ''Configuración avanzada ...'' a la derecha, tuve que cambiar los ''Protocolos habilitados'' de "http" a "https".

  • Bajo el ícono ''Configuración SSL'', seleccioné ''Aceptar'' para los certificados de cliente.

  • Luego tuve que reciclar el grupo de aplicaciones.

  • También tuve que importar el certificado de host local en mi tienda personal utilizando mmc.exe.

Mi archivo web.config ya estaba configurado correctamente, por lo que después de haber resuelto todo lo anterior, pude continuar con mis pruebas.



La solución muy simple de "atrapar todo" es esta:

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };

La solución de sebastian-castaldi es un poco más detallada.


Los siguientes fragmentos solucionarán el caso en el que hay un error con el certificado SSL en el servidor al que está llamando. Por ejemplo, puede ser autofirmado o el nombre de host entre el certificado y el servidor puede no coincidir.

Esto es peligroso si llama a un servidor fuera de su control directo, ya que ya no puede estar tan seguro de que está hablando con el servidor al que cree que está conectado. Sin embargo, si está tratando con servidores internos y no es práctico obtener un certificado "correcto", use lo siguiente para decirle al servicio web que ignore los problemas del certificado y que valientemente siga siendo soldado.

Los dos primeros usan expresiones lambda, el tercero usa código regular. El primero acepta cualquier certificado. Los dos últimos, al menos, comprueban que el nombre de host en el certificado es el que usted espera.
... espero que te sea útil

//Trust all certificates System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, certificate, chain, sslPolicyErrors) => true); // trust sender System.Net.ServicePointManager.ServerCertificateValidationCallback = ((sender, cert, chain, errors) => cert.Subject.Contains("YourServerName")); // validate cert by calling a function ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateValidationCallback(ValidateRemoteCertificate); // callback used to validate the certificate in an SSL conversation private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors policyErrors) { bool result = false; if (cert.Subject.ToUpper().Contains("YourServerName")) { result = true; } return result; }


Luke escribió un artículo bastante bueno sobre esto ... bastante sencillo ... inténtalo

La solución de luke

Razón (cita de su artículo (menos la maldición)) ".. El problema con el código anterior es que no funciona si su certificado no es válido. ¿Por qué estaría publicando en una página web con un certificado SSL no válido? Porque Soy barato y no tenía ganas de pagar Verisign o uno de los otros ** - * s por un certificado en mi caja de prueba, así que lo firmé. Cuando envié la solicitud, me lanzaron una hermosa excepción:

System.Net.WebException Se cerró la conexión subyacente. No se pudo establecer una relación de confianza con el servidor remoto.

No sé sobre usted, pero para mí esa excepción parecía algo que sería causado por un error tonto en mi código que causó que el POST fallara. Así que seguí buscando, ajustando y haciendo todo tipo de cosas extrañas. Solo después de que busqué en Google la cosa *** n descubrí que el comportamiento predeterminado después de encontrar un certificado SSL no válido es lanzar esta misma excepción. .. "


Para aquellos que tienen este problema a través de un lado del cliente VS, una vez que agregaron exitosamente una referencia de servicio y trataron de ejecutar la primera llamada obtuvieron esta excepción: "La conexión subyacente se cerró: No se pudo establecer una relación de confianza para el canal seguro SSL / TLS" Si está utilizando (como en mi caso) una URL de punto final con la dirección IP y obtuvo esta excepción, entonces probablemente deba volver a agregar la referencia del servicio siguiendo estos pasos:

  • Abra la URL del punto final en Internet Explorer.
  • Haga clic en el error de certificado (icono rojo en la barra de direcciones)
  • Haga clic en Ver certificados.
  • Agarre el mensaje emitido para: "nombre" y reemplace la dirección IP o el nombre que estuviéramos usando y obteniendo el error para este "nombre".

Inténtalo de nuevo :). Gracias


Pensamientos (basados ​​en el dolor en el pasado):

  • ¿Tiene DNS y línea de vista al servidor?
  • ¿Está utilizando el nombre correcto del certificado?
  • ¿El certificado sigue siendo válido?
  • es un mal configurador de carga mal arreglando las cosas?
  • ¿la nueva máquina servidor tiene el reloj configurado correctamente (es decir, para que la hora UTC sea correcta [ignorar la hora local, es en gran medida irrelevante]) - esto ciertamente es importante para WCF, por lo que puede afectar el SOAP normal?
  • ¿Hay un problema de cadena de confianza certificado? Si navega desde el servidor al servicio de jabón, ¿puede obtener SSL?
  • relacionado con lo anterior: ¿se ha instalado el certificado en la ubicación correcta? (Es posible que necesite una copia en Trusted Root Certification Authorities)
  • ¿Está configurado correctamente el proxy a nivel de máquina del servidor? (que difiere del proxy del usuario); vea proxycfg para XP / 2003 (no estoy seguro acerca de Vista, etc.)

Personalmente, me gusta más la siguiente solución:

using System.Security.Cryptography.X509Certificates; using System.Net.Security;

... luego, antes de que solicite el error, haga lo siguiente

System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors) { return true; };

Encontré esto después de consultar la Solución de Luke.


Prueba esto:

System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

Tenga en cuenta que debe trabajar al menos con 4.5 .NET Framework


Si está utilizando Windows 2003, puede intentar esto:

Abra Microsoft Management Console (Inicio -> Ejecutar -> mmc.exe);

Seleccione Archivo -> Agregar o quitar complemento;

En la pestaña Independiente, elija Agregar;

Elija el complemento Certificados y haga clic en Agregar;

En el asistente, elija la cuenta de equipo y, a continuación, elija Equipo local. Presione Finalizar para finalizar el asistente;

Cierre el cuadro de diálogo Agregar o quitar complemento;

Vaya a Certificados (equipo local) y elija una tienda para importar:

Si tiene el certificado de CA raíz para la compañía que emitió el certificado, elija Autoridades de certificación de raíz de confianza;

Si tiene el certificado para el servidor, elija Otras personas

Haga clic con el botón derecho en la tienda y elija Todas las tareas -> Importar

Siga el asistente y proporcione el archivo de certificado que tiene;

Después de eso, simplemente reinicie IIS e intente llamar nuevamente al servicio web.

Referencia: http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-establish-trust-relationship-for-the-SSL/TLS- ...


Si no quiere confiar ciegamente en todos y hacer una excepción de confianza solo para ciertos hosts, la siguiente solución es más apropiada.

public static class Ssl { private static readonly string[] TrustedHosts = new[] { "host1.domain.com", "host2.domain.com" }; public static void EnableTrustedHosts() { ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => { if (errors == SslPolicyErrors.None) { return true; } var request = sender as HttpWebRequest; if (request != null) { return TrustedHosts.Contains(request.RequestUri.Host); } return false; }; } }

Luego simplemente llame a Ssl.EnableTrustedHosts cuando se inicie su aplicación.


Tuve este error corriendo contra un servidor web con url como:

a.b.domain.com

pero no había certificado para eso, así que recibí un DNS llamado

a_b.domain.com

Acabo de ponerle una pista a esta solución aquí, ya que se destacó en Google.


Tuve un problema similar en la aplicación .NET en Internet Explorer.

Resolví el problema al agregar el certificado (certificado de VeriSign Clase 3 en mi caso) a los certificados de editores de confianza.

Vaya a Opciones de Internet-> Contenido -> Editores e impórtelo.

Puede obtener el certificado si lo exporta desde:

Opciones de Internet-> Contenido -> Certificados -> Autoridades de certificación intermedias -> Autoridad de certificación primaria pública VeriSign Clase 3 - G5


Si no funciona, no se puede realizar un certificado, cuando ServerCertificateValidationCallback devuelva true; Mi código de ServerCertificateValidationCallback:

ServicePointManager.ServerCertificateValidationCallback += delegate { LogWriter.LogInfo("Проверка сертификата отключена, на уровне ServerCertificateValidationCallback"); return true; };

Mi código que impidió ejecutar ServerCertificateValidationCallback:

if (!(ServicePointManager.CertificatePolicy is CertificateValidation)) { CertificateValidation certValidate = new CertificateValidation(); certValidate.ValidatingError += new CertificateValidation.ValidateCertificateEventHandler(this.OnValidateCertificateError); ServicePointManager.CertificatePolicy = certValidate; }

Función OnValidateCertificateError:

private void OnValidateCertificateError(object sender, CertificateValidationEventArgs e) { string msg = string.Format(Strings.OnValidateCertificateError, e.Request.RequestUri, e.Certificate.GetName(), e.Problem, new Win32Exception(e.Problem).Message); LogWriter.LogError(msg); //Message.ShowError(msg); }

Deshabilité el código de CertificateValidation y ServerCertificateValidationCallback funcionando muy bien