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 la docena de lugares donde se está ejecutando.
Una nueva instalación en un nuevo sitio se encuentra con 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 esto ha estado funcionando durante mucho tiempo (y continúa haciéndolo) desde muchas otras ubicaciones.
Donde miro ¿Podría ser un problema de seguridad entre Windows y .NET que sea exclusivo de esta instalación? Si es así, ¿dónde configuro relaciones de confianza? ¡Estoy perdido!
Respuestas:
Pensamientos (basados en el dolor en el pasado):
servidortiene el reloj configurado correctamente (es decir, para que la hora UTC sea correcta [ignore la hora local, es en gran medida irrelevante]) - esto ciertamente es importante para WCF, por lo que puede afectar el SOAP regular?fuente
Los siguientes fragmentos solucionarán el caso de que haya algo mal con el certificado SSL en el servidor al que está llamando. Por ejemplo, puede estar autofirmado o el nombre de host entre el certificado y el servidor puede no coincidir.
Esto es peligroso si está llamando a un servidor fuera de su control directo, ya que ya no puede estar tan seguro de estar hablando con el servidor al que cree que está conectado. Sin embargo, si está tratando con servidores internos y obtener un certificado "correcto" no es práctico, use lo siguiente para indicarle al servicio web que ignore los problemas del certificado y continúe valientemente.
Los dos primeros usan expresiones lambda, el tercero usa código regular. El primero acepta cualquier certificado. Los dos últimos al menos verifican que el nombre de host en el certificado sea el que espera.
... espero que te sea útil
fuente
ServicePointManager.ServerCertificateValidationCallback = null;
debería volver al comportamiento predeterminado.La solución muy simple de "capturar todo" es esta:
La solución de sebastian-castaldi es un poco más detallada.
fuente
#If CONFIG = "Debug"
declaración para que solo se active cuando está en modo de depuración. ¡Funciona muy bien!Personalmente, me gusta más la siguiente solución:
... luego, antes de solicitar el error, haga lo siguiente
Encontré esto después de consultar la solución de Luke
fuente
Si está utilizando Windows 2003, puede intentar esto:
Referencia: http://www.outsystems.com/NetworkForums/ViewTopic.aspx?Topic=Web-Services:-Could-not-establish-trust-relationship-for-the-SSL/TLS- ...
fuente
Si no desea confiar ciegamente en todos y hacer una excepción de confianza solo para ciertos hosts, la siguiente solución es más adecuada.
Luego simplemente llame a Ssl.EnableTrustedHosts cuando se inicie su aplicación.
fuente
Luke escribió un artículo bastante bueno sobre esto ... bastante sencillo ... pruébalo
La solución de Luke
Motivo (cita de su artículo (menos 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 pagarle a Verisign o uno de los otros ** - * s por un certificado en mi caja de prueba, así que lo firmé. Cuando envié la solicitud, recibí una hermosa excepción:
System.Net.WebException La conexión subyacente se cerró. 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 estaba causando que fallara la POST. Así que seguí buscando, ajustando y haciendo todo tipo de cosas raras. Solo después de buscar en Google lo *** n descubrí que el comportamiento predeterminado después de encontrar un certificado SSL no válido es lanzar esta misma excepción. .. "
fuente
Herramienta de diagnóstico SSL de Microsoft puede ayudar a identificar el problema.
ACTUALIZAR el enlace se ha solucionado ahora.
fuente
Acabo de encontrar este problema. Mi resolución fue actualizar la hora del sistema sincronizándola manualmente con los servidores de hora. Para hacer esto puedes:
Adjust Date/Time
Internet Time
pestañaChange Settings
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 horario diferente del desplegable del servidor.
fuente
Prueba esto:
Tenga en cuenta que debe trabajar al menos con 4.5 .NET framework
fuente
Tuve un problema similar en la
.NET
aplicación en Internet Explorer.Resolví el problema agregando el certificado (certificado VeriSign Clase 3 en mi caso) a certificados de editores de confianza.
Puede obtener el certificado si lo exporta desde:
Gracias
fuente
Tuve este error ejecutándose contra un servidor web con URL como:
pero no había certificado para ello, así que recibí un DNS llamado
Solo estoy dando una pista a esta solución aquí, ya que esto apareció en Google.
fuente
Para aquellos que tienen este problema a través del lado del cliente VS, una vez que agregaron con éxito 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 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 de servicio siguiendo estos pasos:
Inténtalo de nuevo :). Gracias
fuente
En mi caso, estaba tratando de probar SSL en mi entorno de Visual Studio usando IIS 7.
Esto es lo que terminé haciendo para que funcione:
En 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 de IIS Express".
En mi sitio, en la sección 'Configuración avanzada ...' a la derecha, tuve que cambiar los 'Protocolos habilitados' de "http" a "https".
Debajo del icono 'Configuración de 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 usando mmc.exe.
Mi
web.config
archivo ya estaba configurado correctamente, así que después de resolver todo lo anterior, pude continuar con mis pruebas.fuente
Mi solución (VB.Net, la versión "provisional" (UAT) de esta aplicación debe funcionar con el certificado "provisional" pero no afectar las solicitudes una vez que están en el sitio activo):
fuente
Si no funciona mal sertificate, cuando ServerCertificateValidationCallback devuelve verdadero; Mi código de ServerCertificateValidationCallback:
Mi código que impidió ejecutar ServerCertificateValidationCallback:
Función OnValidateCertificateError:
Deshabilité el código CertificateValidation y ServerCertificateValidationCallback funcionando muy bien
fuente