我正在尝试编写一个使用SSL连接到MySQL的python脚本。我已在1("通过SSL连接"部分)中测试了示例代码,它运行正常。
但是,当我使用wireshark捕获发送的数据包时,我没有找到TLSv1协议数据包,只有TCP数据包:
我期待TLSv1数据包,因为当我测试nginx的HTTPS时,wireshark会捕获TLSv1数据包:
你能不能告诉我为什么我在MySQL会话期间无法捕获TLSv1数据包,即使SSL已开启?
谢谢!
参考文献:
1 http://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html
答案 0 :(得分:1)
HTTPS是一种协议,它依赖于从TCP连接开始建立的SSL / TLS连接(“隐式”SSL / TLS)。所有HTTP流量都通过SSL / TLS进行交换,并且它是在一个不同的端口上完成的,因此Wireshark知道它应该首先将其解码为SSL / TLS。
MySQL协议不是(它是“显式”SSL / TLS):通信以纯文本格式启动,然后升级到SSL / TLS。 (关于这两种模式的更多详细信息here和here。)
如果查看MySQL network protocol documentation,服务器仍然会在普通和SSL / TLS连接中首先发送其初始握手消息(您在捕获中看到的“服务器问候”)。 SSL section of the MySQL internals documentation中还有一个更详细的例子。
在某些情况下,Wireshark可能无法猜测SSL / TLS是否已被使用,当它是同一端口上另一个协议通信的一部分时。您可以尝试通过右键单击数据包并选择“Decode As ...”(然后是SSL)来强制它将流量解码为SSL / TLS。
这至少应该解释HTTPS和MySQL之间的不同行为,关于你在Wireshark看到的内容。
考虑到此屏幕截图中的具体示例,很难说哪个是客户端,哪个是服务器,因为您正在从localhost到localhost进行通信(如果您选择显示源和目的港)。
我没有尝试过自己,但似乎有理由认为“登录请求user =”来自客户端并且不是通过SSL / TLS完成的,这似乎表明此特定连接不使用SSL / TLS。 (我不熟悉MySQL网络协议的细节,因此您可以尝试在Wireshark中将流量解码为SSL以查看会发生什么。如果没有关于您的设置的更多详细信息,在客户端上也很难回答任何问题。和服务器。)