通过SSL连接MySQL
我正在尝试写一个Python脚本,通过SSL连接到MySQL数据库。我测试了一个示例代码,链接在这里(“通过SSL连接”部分),结果运行得很好。
但是,当我使用wireshark抓包时,发现没有TLSv1协议的数据包,只有TCP数据包:
我期待能看到TLSv1的数据包,因为我测试nginx的HTTPS时,wireshark确实捕获到了TLSv1的数据包:
你能告诉我为什么在MySQL会话中,即使SSL开启了,我也无法捕获到TLSv1的数据包吗?
谢谢!
参考资料:
1 http://dev.mysql.com/doc/connector-python/en/connector-python-connectargs.html
1 个回答
HTTPS是一种协议,它在TCP连接开始时就建立了SSL/TLS连接(这叫“隐式”SSL/TLS)。所有的HTTP流量都是通过SSL/TLS来传输的,并且是在一个独立的端口上进行的,所以Wireshark(一个网络数据包分析工具)知道要先把它解码为SSL/TLS。
而MySQL协议就不一样,它是“显式”SSL/TLS:通信开始时是明文的,然后再升级到SSL/TLS。(关于这两种模式的更多细节,可以在这里和这里找到。)
如果你查看MySQL网络协议文档,你会发现服务器在明文和SSL/TLS连接中,都会首先发送它的初始握手消息(你在抓包中看到的“服务器问候”)。在MySQL内部文档的SSL部分中还有更详细的例子。
在某些情况下,Wireshark可能无法判断SSL/TLS是否被使用,尤其是当它是其他协议在同一端口上的通信的一部分时。你可以尝试通过右键点击数据包,选择“解码为...”来强制它将流量解码为SSL/TLS(然后选择SSL)。
这至少可以解释HTTPS和MySQL在Wireshark中显示的不同表现。
考虑到你在这个截图中的具体例子,很难说哪个是客户端,哪个是服务器,因为你是在本地计算机之间进行通信(如果你选择显示源端口和目标端口,会更明显)。
我自己没有尝试过,但可以合理推测“登录请求用户=”是来自客户端的,并且不是通过SSL/TLS进行的,这似乎表明这个特定的连接没有使用SSL/TLS。(我对MySQL网络协议的细节不太熟悉,所以你可以尝试在Wireshark中将流量解码为SSL,看看会发生什么。如果没有更多关于你客户端和服务器设置的细节,也很难进一步回答。)