2015-09-22 12 views
8

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

Odpowiedz

2

Czy zapewniając ServerCertificateValidationCallback nigdzie indziej w kodzie?

Mamy wadę logiczną w wywołanym przez nas wywołania zwrotnym, które było białą domeną określonych domen z samopodpisanymi certyfikatami. Mianowicie, wywołanie zwrotne było zawsze wykonywane - nawet dla ważnych certyfikatów - ale tylko tylko stosując logikę białą. Ponieważ uzasadnione certyfikaty nie znajdowały się na tej liście, wywołanie zwrotne wskazywało na niepowodzenie.

ten został rozwiązany przez powrót wcześnie na podstawie error zmiennej:

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

+0

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

+0

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

+0

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

Powiązane problemy