c# - 使用 TLS 1.2 将客户端连接到 TCP 服务器

标签 c# .net ssl tcp netty

我正在尝试将设备连接到 .Net (4.5.2) 服务器,但没有成功。这是设备打开的 TCP 连接,使用 TLS 1.2。

  • 在服务器端,我有一个 TCP 服务器的标准 .Net 实现:SslStream 通过 DotNetty 包装
  • 我无法更改设备上的任何内容

任何 .Net 客户端都可以使用安全的 TLS 连接成功连接到我的服务器。它在尝试使用 CURL 时也能正常工作,所以我断定我的 TCP 服务器工作正常。

因此,我比较了(使用 Wireshark)工作客户端发送的内容与无法连接的设备发送的内容。我发现的显着差异是缺少(对于设备)Server Name Extension (SNI)在 Client Hello TLS 消息中。

接下来我尝试使用 Pcap.Net 手动将数据发送到我的服务器,即使用原始字节数组(我从尝试连接到我的服务器的设备获得的原始数据(感谢 Wireshark)手动发送 TCP SYN/TCP ACK/Client Hello 消息)。我确认通过添加服务器名称扩展来调整无法正常工作的 Client Hello 原始字节数组会导致我的 TLS 握手正常工作。

很明显,我遇到了不包含 SNI 扩展的客户端问题,如果不存在此信息,服务器会拒绝握手。

我怎样才能改变我的 TCP 服务器的行为方式来接受不提供服务器名称扩展的客户端?是否有可能首先使用标准的 .Net SslStream 类?

AFAIK,SNI 扩展不是强制性的,由客户端决定是否使用它,因此服务器理论上应该接受没有它的客户端问候消息。

任何指针将不胜感激。

最佳答案

.Net 4.5.2 支持 TLS1.2,但默认禁用。

要启用它,您必须明确定义安全协议(protocol)集。

System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;

有关更多信息,请参阅以下链接 https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.securityprotocol%28v=vs.110%29.aspx

关于c# - 使用 TLS 1.2 将客户端连接到 TCP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40216022/

相关文章:

ssl - Typo3 多域与 ssl : TOO_MANY_REDIRECTS

c# - 计算 Unity 场景中的帧率

c# - 如果主类中的属性设置为 false,则在我的主类中使用子类的值

c# - 如何随机放置 2D 小行星,使它们不相互重叠?

c# - 匿名类型的实例是否可序列化到 session 中?

c# - 如何检查字符串是否是命名空间

c# - 问题是在 Windows 7 中为 UBL Api 安装 .pem 扩展安全证书

c# - 从 .NET 设置系统时区

c# - X 已经包含 EntityFramework 的定义 Y? (简单数据库)

java - Android - 连接登录 URI 时出错