2016-10-13 3 views
0

В этом проблема.C# proxy ssl/tls passthrough без сертификата

У меня есть запрос https. Запрос отправляется как запрос SSL/TLS (не CONNECT ...., который поступает из браузера с настройкой прокси-сервера).

Мне нужно написать прокси-сервер в C#, который блокирует определенный запрос https://foo.com/foo.htm, но позволяет через https://foo.com/anything_else.htm.

я могу сделать это штраф создание атаки MITM с новым сертификатом и т.д. и т.п.

Но Im теперь интересно, если есть простой способ сделать это Im недостающее без использования атаки MITM, как у меня нет необходимости в расшифровать данные. Мне нужно знать только URI/файл.

Я могу просто просто передавать потоки, но я хочу знать, есть ли простой способ передать потоки после того, как я прочитал URI и файл.

Я могу написать какой-нибудь причудливый код, чтобы разделить запрос tcp, и это то, что мне может понадобиться.

У кого-нибудь есть идеи, прежде чем я пойду по этому пути. Помните, что запрос CONNECT отсутствует. Просто установите SSL/TLS.

Основная причина этого заключается в том, что только делает вещи проще не создавать собственные сертификаты и т.д.

Может быть, его даже можно использовать реальный сертификат как-то с конца сервера, как мне не нужно, чтобы расшифровать любой из NO данные заголовка.

Я нахожу, что сетевая сторона C# не очень хорошо документирована и немного повсюду.

Просто для справки я могу получить URI из TcpClient с помощью:

IPEndPoint ipEndPoint = (IPEndPoint)clientTcpClient.Client.RemoteEndPoint; 

IPAddress ipAddress = ipEndPoint.Address; 

// Get the hostname. 
IPHostEntry ipHostEntry = Dns.GetHostEntry(ipAddress); 
String hostName = ipHostEntry.HostName; 

// Get the port. 
Int32 port = ipEndPoint.Port; 

Но не запрашиваемая страница.

ответ

0

Хотя целевое имя хоста может отображаться в сообщении TLS в качестве расширения SNI или путем анализа сертификата, возвращаемого сервером , компонент пути URL-адреса содержится только в HTTP-запросе. Поскольку этот HTTP-запрос выполняется только после установления связи TLS, и поэтому запрос уже зашифрован , вы не можете добраться до полного пути без дешифрования запроса. Это означает, что блокировка доступа к определенному пути невозможна без посредника SSL в середине и, следовательно, для этого требуется сертификат для целевого сайта, принадлежащего человеку посередине и которому доверяет клиент.

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