Как получить запрошенный целевой хост из SslStream в качестве сервера

С этим кодом, например:


        private static void OnConnect(IAsyncResult ar)
        {
            var clientConnection = listener.EndAcceptTcpClient(ar);
            listener.BeginAcceptTcpClient(OnConnect, ar.AsyncState);

            try
            {
                // SSL the client
                var clientStream = clientConnection.GetStream();
                var clientSecureStream = new SslStream(clientStream, false);
                clientSecureStream.AuthenticateAsServer(certificate);
                ...
                ...

Я могу успешно установить входящее соединение SSL. Клиент, который подключается к этому серверу, указывает целевой хост при аутентификации в качестве клиента: https://docs.microsoft.com/en-us/dotnet/api/system.net.security.sslstream.authenticateasclient?view=netframework-4.7.2#System_Net_Security_SslStream_AuthenticateAsClient_System_String_

Как мне получить значение этого целевого хоста в моем коде выше?

Я просмотрел параметр RemoteCertificateValidationCallback для конструктора SslStream, но Интернет говорит мне, что этот обратный вызов предназначен только для клиентской стороны, а не для серверной (я пробовал, и аргумент targetHost всегда пустая строка).

Я искал здесь и в Интернете, и у меня возникли проблемы с поиском решения...

Должен ли SslServer отправлять разные данные в зависимости от целевого хоста? SslStream просто не поддерживает этот сценарий? Я полностью упустил какую-то концепцию?


person Simoyd    schedule 26.01.2019    source источник
comment
Нет разницы сервер или клиент. Сервер может быть слушателем. Термин сервер имеет разное значение на разных сетевых уровнях. Существует 7 различных сетевых слоев. Серверная машина — это высокоскоростной компьютер с большим объемом памяти, к которому подключается множество клиентов. На уровне соединения у вас есть два конца соединения 1) Сервер (слушатель), который запускается первым 2) Клиент, который подключается к серверу. На уровне подключения база данных всегда является сервером/слушателем. Любое приложение, которое подключается к базе данных, является клиентом.   -  person jdweng    schedule 27.01.2019
comment
Я имею в виду, что это потенциально интересно, но я не понимаю, насколько это актуально... Что я сделал, чтобы обойти эту проблему, так это создать промежуточный поток, в котором я могу читать незашифрованные данные, и данные также все еще отправляются в SslStream . Благодаря этому я могу искать .com и вытаскивать целевой хост. Должен быть лучший способ сделать это...   -  person Simoyd    schedule 27.01.2019
comment
SSL/TLS не включает запрошенное целевое имя во время рукопожатия (сервер не имеет доступа к тому, что запрашивает клиент, он просто отправляет обратно сертификат). Но SSL/TLS также определяет расширения для рукопожатия, и вам нужен SNI (указание имени сервера en.wikipedia.org/wiki/Server_Name_Indication). Я считаю, что SslStream не поддерживает этот visualstudio.uservoice.com/forums/121579-visual-studio-2015/ для серверной части. См. также github.com/dotnet/corefx/issues/9608.   -  person Simon Mourier    schedule 09.02.2019
comment
Есть идея здесь заглянуть в поток, чтобы прочитать имя хоста, но это звучит сложно.   -  person Gabriel Luci    schedule 14.02.2019
comment
Вы пытаетесь предоставлять веб-сервисы (https) через это соединение?   -  person Strom    schedule 15.02.2019