据我所知,.NET似乎有一个很大的限制,因为没有办法使用C#和.NET来建立一个使用服务器名称指示的连接。是我错过了什么,还是我的理解是正确的?
有没有人知道我是否以及如何使用OpenSSL.NET、libcurl.NET或其他第三方.NET库建立SNI连接?一些示例代码将非常感谢。
发布于 2018-06-28 16:05:27
在我的.Net 4.5项目中,使用SNI的服务器会出现以下问题:
var url = "https://www.somesite.com";
System.Net.WebClient client = new System.Net.WebClient();
client.Encoding = Encoding.UTF8;
var data = client.DownloadString(url);但是,如果通过在TLS1.2前加上前缀来显式指定TLS1.2,则可以正常工作:
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;同样的道理也适用于webrequest:
WebRequest request = WebRequest.Create("https://www.somesite.com");和HttpRequestMessage:
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "https://www.google.com");它们都需要将协议显式设置为TLS1.2才能与SNI服务器一起工作(这可能在较新的.Net版本中发生了变化)
发布于 2016-09-26 23:21:00
这是一个相当古老的帖子,但这个答案可能会对一些人有所帮助,至少它花了我几天的时间。
默认情况下,.NET框架支持服务器名称指示。(在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;
}这是在C#中创建GET请求的一种非常标准的方式。您将看到,在我的示例中,使用带有SNI的TLS 1.2确实可以运行此示例。如果您使用Wireshark查看实际发送的包,您将看到一个Client Hello,其中的Server Name指示设置为www.google.com。
我们遇到了一个问题: SNI标签是由.NET框架(或者Windows的Schannel,不确定)基于传递给HttpRequestMessage的构造函数的URL设置的。如果您知道根据某个URL (例如https://www.google.com)初始化请求,然后切换RequestUri 或主机报头,则仍将基于原始URL url创建SNI标记。例如,如果您传递一个请求,并将所有原始标头重新映射到新创建的请求,则可能会出现这种情况。
https://stackoverflow.com/questions/19971236
复制相似问题