2010-01-07 44 views
8

Estoy haciendo una httpwebrequest utilizando un archivo de certificación de autoridad raíz pública X509. Solo tengo la clave pública, no la privada. Todo funciona bien desde una aplicación de consola pero no funciona desde una aplicación asp.net. Me aparece el error: "La conexión subyacente se cerró: no se pudo establecer una relación de confianza para el canal seguro SSL/TLS".ASP.NET y La conexión subyacente se cerró: No se pudo establecer una relación de confianza para el canal seguro SSL/TLS

La opción para desactivar Validación no es una opción.

Este es el código

HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://xxxxxxx/gateway.aspx"); 
string post = "abcdef"; 
req.ContentType = "application/x-www-form-urlencoded"; 
req.Method = "POST"; 
req.ContentLength = post.Length; 

var cert = System.Security.Cryptography.X509Certificates.X509Certificate.CreateFromCertFile(@"c:\temp\root.cer"); 

req.ClientCertificates.Add(cert); 
StreamWriter stOut = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII); 
stOut.Write(post.ToString()); 
stOut.Close(); 

HttpWebResponse resp = (HttpWebResponse)req.GetResponse(); 

Aquí está el Sistema de Registros de System.Net y System.Net sockets.

System.Net Información: 0: [5928] SecureChannel # 8106798 - No se pudo crear una cadena de certificados en una autoridad raíz de confianza.

System.Net Información: 0: [5928] SecureChannel # 8106798 - El certificado remoto fue verificado como no válido por el usuario.

System.Net.Sockets detallado: 0: [5928] Socket # 7486778 :: Dispose()

System.Net Error: 0: [5928] Excepción en el HttpWebRequest # 51319244 :: - la conexión subyacente se cerró: no se pudo establecer una relación de confianza para el canal seguro SSL/TLS.

Error de System.Net: 0: [5928] Excepción en HttpWebRequest # 51319244 :: EndGetRequestStream - La conexión subyacente se cerró: No se pudo establecer una relación de confianza para el canal seguro SSL/TLS.

Más información

Si utilizo este código (de CodeGuru)

public static bool ValidateServerCertificate(object sender, 
    X509Certificate certificate, X509Chain chain, 
    SslPolicyErrors sslPolicyErrors) 
    { 
    if (sslPolicyErrors == 
     SslPolicyErrors.RemoteCertificateChainErrors) { 
     return false; 
    } else if (sslPolicyErrors == 
     SslPolicyErrors.RemoteCertificateNameMismatch) { 
     System.Security.Policy.Zone z = 
      System.Security.Policy.Zone.CreateFromUrl 
      (((HttpWebRequest)sender).RequestUri.ToString()); 
     if (z.SecurityZone == 
      System.Security.SecurityZone.Intranet || 
      z.SecurityZone == 
      System.Security.SecurityZone.MyComputer) { 
      return true; 
     } 
     return false; 
    } 
    return true; 
    } 

en última instancia, me sale el error:

Remote Certificate Chain Error

Respuesta

1

Parece que el tema podría ser lo que se publicado en este link. El proceso de trabajo de ASPNET requiere que el nombre del certificado coincida con el nombre del servidor. Hay soluciones alternativas que se pueden implementar con entornos de prueba.

Para la generación del certificado puede utilizar un programa gratuito llamado SelfSSL.exe con comandos como:

SelfSSL.exe /T /N:CN=localhost /V:999 /Q (donde "localhost" es el nombre cert)

Y:

winHTTPCertCfg.exe -g -c local_machine\my -s localhost -a Administrators (a conceder administradores de acceso a la cert)

+0

El root.cer se ha añadido a la tienda LocalMachine mediante el complemento MMC en. También intenté usar winhttpcertcfg.exe en vano. Como no tengo una clave privada, tampoco tengo un archivo PFX. ¿Pensamientos? –

+0

El entorno de prueba no usa SSL, así que está bien. Estaba planeando utilizar la certificación Root de la CA, pero eso puede ser parte del problema. Supongo que la configuración de SSL en el extremo del servidor es un poco dudosa. –

Cuestiones relacionadas