Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 自定义OpenVPN客户端未接收TLS服务器Hello_Python_Ssl_Scapy_Openvpn - Fatal编程技术网

Python 自定义OpenVPN客户端未接收TLS服务器Hello

Python 自定义OpenVPN客户端未接收TLS服务器Hello,python,ssl,scapy,openvpn,Python,Ssl,Scapy,Openvpn,我正在编写一个简单的OpenVPN客户端(使用Python和Scapy&[Scapy-ssl_tls] )它应该连接到OpenVPN服务器 我用Python打开UDP套接字,用Scapy在UDP之上定义自己的OpenVPN层(根据OpenVPN规范),并在上面发送数据包(就像原始客户端一样) 我能够成功地发送初始p\u控制\u硬重设\u客户端\u V2消息并从服务器接收响应,即p\u控制\u硬重设\u服务器\u V2,然后发送p\u确认\u V1消息 请记住,我正确生成了所有会话ID 现在,当我

我正在编写一个简单的OpenVPN客户端(使用Python和Scapy&[Scapy-ssl_tls] )它应该连接到OpenVPN服务器

我用Python打开UDP套接字,用Scapy在UDP之上定义自己的OpenVPN层(根据OpenVPN规范),并在上面发送数据包(就像原始客户端一样)

我能够成功地发送初始
p\u控制\u硬重设\u客户端\u V2
消息并从服务器接收响应,即
p\u控制\u硬重设\u服务器\u V2
,然后发送
p\u确认\u V1
消息

请记住,我正确生成了所有会话ID

现在,当我发送第一条
p_CONTROL_V1
消息时,它本质上是OpenVPN层顶部的TLS ClientHello,我从服务器得到一个
p_ACK_V1
确认,但仅此而已。请注意,此ACK仅表示服务器接收到OpenVPN消息,不一定是TLS数据。我应该得到服务器Hello和所有剩余的东西,但服务器在确认后不发送任何东西

我将发送的数据包的数据包格式和所有网络层与真实客户端的通信进行了比较(下图),几乎所有字段都是相同的

Wireshark在完全握手时自动组合和组装数据包,因此比较起来没有什么困难

我还试着重播以前真实客户端通信中完整的ClientHello消息(虽然我生成了自己的本地时间),但结果是相同的-ACK,然后什么都没有

我还检查了服务器日志,没有发现任何错误或任何可以帮助我的东西

我这样创建我的TLS数据包(具有更多选项):

openvpn
是我在Scapy中定义的一个层

你知道我为什么不打招呼吗


编辑:考虑到我没有收到来自服务器的任何警报,我非常确定服务器由于某种原因甚至没有看到我的客户端。显然
消息包ID
必须为1(或更多)。现在我从服务器得到响应


只提到数据包id是用于重播保护的,但是….

可能是因为您的实现只发送了
ClientHello
(第一个屏幕截图),“真实的东西”由多个片段组成,包括
ClientHello
+
证书
+
ClientKeyExchange
+
CertificateVerify
。。。(参见屏幕截图信息栏和“消息片段”信息)在“真实事物”中,客户端只发送
ClientHello
(Wireshark将其拆分为两条
P_CONTROL_V1
消息),然后服务器发送自己的
ServerHello
等等。是的,我必须发送证书和所有的东西,但只有在服务器回复之后。当我观察真正的客户机-服务器通信时,我可以通过Wireshark清楚地观察到这一点——在ClientHello来到ServerHello之后。这只是Wireshark合并了所有客户端消息,即使它们以不同的顺序发送。
pack = openvpn(opcode=0x20, session_id=ses, message_packet_id_array_length=0, message_packet_id=0000)/TLSRecord()/TLSHandshake()/TLSClientHello()