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

标签 c# .net ssl libcurl sni

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

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

最佳答案

在我的 .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 并在其前面加上前缀,它就可以工作:

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");

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

关于c# - 来自 C# 的服务器名称指示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19971236/

相关文章:

c# - 如何将 WPF 用户控件创建为 dll,然后在另一个 WPF 应用程序中查看它?

http - AWS S3 虚拟主机 SSL 不提供索引页面

.net - 处理小图像(<=4k 像素数据)时强制进行 GC?

c# - 正则表达式拆分有异常(exception)

c# - RedirectStandardOutput 和批处理文件中的暂停命令

ssl - 我怎样才能使我的电子邮件像 PayPal 一样经过验证

apache - 将子域 A 重定向到 https 域 B

c# - 使用长时间的 Thread.Sleep 是个好主意吗?

c# - 查询从 1 个表复制到另一个 + 值

c# - 使用 `dynamic` 与 `object` 的性能成本?