天天看点

mysql加密连接一、加密概述

一、加密连接 TLS 协议

MySQL 支持多种 TLS 协议和密码,并允许配置允许加密连接的协议和密码。还可以确定当前会话使用的协议和密码

1、mysql支持的tls协议

MySQL 服务器版本                           支持的 TLS 协议
MySQL 8.0.15 及以下                        TLSv1、TLSv1.1、TLSv1.2
MySQL 8.0.16 和 MySQL 8.0.17               TLSv1、TLSv1.1、TLSv1.2、TLSv1.3(组复制除外)
MySQL 8.0.18 到 MySQL 8.0.25               TLSv1、TLSv1.1、TLSv1.2、TLSv1.3(包括组复制)
MySQL 8.0.26 和 MySQL 8.0.27               TLSv1(不推荐)、TLSv1.1(不推荐)、TLSv1.2、TLSv1.3
MySQL 8.0.28 及以上                        TLSv1.2、TLSv1.3(已经不再支持TLSv1、TLSv1.1)      

从 MySQL 8.0.28 开始,MySQL 不再支持 TLSv1 和 TLSv1.1 协议。从此版本开始,客户端无法使用设置为 TLSv1 或 TLSv1.1 的协议建立 TLS/SSL 连接。

2、ssl库

如果 SSL 库不支持特定协议,MySQL 也不支持,以下讨论中指定该协议的任何部分都不适用。特别要注意,要使用 TLSv1.3,MySQL服务器
和客户端应用程序都必须使用 OpenSSL 1.1.1 或更高版本进行编译。MySQL 服务器在启动时检查 OpenSSL的版本,如果低于1.1.1,则
TLSv1.3将移除与TLS版本相关的服务器系统变量的默认值(tls_version,admin_tls_version, group_replication_recovery_tls_version)。      

3、主机配置

主机系统可能只允许某些 TLS 协议,这意味着 MySQL 连接不能使用未经允许的协议,即使 MySQL 本身允许它们:
假设 MySQL 配置允许 TLSv1、TLSv1.1 和 TLSv1.2,但您的主机系统配置只允许使用 TLSv1.2 或更高版本的连接。在这种情况下,您无
法建立使用 TLSv1 或 TLSv1.1 的 MySQL 连接,即使 MySQL 配置为允许它们,因为主机系统不允许它们。
如果 MySQL 配置允许 TLSv1、TLSv1.1 和 TLSv1.2,但您的主机系统配置只允许使用 TLSv1.3 或更高版本的连接,则根本无法建立MySQL
连接,因为主机不允许 MySQL 允许的协议系统。

可以在系统主机配置允许的最低版本
/etc/ssl/openssl.cnf
ssl_conf = ssl_sect
[ssl_sect]
system_default = system_default_sect
[system_default_sect]
MinProtocol = TLSv1.2
MinProtocol = DTLSv1.2      

二、mysql配置

1、查看mysql默认协议

mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';
+---------------+-----------------------+
| Variable_name | Value                 |
+---------------+-----------------------+
| tls_version   | TLSv1.2,TLSv1.3       |
+---------------+-----------------------+      

2、手动设置

[mysqld]
tls_version=TLSv1.2,TLSv1.3

从 MySQL 8.0.16 开始,tls_version可以在运行时更改
在客户端,该 --tls-version选项指定客户端程序允许哪些 TLS 协议连接到服务器。选项值的格式与tls_version前面描述的系统变量的
格式相同(一个或多个逗号分隔的协议版本的列表)。      

3、查询当前会话使用的协议

要确定当前客户端会话使用哪种加密 TLS 协议和密码,请检查 Ssl_version和 Ssl_cipherstatus 变量的会话值:

mysql> SELECT * FROM performance_schema.session_status
       WHERE VARIABLE_NAME IN ('Ssl_version','Ssl_cipher');
