2015-09-22 16 views
8

In una macchina virtuale blu, ho un'applicazione Web e un'applicazione Web secondaria con FormsAuthentication e HTTPS configurati con un certificato valido. L'autenticazione è condivisa tra l'applicazione principale e l'applicazione secondaria con lo stesso codice macchina. SSL è richiesto per le due applicazioniIl certificato remoto è stato verificato non valido dall'utente

Tutto ok da parte esterna con l'URL pubblico.

Ho bisogno di inviare alcune richieste dall'applicazione principale all'applicazione secondaria con il nome pubblico per scopo di configurazione (l'applicazione secondaria potrebbe essere installata su un altro server). Queste richieste utilizzano un account specifico per l'identificazione.

Questo è il mio codice di inviare richiesta dall'applicazione principale dell'applicazione sub, this.WebApiUrl è l'URL pubblico:

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

Tutto è ok senza SSL. Quando i ssl attivo, la richiesta tra l'applicazione principale e l'applicazione sottodominio riuscire con

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

Ecco i System Logs da System.Net e 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..

Ciò che è strano è il registro non dice il motivo per cui il certificato è stato verificato come non valido da parte dell'utente. malgrado questo certificato è valido per la richiesta dall'esterno.

Importante: Non voglio una soluzione con ServicePointManager.ServerCertificateValidationCallback perché è in un ambiente di produzione

Grazie per l'aiuto

risposta

2

State fornendo un ServerCertificateValidationCallback altrove nel codice?

Abbiamo avuto un difetto logico in un callback implementato che autorizzava i domini specificati con certificati autofirmati. In particolare, la richiamata era sempre in esecuzione, anche per i certificati validi, ma solo che applica la logica di whitelisting. Poiché i certificati legittimi non erano presenti in questo elenco, la richiamata indicava un errore.

Questo è stato risolto con il ritorno in anticipo in base alla error variabile:

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

+0

Sì, abbiamo un'altra applicazione web sullo stesso server con questo callback e rientro anticipato 'se (errore == SslPolicyErrors.None) restituisce true; '. Ho anche provato senza la richiamata e ho sempre l'errore per le richieste tra la mia app e la mia subapp. – Troopers

+0

Il valore di 'error' nel callback indica qualcosa di più utile? Presumo che abbiate acquisito i certificati di root come da: http://blogs.msdn.com/b/jpsanders/archive/2009/09/16/troubleshooting-asp-net-the-remote-certificate-is-invalid -secondo la procedura di convalida.aspx – nullPainter

+0

Sì, ho controllato il certificato, il percorso del certificato, l'autorità di certificazione .. tutto è ok. E non credo che il problema sia il certificato perché le richieste dall'esterno sono Ok. Sono solo le richieste tra l'applicazione principale e l'applicazione secondaria che non riescono – Troopers

Problemi correlati