Это довольно старый пост, но, тем не менее, этот ответ может помочь некоторым людям, по крайней мере, это стоило мне нескольких дней.
.NET Framework по умолчанию поддерживает указание имени сервера. (Проверено на 4.5.1, но я думаю, что то же самое, по крайней мере, для .NET 4.5+)
Краткий пример:
HttpResponseMessage response;
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "https://www.google.com");
var handler = new HttpClientHandler
{
CookieContainer = new CookieContainer()
};
using (var client = new HttpClient(handler))
{
response = client.SendAsync(httpRequestMessage).Result;
}
Это очень стандартный способ создания запроса GET в C #. Вы увидите, что этот пример работает, в моем случае, с использованием TLS 1.2 с SNI. Если вы используете Wireshark для просмотра фактических отправленных пакетов, вы увидите сообщение Client Hello с указанием имени сервера, установленным на www.google.com.
Проблема, с которой мы столкнулись: тег SNI устанавливается .NET Framework (или Schannel Windows, не уверен) на основе URL-адреса, переданного в конструкторе HttpRequestMessage. Если вы знаете, что инициализировать запрос на основе некоторого URL (например, https://www.google.com) и более поздних версий при переключении заголовка RequestUri ИЛИ Host тег SNI по-прежнему будет создан на основе исходного URL-адреса. Это может иметь место, например, если вы проходите через запрос и переназначаете все исходные заголовки на вновь созданный запрос.
person
panick
schedule
26.09.2016
TElHTTPSClient
класс с SNI? На этой странице перечислены только члены класса, но нет дополнительных указаний. Также не установлен образец проекта, который показал бы, как использовать HTTPS. - person Clemens   schedule 20.10.2014TElSMTPClient
, а не оTElHTTPSClient
. - person Clemens   schedule 20.10.2014