+---------------+---------------------------+
| VARIABLE_NAME | VARIABLE_VALUE            |
+---------------+---------------------------+
| Ssl_cipher    | DHE-RSA-AES128-GCM-SHA256 |
| Ssl_version   | TLSv1.2                   |
+---------------+---------------------------+
如果连接未加密,则两个变量都为空值。      

4、加密设置

要要求客户端使用加密连接进行连接,请启用 require_secure_transport系统变量
[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
require_secure_transport=ON

ssl_ca:证书颁发机构 (CA) 证书文件的路径名。(ssl_capath类似,但指定 CA 证书文件目录的路径名。)
ssl_cert:服务器公钥证书文件的路径名。该证书可以发送到客户端并根据其拥有的 CA 证书进行身份验证。
ssl_key: 服务器私钥文件的路径名。

在 MySQL 8.0.16之前,配置加密连接支持的 tls _ xxx 和 ssl _ xxx 系统变量只能在服务器启动时设置。因此,这些系统变量确定服务器用于
所有新连接的 TLS 上下文。
从 MySQL 8.0.16开始,tls _ xxx 和 ssl _ xxx 系统变量是动态的,可以在运行时设置,而不仅仅是在启动时设置。如果使用SET GLOBAL更改
,则新值仅应用于服务器重新启动之前。如果使用SET PERSIST更改,新值也会传递到随后的服务器重新启动。但是,对这些变量的运行时更改不会立
即影响新连接的 TLS 上下文
除了 MySQL 8.0.16中允许运行时更改与 TLS 上下文相关的系统变量之外,服务器还允许运行时更新用于新连接的实际 TLS 上下文。这个功能可能
很有用,例如,可以避免重新启动运行时间过长以至于其 SSL 证书已经过期的 MySQL 服务器。

要在运行时重新配置 TLS 上下文,请使用以下过程:
设置应更改为其新值的每个与 TLS 上下文相关的系统变量。
执行ALTER INSTANCE RELOAD TLS。此语句根据 TLS 上下文相关系统变量的当前值重新配置活动 TLS 上下文。它还设置上下文相关的状态变量以
反映新的活动上下文值。该语句需要 CONNECTION_ADMIN特权。
执行后建立的新连接 ALTER INSTANCE RELOAD TLS使用新的 TLS 上下文。现有连接不受影响。如果应该终止现有连接,请使用该 KILL语句。      

5、密钥文件

对于 MySQL 发行版,服务器可以在启动时自动生成这些文件
1、启动时会检查数据目录是否有以下文件
ca.pem
server-cert.pem
server-key.pem
2、如果存在任何这些文件,则服务器不会创建SSL文件。否则,它会创建它们,以及一些额外的文件:
ca.pem               Self-signed CA certificate
ca-key.pem           CA private key
server-cert.pem      Server certificate
server-key.pem       Server private key
client-cert.pem      Client certificate
client-key.pem       Client private key
3、如果服务器自动生成 SSL文件,它会使用ca.pem、server-cert.pem、server-key.pem设置相应的系统变量(ssl_ca、 ssl_cert、 
ssl_key)。
启动时,如果所有这些条件都满足,服务器会在数据目录中自动生成 RSA 私钥/公钥对文件:
sha256_password_auto_generate_rsa_keys or caching_sha2_password_auto_generate_rsa_keys 系统变量被启用;
没有指定 RSA 选项;数据目录中缺少 RSA 文件。这些密钥对文件支持使用 RSA 在未加密连接上为由 sha256_passwordor 
caching_sha2_password插件验证的帐户进行安全密码交换

1、服务器检查具有以下名称的 RSA 文件的数据目录:
private_key.pem      Private member of private/public key pair
public_key.pem       Public member of private/public key pair
2、如果存在这些文件中的任何一个,则服务器不会创建 RSA 文件。否则,它会创建它们。
3、如果服务器自动生成 RSA 文件,它会使用它们的名称来设置相应的系统变量(sha256_password_private_key_path 和 
sha256_password_public_key_path; caching_sha2_password_private_key_path 和 caching_sha2_password_public_key_path)