我尝试将设备连接到 .Net (4.5.2) 服务器,但没有成功。它是设备打开的 TCP 连接,使用 TLS 1.2。
- 在服务器端,我有一个 TCP 服务器的标准 .Net 实现:
SslStream
包裹着DotNetty https://github.com/Azure/DotNetty
- 我无法更改设备上的任何内容
任何 .Net 客户端都可以使用安全的 TLS 连接成功连接到我的服务器。尝试使用 CURL 时它也可以工作,所以我得出结论我的 TCP 服务器工作正常。
因此,我(使用 Wireshark)比较了工作客户端发送的内容和无法连接的设备发送的内容。我发现的显着差异是(对于设备)缺少服务器名称扩展 (SNI) https://www.rfc-editor.org/rfc/rfc4366#section-3.1在 Client Hello TLS 消息中。
我尝试的下一步是使用手动将数据发送到我的服务器Pcap.Net https://github.com/PcapDotNet/Pcap.Net,即使用原始字节数组(我从尝试连接到我的服务器的设备获得的原始数据(感谢 Wireshark))手动发送 TCP SYN/TCP ACK/Client Hello 消息。我确认通过添加服务器名称扩展来调整不工作的 Client Hello 原始字节数组会导致我的 TLS 握手正常工作。
显然,我遇到了不包含 SNI 扩展的客户端以及如果不存在此信息则拒绝握手的服务器的问题。
如何更改 TCP 服务器的行为方式以接受不提供服务器名称扩展的客户端?首先是否可以使用标准.NetSslStream
class?
AFAIK,SNI扩展不是强制性的,由客户端决定是否使用它,所以服务器应该理论上接受没有它的 Client Hello 消息。
任何指针将不胜感激。
.Net 4.5.2 支持 TLS1.2,但默认情况下处于禁用状态。
为了启用它,您必须显式定义安全协议集。
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 https://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.securityprotocol%28v=vs.110%29.aspx
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)