Възможно ли е да се определи дали се използва HTTPS прокси само като се погледне сертификатът?

Тъй като HTTPS прокситата ще заменят SSL сертификата със свой собствен, какви са моите възможности да определя дали дадена HTTPS връзка има прокси по средата?

Ще използвам тази информация, за да определя моята политика за кандидатстване, тъй като има случаи, в които искам 100% криптиран тунел от край до край без декриптиране от трета страна.

Още по-добре, ако можете да ми кажете как да определя това чрез C# в .NET приложение или Silverlight.

Като начало, тук е примерен метод за валидиране на сертификат с помощта на . NET, но все още не съм сигурен как да използвам това, за да определя коя част от сертификата да валидирам. В допълнение, мисля, че ServicePointManger е по-скоро "глобален" клас за връзка. Използването на това може да е твърде общо, когато тествам една HTTP връзка и не съм сигурен дали ServicePointManager е наличен в рамките на Silverlight.

http://msdn.microsoft.com/en-us/library/bb408523.aspx


person halfbit    schedule 19.08.2010    source източник
comment
Как вашето приложение прави защитена връзка? WCF? HttpWebRequest?   -  person Andy Wilson    schedule 19.08.2010
comment
Търся общо решение, което ще адресира всички базирани на .NET методи за комуникация. Да, използвам WCF и HTTPWebRequest   -  person halfbit    schedule 19.08.2010


Отговори (1)


Имате няколко възможности. Първата опция е да използвате класа ServicePointManager. Вие сте прави, че управлява всички сервизни точки, но можете да използвате параметъра "sender" в метода за обратно извикване, за да разграничите различните сервизни точки:

void SomeMethod()
{
    ServicePointManager.ServerCertificateValidationCallback += 
        ValidateServerCertificate;

    var url = "https://mail.google.com/mail/?shva=1#inbox";
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.GetResponse();
}

private static bool ValidateServerCertificate(object sender, 
        X509Certificate certificate, X509Chain chain, 
        SslPolicyErrors sslpolicyerrors)
{
    if(sender is HttpWebRequest)
    {
        var request = (HttpWebRequest) sender;
        if(request.RequestUri.ToString() == "https://mail.google.com/mail/?shva=1#inbox")
        {
            return (certificate.GetPublicKeyString() == "The public key string you expect");
        }
    }
    return true;
}

Тази опция ще работи за ръчно създадени HttpWebRequest и създадени от WCF заявки, тъй като „подателят“ ще бъде HttpWebRequest и за двете. Не съм сигурен дали "подателят" ще бъде нещо различно от HttpWebRequest.

Вторият вариант е да получите сертификата директно от сервизната точка:

void SomeMethod()
{
    ServicePointManager.ServerCertificateValidationCallback += 
        ValidateServerCertificate;

    var url = "https://mail.google.com/mail/?shva=1#inbox";
    var request = (HttpWebRequest)WebRequest.Create(url);
    request.GetResponse();

    var serverCert = request.ServicePoint.Certificate;
    // Validate the certificate.
}

Не можах да разбера дали е възможно ServicePoint да се използва от WCF прокси. Ако не е възможно, тази опция няма да работи за WCF. Освен това, най-голямата разлика е, че първата опция предотвратява връзката, ако валидирането на сертификата е неуспешно, докато вторият метод няма да потвърди, докато връзката не бъде осъществена.

Ако просто трябва да определите дали дадена заявка ще премине през прокси:

var httpRequest = (HttpWebRequest)WebRequest.Create("someurl");
var isUsingProxy = DoesRequstUseProxy(request);

bool DoesRequestUseProxy(HttpWebRequest request)
{
    if(request.Proxy == null)
    {
        return false;
    }

    return request.Proxy.GetProxy(request.RequestUri) != request.RequestUri;
}
person Andy Wilson    schedule 19.08.2010
comment
Благодаря ви, но все още трябва да разбера какво да правя със сертификата, когато го получа. Няма ли общ начин за откриване на прокси чрез сертификат? Трябва ли да кодирам твърдо очаквания низ от публичен ключ в моето приложение? Освен това не съм сигурен дали този подход работи в Silverlight... Съмнявам се дали мога да получа достъп до ServicePointManager в рамките на SLI Sandbox - person halfbit; 19.08.2010
comment
Подходът на DoesRequestUseProxy няма да работи, ако WCCP се използва на защитната стена. WCCP е прозрачен прокси, който не изисква клиентска конфигурация. BlueCoat е пример за продукт, който ще взаимодейства с всички данни, идващи от защитна стена и прозрачно прокси HTTPS трафик. Това е причината, поради която смятам, че единственият универсален метод е да се анализира самият сертификат. - person halfbit; 19.08.2010
comment
Актуализирах отговора си, за да покажа как да открия дали уеб заявка използва прокси. За съжаление току-що потвърдих, че никой от кода в отговора ми няма да работи в Silverlight. - person Andy Wilson; 19.08.2010
comment
Благодарим ви, че разгледахте подхода Silverlight :) - person halfbit; 19.08.2010