我试图将设备连接到.Net(4.5.2)服务器。它是由设备打开的TCP连接,使用TLS 1.2。使用TLS 1.2将客户端连接到TCP服务器
- 在服务器端,我有一个标准的.NET实现一个TCP服务器:
SslStream
通过DotNetty - 我无法在设备上做任何更改包装
任何.NET客户端可以连接成功到我的服务器使用安全的TLS连接。在使用CURL时它也在工作,所以我总结了我的TCP服务器正常工作。
所以我比较(使用Wireshark的)什么是由什么由不能连接设备派出工作客户端发送。我发现的显着差异是在Client Hello TLS消息中没有(针对设备)Server Name Extension (SNI)。
接下来我尝试的是手动发送数据到我的服务器使用Pcap.Net,即手动发送TCP SYN/TCP ACK /客户端Hello消息使用原始字节数组(原始数据我从设备尝试(感谢Wireshark)尝试连接到我的服务器)。我确认通过添加服务器名称扩展来调整非工作客户端Hello原始字节数组会导致我的TLS握手工作。
所以,很显然我与客户的一个问题,不包括SNI扩展,并且拒绝握手,如果该信息不存在的服务器。
我怎么会改变我的方式TCP服务器的行为,以接受客户端不提供服务器扩展名?首先可以使用标准的.Net SslStream
类吗?
AFAIK,SNI扩展不是强制性的,由客户决定是否使用它,所以服务器理论上应该不接受客户端Hello消息。
任何指针将不胜感激。
恐怕.NET没有在这个任何控制 - 'SslStream'仅仅是SChannel中托管的包装,而不是始终至今。您是否尝试过使用证书验证回调?客户你好吗?你可以进一步削减它,使其工作? – Luaan
作为一边你的客户端设备可以建立*任何* TLS1.2连接?例如通过浏览器访问给定的https网站? – wal
如果你绝对必须得到这个工作,你可以考虑SSLStream的不同实现,例如像这样的产品https://www.eldos.com/sbb/desc-ssl-spec.php(我不赞同第一个选择我找到) – wal