С# прокси-сервер ssl/tls без сертификата

В этом проблема.

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

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

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

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

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

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

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

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

Возможно, даже возможно каким-то образом использовать настоящий сертификат со стороны сервера, поскольку мне не нужно расшифровывать какие-либо данные без заголовка.

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

Просто для справки я могу получить 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;

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


person William Humphreys    schedule 13.10.2016    source источник


Ответы (1)


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

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

person Steffen Ullrich    schedule 14.10.2016