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

问题描述:

我试图将设备连接到.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消息。

任何指针将不胜感激。

+0

恐怕.NET没有在这个任何控制 - 'SslStream'仅仅是SChannel中托管的包装,而不是始终至今。您是否尝试过使用证书验证回调?客户你好吗?你可以进一步削减它,使其工作? – Luaan

+0

作为一边你的客户端设备可以建立*任何* TLS1.2连接?例如通过浏览器访问给定的https网站? – wal

+0

如果你绝对必须得到这个工作,你可以考虑SSLStream的不同实现,例如像这样的产品https://www.eldos.com/sbb/desc-ssl-spec.php(我不赞同第一个选择我找到) – wal

净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

+0

好奇,如果有可能在API调用中做到这一点。 – brendo234

+0

@ brendo234我不确定明白你的意思。 System.Net.ServicePointManager.SecurityProtocol是一个API调用。 – cristallo