我正在尝试将设备连接到 .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/