W jaśniejszej maszynie wirtualnej mam aplikację internetową i podsieciową aplikację z FormsAuthentication i HTTPS skonfigurowanymi z ważnym certyfikatem. Uwierzytelnianie jest dzielone pomiędzy główną aplikacją i podrzędną aplikacją za pomocą tego samego klucza maszyny. SSL jest wymagany w obu aplikacjach.Zdalny certyfikat został zweryfikowany jako nieprawidłowy przez użytkownika.
Wszystko w porządku z zewnątrz z publicznym adresem URL.
Potrzebuję wysłać niektóre żądania z głównej aplikacji do podrzędnej aplikacji z publiczną nazwą dla celów konfiguracji (podrzędna aplikacja może zostać zainstalowana na innym serwerze). Te żądania używają specjalnego konta do identyfikacji.
To jest mój kod, aby wysłać żądanie od głównej aplikacji do sub aplikacji this.WebApiUrl jest url publiczny:
// 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;
}
}
Wszystko jest OK bez SSL. Kiedy aktywny ssl, żądanie pomiędzy głównym aplikacji i aplikacji subdomeny niepowodzeniem z
The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel..
Oto Logi systemowe z System.Net i System.Net gniazdach.
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..
Co jest dziwne, to jest dziennik nie mówi dlaczego certyfikat został zweryfikowany jako nieważne przez użytkownika. mimo to ten certyfikat jest ważny na żądanie z zewnątrz.
Ważne: Nie chcę rozwiązanie z ServicePointManager.ServerCertificateValidationCallback bo to w środowisku produkcyjnym
Dzięki za pomóc
Tak, mamy inną aplikację internetową na tym samym serwerze z tej funkcji zwrotnej i wcześniejszego powrotu 'if (error == SslPolicyErrors.None) return true; '. Próbowałem również bez wywołania zwrotnego i zawsze mam błąd dla żądań między moją aplikacją a moją aplikacją sub. – Troopers
Czy wartość "błędu" w wywołaniu zwrotnym wskazuje coś bardziej użytecznego? Zakładam, że przebrnąłeś przez swoje certyfikaty główne zgodnie z: http://blogs.msdn.com/b/jpsanders/archive/2009/09/16/troubleshooting-asp-net-the-remote-certificate-is-invalid -zgodnie z procedurą sprawdzania poprawności.aspx – nullPainter
Tak, sprawdziłem certyfikat, ścieżkę certyfikatu, urząd certyfikacji .. wszystko w porządku. I nie sądzę, że problemem jest certyfikat, ponieważ żądania z zewnątrz są w porządku. Zgłaszają się tylko żądania między aplikacją główną a podrzędną aplikacją – Troopers