2010-01-07 9 views
8

Ich mache eine httpwebrequest mit einer öffentlichen Root-Autorität Certificat-Datei X509. Ich habe nur den öffentlichen Schlüssel, nicht den privaten Schlüssel. Alles funktioniert gut aus einer Konsolen-App, aber es funktioniert nicht von einer asp.net-App. Ich erhalte den Fehler: "Die zugrunde liegende Verbindung wurde geschlossen: Konnte keine Vertrauensbeziehung für den sicheren SSL/TLS-Kanal herstellen."ASP.NET und die zugrunde liegende Verbindung wurde geschlossen: Konnte keine Vertrauensstellung für den sicheren SSL/TLS-Kanal herstellen

Die Option zum Deaktivieren der Validierung ist keine Option.

Hier ist der Code

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(); 

Hier ist die Systemprotokolle von System.Net und System.Net Sockets.

System.Net Informationen: 0: [5928] SecureChannel # 8106798 - Eine Zertifikatskette konnte nicht für eine vertrauenswürdige Stammzertifizierungsstelle erstellt werden.

System.Net Informationen: 0: [5928] SecureChannel # 8106798 - Das Remotezertifikat wurde vom Benutzer als ungültig bestätigt.

System.Net.Sockets Ausführlich: 0: [5928] Sockel # 7486778 :: Dispose()

System.Net Fehler: 0: [5928] Ausnahme in der HttpWebRequest # 51319244 :: - Die zugrunde liegende Verbindung wurde geschlossen: Die Vertrauensbeziehung für den sicheren SSL/TLS-Kanal konnte nicht hergestellt werden.

System.Net Fehler: 0: [5928] Ausnahme in der HttpWebRequest # 51319244 :: EndGetRequestStream - Die zugrunde liegende Verbindung wurde geschlossen: Konnte Vertrauensstellung für den sicheren SSL/TLS-Kanal nicht herstellen.

Weitere Informationen

Wenn ich diesen Code (von MS-Office)

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; 
    } 

ich schließlich den Fehler:

Remote Certificate Chain Error

Antwort

1

Es klingt wie die Frage, was sein könnte, ist geschrieben auf diesem link. Der ASPNET-Workerprozess erfordert, dass der Zertifikatsname mit dem Servernamen übereinstimmt. Es gibt Workarounds, die mit Testumgebungen implementiert werden können.

zur Erstellung von Zertifikaten können Sie ein kostenloses Programm namens SelfSSL.exe mit Befehlen wie:

SelfSSL.exe /T /N:CN=localhost /V:999 /Q (wobei "localhost" ist cert Name)

Und:

winHTTPCertCfg.exe -g -c local_machine\my -s localhost -a Administrators (Erteilungs Administratoren Zugriff auf die cert)

+0

Die root.cer zum Localmachine Shop hinzugefügt wurde in den MMC-Snap verwenden. Ich habe auch versucht, winhttpcertcfg.exe vergeblich zu verwenden. Da ich keinen privaten Schlüssel habe, habe ich auch keine PFX-Datei. Gedanken? –

+0

Die Testumgebung verwendet kein SSL, also ist das in Ordnung. Ich habe geplant, die Root-Zertifizierung von der CA zu verwenden, aber das könnte ein Teil des Problems sein. Ich vermute dann, dass das SSL-Setup auf Server Ende ist ein bisschen zweifelhaft. –