TCP和套接字SSL加密连接行为分析

目录

一、前言

二、背景

三、参数介绍

[3.1、 have_openssl](#3.1、 have_openssl)

3.2、have_ssl

3.3、require_secure_transport

四、--ssl-mode=mode

[五、CREATE USER SSL/TLS选项](#五、CREATE USER SSL/TLS选项)

六、问题验证

6.1、使用套接字连接

6.2、使用TCP连接

七、分析与总结


一、前言

SSL(Secure Sockets Layer)认证是客户端到云数据库服务器端的认证,对用户和服务器进行认证。开通 SSL 加密,可获取 CA 证书,将 CA 证书上传在服务端。在客户端访问数据库时,将激活 SSL 协议,在客户端和数据库服务端之间建立一条 SSL 安全通道,实现数据信息加密传输,防止数据在传输过程中被截取、篡改、窃听,保证双方传递信息的安全性。

SSL 协议要求建立在可靠的传输层协议(TCP)之上,其优势在于它是与应用层协议独立无关的,高层的应用层协议(例如:HTTP、FTP、TELNET 等)能透明地建立于 SSL 协议之上。SSL 协议在应用层协议通信之前就已经完成加密算法、通信密钥的协商及服务器认证工作,在此之后应用层协议所传送的数据都会被加密,从而保证通信的私密性。

二、背景

使用非加密方式连接数据库时,在网络中传输的所有信息都是明文,因此存在被非法用户窃听、篡改、冒充的三大风险;而 SSL 协议是为解决这三大风险而设计的,理论上可达到:

  • 信息是加密传播,第三方无法窃听。
  • 具有校验机制,一旦被篡改,通信双方会立刻发现。
  • 配备身份证书,防止身份被冒充。

数据库 MySQL 支持通过开启 SSL 加密来增强链路安全性,并支持下载和安装 SSL CA 证书到需要的应用服务。

SSL 加密不保护数据本身,是确保来往于数据库和服务器之间的流量安全,在传输层对网络连接进行加密,能够提升通信数据的安全性和完整性,但会同时增加网络连接响应时间。

三、参数介绍

3.1、 have_openssl

  • 这个变量表示 MySQL 服务器是否编译时包含了 OpenSSL 支持。OpenSSL 是一个开源的加密库,广泛用于实现 SSL 和 TLS 协议。
  • 如果值为 YES,表示服务器支持 OpenSSL,可以用于建立安全的 SSL 连接。

3.2、have_ssl

  • 这个变量表示 MySQL 服务器是否编译时包含了 SSL 支持。SSL(Secure Sockets Layer)用于在客户端和服务器之间建立安全的加密连接。
  • 如果值为 YES,表示服务器支持 SSL,可以配置 SSL 加密连接。

3.3、require_secure_transport

  • require_secure_transport 设置为 ON 时,MySQL 服务器会拒绝所有非加密的客户端连接。这意味着所有客户端连接都必须使用 SSL/TLS 加密,以确保数据传输的安全性。
  • 默认情况下,require_secure_transport 设置为 OFF,允许非加密连接。

四、--ssl-mode=mode

8.0官方文档:https://dev.mysql.com/doc/refman/8.0/en/connection-options.html

  • DISABLED:禁用 SSL 加密连接。客户端可以不使用 SSL 连接。

  • PREFERRED:首选 SSL 加密连接,如果服务器不支持 SSL,客户端会退回到非加密连接。这是默认值。

  • REQUIRED:必须使用 SSL 加密连接,如果服务器不支持 SSL,连接将失败。

  • VERIFY_CA:必须使用 SSL 加密连接,并验证服务器证书是否由受信任的证书颁发机构签发。

  • VERIFY_IDENTITY:必须使用 SSL 加密连接,并验证服务器证书的主机名或 IP 地址是否与实际连接的主机名或 IP 地址匹配。

五、CREATE USER SSL/TLS选项

官方文档:https://dev.mysql.com/doc/refman/8.0/en/create-user.html#create-user-tls

create user 允许tls_option的值有多个,下面只介绍SSL

  • SSL

通知服务器只允许语句指定的所有帐户进行加密连接。

复制代码
CREATE USER 'jeffrey'@'localhost' REQUIRE SSL;

默认情况下,客户端尝试建立安全连接。对于具有REQUIRE SSL的帐户,如果无法建立安全连接,则连接尝试失败。

六、问题验证

6.1、使用套接字连接

这里创建一个demo4的用户并设置该账号进行加密连接

尝试使用套接字进行连接,可以看到这里没有进行安全连接导致连接失败,而指定--ssl-ca后则连接成功,并且使用了ssl加密

6.2、使用TCP连接

可以看到使用TCP连接时,没有指定--ssl-mode的模式,也没有指定--ssl-ca,但是可以连接成功,没有被拒绝掉,并且连接后发现实际链路还是加密了的

七、分析与总结

问题分析:

  • 首先TCP 连接是网络层的连接方式,而 SSL 加密是应用层的安全协议。
  • 其次REQUIRE SSL 仅是账号级别的限制,而非协议级别的强制。
  • 最后发现当关闭have_ssl和have_openssl后,使用TCP连接后查看实际链路上并没有加密

实际连接行为:

have_sslhave_openssl 被禁用时:

  • 无论是使用 TCP 连接还是套接字连接,都不会进行加密连接。

have_sslhave_openssl 被启用时:

  • TCP 连接:MySQL 服务器会默认尝试使用加密连接,即使客户端没有显式指定 --ssl-ca 或其他 SSL 参数。这是因为服务器配置为支持 SSL,客户端驱动程序可能会自动协商使用 SSL。
  • 套接字连接:默认情况下,套接字连接(Unix socket)通常不使用 SSL 加密,因为它是一种本地通信方式。如果用户被设置为 REQUIRE SSL,而客户端没有显式指定 SSL 参数(如 --ssl-ca),连接将失败,因为套接字连接默认不使用 SSL。
相关推荐
不做菜鸟的网工2 小时前
H3C 单点公网IPsec配置实验
网络协议
树码小子3 天前
Java网络编程:(socket API编程:TCP协议的 socket API -- 回显程序的服务器端程序的编写)
java·网络·tcp/ip
FPGA_Linuxer3 天前
FPGA 40 DAC线缆和光模块带光纤实现40G UDP差异
网络协议·fpga开发·udp
real 13 天前
传输层协议UDP
网络·网络协议·udp
路由侠内网穿透3 天前
本地部署 GPS 跟踪系统 Traccar 并实现外部访问
运维·服务器·网络·windows·tcp/ip
酷飞飞4 天前
Python网络与多任务编程:TCP/UDP实战指南
网络·python·tcp/ip
hsjkdhs4 天前
网络编程之UDP广播与粘包问题
网络·网络协议·udp
yzx9910134 天前
接口协议全解析:从HTTP到gRPC,如何选择适合你的通信方案?
网络·人工智能·网络协议·flask·pygame
风_峰4 天前
【ZYNQ开发篇】Petalinux和电脑端的静态ip地址配置
网络·嵌入式硬件·tcp/ip·ubuntu·fpga开发
板鸭〈小号〉4 天前
UDP-Server(3)chat聊天室
网络·网络协议·udp