190 votos

No puede establecer relaciones de confianza para SSL/TLS garantizar canal--jabón

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

Una nueva instalación en un sitio nuevo que se está ejecutando en un problema. Cuando se intenta invocar el servicio web, se produce un error con el mensaje que dice : "no se Pudo establecer una relación de confianza para el canal seguro SSL/TLS". La dirección URL del servicio web que utiliza el protocolo SSL (https://), pero esto ha estado trabajando durante mucho tiempo (y sigue haciéndolo) a partir de muchos otros lugares.

¿Por dónde empiezo? Este podría ser un problema de seguridad entre Windows y .NET que es exclusivo para esta instalación? Si es así, ¿dónde puedo establecer relaciones de confianza? Estoy perdido!

238voto

Sebastian Castaldi Puntos 2138

Los siguientes fragmentos de código va a solucionar el caso en el que hay algo mal con el certificado SSL en el servidor al que está llamando. Por ejemplo, puede ser auto-firmado o el nombre de host entre el certificado y el servidor pueden no coincidir.

Esto es peligroso si se llama a un servidor fuera de su control directo, ya que puede no ser tan seguro de que usted está hablando con el servidor piensa que está conectado. Sin embargo, si se trata de servidores internos y conseguir una "correcta" certificado no es práctico, use lo siguiente para decirle a la web de servicio a ignorar los problemas de certificados y con valentía soldado.

Los dos primeros utilizan las expresiones lambda, el tercer usa código. El primero acepta ningún tipo de certificado. Los dos últimos, al menos, comprobar que el nombre de host del certificado es el que uno espera.
... espero que les 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;
}

98voto

Marc Gravell Puntos 482669

Pensamientos (basado en el dolor en el pasado):

  • ¿tienes DNS y la línea-de-vista para el servidor?
  • usted está utilizando el nombre correcto del certificado?
  • es el certificado que sigue vigente?
  • es un mal configurado, equilibrador de carga de estropear las cosas?
  • ¿el nuevo servidor de la máquina tiene el reloj configurado correctamente (es decir. así que la hora UTC es correcto [ignorar la hora local, es en gran parte irrelevent]) - este sin duda los asuntos de WCF, puede afectar a regular el JABÓN?
  • hay una cadena de confianza de certificados problema? si usted navega desde el servidor al servicio de jabón, se puede obtener SSL?
  • es el servidor de la máquina a nivel de proxy configurado correctamente? (que diferente a la del usuario proxy); ver proxycfg para XP / 2003 (no estoy seguro acerca de la Vista, etc)

86voto

Remy Puntos 5039

La solución muy simple "tomar todo" es la siguiente:

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

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

20voto

cusman Puntos 391

Más personalmente me gusta la siguiente solución:

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

... entonces antes de que usted solicita recibiendo el error, haga lo siguiente

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

Esto encontró después solución Luke de consultoría

15voto

diogoap82 Puntos 159

Si está utilizando Windows 2003, usted puede intentar esto:

Abrir La Consola De Administración De Microsoft (Inicio --> Ejecutar --> mmc.exe);

Elija Archivo - > Agregar o Quitar Complemento;

En la ficha Independiente, seleccione Añadir;de

Elegir el complemento Certificados, y haga clic en Agregar;

En el asistente, elija el Equipo De la cuenta y, a continuación, elija Locales Equipo. Pulse Finalizar para terminar la asistente;

Cerrar el Agregar o Quitar Complemento de diálogo;

Vaya a Certificados (Local Equipo) y elija una tienda a de importación:

Si usted tiene el certificado de entidad emisora Raíz para la empresa que emitió la certificado, seleccione Raíz de Confianza Las Autoridades De Certificación;

Si tienes el certificado de la propio servidor, elija Otras Personas

Haga clic en la tienda y elegir Todos Tareas - > Importar

Siga los pasos del asistente y proporcionar la certificado de archivo;

Después de eso, simplemente reinicie IIS y tratar llamar al servicio web de nuevo.

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

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: