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