目录
[3.1、 have_openssl](#3.1、 have_openssl)
[五、CREATE USER SSL/TLS选项](#五、CREATE USER SSL/TLS选项)
一、前言
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_ssl
和 have_openssl
被禁用时:
- 无论是使用 TCP 连接还是套接字连接,都不会进行加密连接。
当 have_ssl
和 have_openssl
被启用时:
- TCP 连接:MySQL 服务器会默认尝试使用加密连接,即使客户端没有显式指定
--ssl-ca
或其他 SSL 参数。这是因为服务器配置为支持 SSL,客户端驱动程序可能会自动协商使用 SSL。 - 套接字连接:默认情况下,套接字连接(Unix socket)通常不使用 SSL 加密,因为它是一种本地通信方式。如果用户被设置为
REQUIRE SSL
,而客户端没有显式指定 SSL 参数(如--ssl-ca
),连接将失败,因为套接字连接默认不使用 SSL。