2015-09-22 1 views
8

In einer azure virtuellen Maschine habe ich eine Webanwendung und eine Sub-Webanwendung mit FormsAuthentication und HTTPS mit einem gültigen Zertifikat konfiguriert. Die Authentifizierung erfolgt zwischen der Hauptanwendung und der Unteranwendung mit demselben Maschinenschlüssel. SSL ist für die beiden Anwendungen erforderlichRemotezertifikat wurde vom Benutzer als ungültig verifiziert

Alles ist OK von außen mit der öffentlichen URL.

Ich muss einige Anfragen von der Hauptanwendung an die Unteranwendung mit dem öffentlichen Namen für Konfigurationszwecke senden (die Unteranwendung könnte auf einem anderen Server installiert werden). Diese Anfragen verwenden ein bestimmtes Konto zur Identifizierung.

Dies ist mein Code Anfrage von Hauptanwendung Unter Anwendung zu senden, ist this.WebApiUrl die Öffentlichkeit url:

// If we are not authenticated 
if(!isAuthenticated) 
{ 
    // Check user and login 
    if(!User.Check(this.WebApiLogin, this.WebApiPassword)) 
     throw new Exception("Unauthorized user"); 

    isAuthenticated = true; 
} 
// Convert HttpCookie to Cookies 
var cookies = FormsAuthentication.GetAuthCookie(this.WebApiLogin, false).ToCookies(); 
// Create request with the authentication cookie 
Uri baseAddress = new Uri(this.WebApiUrl); 
CookieContainer cookieContainer = new CookieContainer(); 
foreach(var cookie in cookies) 
{ 
    if(String.IsNullOrEmpty(cookie.Domain)) 
     cookie.Domain = baseAddress.Host; 
    if(baseAddress.Scheme == "https") 
     cookie.HttpOnly = false; 

    cookieContainer.Add(cookie); 
} 

// send request 
using(HttpClientHandler handler = new HttpClientHandler() { CookieContainer = cookieContainer }) 
{ 
    using(HttpClient client = new HttpClient(handler)) 
    { 
     client.BaseAddress = baseAddress; 
     client.DefaultRequestHeaders.Accept.Clear(); 
     client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     return client.GetStringAsync(requestUri).Result; 
    } 
} 

Alle es ist Ok ohne ssl. Wenn ich aktiv ssl, die Anforderung zwischen der Hauptanwendung und der Sub-Domain-Anwendung mit

The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel..

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

System.Net Information: 0 : [10788] SecureChannel#92992 - Remote certificate was verified as invalid by the user.

System.Net.Sockets Verbose: 0 : [10788] Socket#29502801::Dispose()

System.Net Error: 0 : [10788] Exception in HttpWebRequest#61435094:: - The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel..

System.Net Verbose: 0 : [10788] HttpWebRequest#61435094::EndGetResponse()

System.Net Error: 0 : [10788] Exception in HttpWebRequest#61435094::EndGetResponse - The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel..

Was seltsam ist es das Protokoll ist nicht sagen, warum das Zertifikat verifiziert wurde, wie vom Benutzer ungültig. Dieses Zertifikat gilt für die Anfrage von außen.

Wichtig: Ich habe keine Lösung mit ServicePointManager.ServerCertificateValidationCallback wollen, weil es in einer Produktionsumgebung ist

Dank für Sie

Antwort

2

helfen Sie ein ServerCertificateValidationCallback Bereitstellung anderswo in Ihrem Code?

Wir hatten einen logischen Fehler in einem von uns implementierten Callback, bei dem bestimmte Domains mit selbstsignierten Zertifikaten auf die Whitelist gesetzt wurden. Der Callback wurde nämlich immer ausgeführt - sogar für gültige Zertifikate -, aber nur, wobei die Whitelisting-Logik angewendet wurde. Da legitime Zertifikate nicht in dieser Liste enthalten waren, gab der Rückruf einen Fehler an.

wurde gelöst durch Zurückkehren früh auf der Grundlage der error Variable:

if (error == SslPolicyErrors.None) return true;

+0

Ja, wir haben eine andere Web-Anwendung auf demselben Server mit diesem Rückruf und vorzeitige Rückkehr 'if (Fehler == SslPolicyErrors.None) zurück wahr; '. Ich habe auch ohne Rückruf versucht und ich habe immer den Fehler bei Anfragen zwischen meiner App und meiner Sub-App. – Troopers

+0

Bedeutet der Wert von "Fehler" im Rückruf etwas nützlicher? Ich nehme an, Sie haben Ihre Stammzertifikate wie folgt durchsucht: http://blogs.msdn.com/b/jpsanders/archive/2009/09/16/troubleshooting-asp-net-the-remote-certificate-is-invalid -according-to-the-validation-procedure.aspx – nullPainter

+0

Ja, ich habe das Zertifikat, den Zertifikatspfad, die Zertifizierungsstelle überprüft ... alles ist in Ordnung. Und ich denke nicht, dass das Problem das Zertifikat ist, weil die Anfragen von draußen Ok sind. Es sind nur die Anforderungen zwischen der Hauptanwendung und der Unteranwendung, die fehlschlagen – Troopers