Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自C的服务器名称指示#_C#_.net_Ssl_Libcurl_Sni - Fatal编程技术网

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

C# 来自C的服务器名称指示#,c#,.net,ssl,libcurl,sni,C#,.net,Ssl,Libcurl,Sni,据我所知,.NET中似乎存在一个很大的限制,即无法使用C#和.NET建立使用服务器名称指示(SNI)的TLS连接。我是否遗漏了什么,或者我的理解是否正确 有人知道我是否可以以及如何使用OpenSSL.NET、libcurl.NET或其他第三方.NET库建立SNI连接吗?非常感谢您提供一些示例代码。这是一篇相当老的帖子,但这个答案可能会帮助一些人,至少花了我几天的时间 默认情况下,.NET Framework不支持服务器名称指示。(在4.5.1上测试,但我想至少在.NET4.5+上是一样的) 举个

据我所知,.NET中似乎存在一个很大的限制,即无法使用C#和.NET建立使用服务器名称指示(SNI)的TLS连接。我是否遗漏了什么,或者我的理解是否正确


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

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

默认情况下,.NET Framework不支持服务器名称指示。(在4.5.1上测试,但我想至少在.NET4.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请求的一种非常标准的方法。您将看到,在我的例子中,这个示例使用TLS1.2和SNI运行。如果您使用Wireshark查看发送的实际软件包,您将看到一个客户端Hello,其服务器名称指示设置为www.google.com


我们遇到了一个问题:SNI标记是由.NET Framework(或Windows的Schannel,不确定)根据在HttpRequestMessage的构造函数中传递的URL设置的。如果您知道基于某个URL初始化请求(例如),然后切换RequestUri或主机头,SNI标记仍将基于原始URL创建。例如,如果您通过一个请求,并将所有原始头重新映射到新创建的请求,则可能会出现这种情况

在我的.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");

他们都需要将协议显式设置为TLS 1.2才能与SNI服务器一起工作(这在较新的.Net版本中可能已更改)

我们的SecureBackbox在客户端和服务器TLS组件中都完全支持SNI谢谢,我来看看。SNI是TLS扩展,而不是SSL,因此第一步是选择正确的协议。但是是的,4.5版本的.NET不支持SNI,这真是太可惜了@布鲁诺,谢谢,我已经更新了问题,说明了正确的协议。如果IETF调用了他们的版本SSL v4;-),会更容易些@EugeneMayevski'EldoSCorp是否有关于如何将
TElHTTPSClient
类与SNI一起使用的文档(最好是示例代码)?仅列出类成员,但不提供进一步的指导。也没有安装任何示例项目来演示如何使用HTTPS。我恐怕无法重现您在最后一段中提到的行为(这是不幸的,因为我希望将此作为修改SNI标记的黑客方式)。我知道。您在哪里使用WebClient“前缀”SecurityProtocolType.Tls12?Txs!显然是在任何地方,比如在这个问题上?