Прозрачный прокси дает ошибку SSL при доступе через https - PullRequest
1 голос
/ 22 декабря 2011

В моей корпоративной среде есть прозрачный прокси, который требует учетные данные для доступа в интернет (каждые четыре часа).В моем приложении я успешно передал учетные данные, такие как:

var client = new WebClient();
client.Credientals = new NetworkCredential("username", "password");
string result = client.DownloadString("http://...");
// this works!

Однако, когда мой первоначальный запрос к URL-адресу "https://", возникает исключительная ситуация:" Базовое соединение было закрыто: не удалось установитьдоверительные отношения для безопасного канала SSL / TLS. "

Теперь моя текущая работа заключается в следующем:

  • перехватить исключение WebException, возникающее при обращении к" https://" url
  • добавить мои учетные данные в новый запрос к произвольному "http://" сайту
    • (это должно" открыть "интернет на четыре часа)
  • вернитесь и повторите попытку "https://" request

Мне интересно, есть ли лучший / более чистый способ сделать это?

1 Ответ

7 голосов
/ 23 декабря 2011

Сейчас вы используете HTTP-прокси с аутентификацией.Все идет нормально.Но он не будет работать для запросов HTTPS, и вот почему:

SSL / TLS - это безопасность конечных точек.Это означает, что данные должны передаваться между клиентом и сервером по одному зашифрованному каналу.

Когда вы подключаетесь к HTTP-прокси, вы говорите ему: «ПОЛУЧИТЕ удаленный ресурс и отправьте его мне», что противоречит безопасности конечной точки.Здесь у вас нет прямого подключения к удаленному серверу, и вы не можете проверить его учетные данные.Также прокси-сервер может заглядывать в ваши данные.

В общем, к обычному HTTP-прокси можно подключиться с использованием HTTPS, ИЛИ можно попросить HTTP-прокси получить доступ к HTTPS-ресурсу, но это устраняет причину безопасности в обоих случаях.клиент не может проверить учетные данные сервера, а HTTP-прокси может регистрировать или изменять передаваемые данные.

Прокси HTTPS работает по-другому.Здесь вы говорите прокси-серверу HTTPS «ПОДКЛЮЧИТЕ к удаленному адресу, а затем отправляете только то, что передано».Таким образом, прокси-сервер создает непрозрачный безопасный канал между клиентом и сервером, тем самым сохраняя безопасность конечной точки.На самом деле, HTTPS-прокси может использоваться для туннелирования любого трафика, не обязательно SSL.

Следовательно, вам нужно установить туннель, отправив запрос CONNECT (с включенной аутентификацией), а затем отправить обычный HTTP GET (без хоста /адрес в URL) по тому же каналу - этот запрос будет направлен на целевой сервер, а не на прокси.

У меня есть серьезные сомнения в том, что ваш WebClient может быть создан для установки туннеля перед отправкой запроса.В качестве опции вы можете использовать пакет HTTPBlackbox нашего продукта SecureBlackbox, который позволяет получать доступ к ресурсам HTTP и HTTPS и поддерживает прокси-серверы HTTPS (называемые WebTunneling в SecureBlackbox) с аутентификацией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...