首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自C#的服务器名称指示

来自C#的服务器名称指示
EN

Stack Overflow用户
提问于 2013-11-14 14:40:17
回答 2查看 6K关注 0票数 7

据我所知,.NET似乎有一个很大的限制,因为没有办法使用C#和.NET来建立一个使用服务器名称指示的连接。是我错过了什么,还是我的理解是正确的?

有没有人知道我是否以及如何使用OpenSSL.NET、libcurl.NET或其他第三方.NET库建立SNI连接?一些示例代码将非常感谢。

EN

回答 2

Stack Overflow用户

发布于 2018-06-28 16:05:27

在我的.Net 4.5项目中,使用SNI的服务器会出现以下问题:

代码语言:javascript
复制
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,则可以正常工作:

代码语言:javascript
复制
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

同样的道理也适用于webrequest:

代码语言:javascript
复制
WebRequest request = WebRequest.Create("https://www.somesite.com");

和HttpRequestMessage:

代码语言:javascript
复制
var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "https://www.google.com");

它们都需要将协议显式设置为TLS1.2才能与SNI服务器一起工作(这可能在较新的.Net版本中发生了变化)

票数 5
EN

Stack Overflow用户

发布于 2016-09-26 23:21:00

这是一个相当古老的帖子,但这个答案可能会对一些人有所帮助,至少它花了我几天的时间。

默认情况下,.NET框架支持服务器名称指示。(在4.5.1上进行了测试,但我猜至少对.NET 4.5+是一样的)

下面是一个简短的示例:

代码语言:javascript
复制
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标记。例如,如果您传递一个请求,并将所有原始标头重新映射到新创建的请求,则可能会出现这种情况。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19971236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档