MySQL 支持多种 TLS 协议和密码,并允许配置哪些密码允许加密连接。还可以确定当前会话使用的协议和密码。
MySQL 支持使用 TLSv1 协议和(从 MySQL 5.6.46 开始)TLSv1.1 和 TLSv1.2 的加密连接,按安全性从低到高的顺序列出。
从 MySQL 5.6.23 开始,SSL 2.0 和 SSL 3.0 被明确禁用,因为它们提供弱加密。
实际允许连接的协议集受多种因素影响:
- MySQL配置。服务器端和客户端上允许的 TLS 协议必须至少包含一个通用协议,否则连接尝试无法协商要使用的协议。有关详细信息,请参阅 连接 TLS 协议协商。 
- 系统范围的主机配置。主机系统可能只允许某些 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 允许的任何协议. 
 - 此问题的解决方法包括: - 更改系统范围的主机配置以允许其他 TLS 协议。有关说明,请参阅您的操作系统文档。例如,您的系统可能有一个 - /etc/ssl/openssl.cnf包含以下行的文件,用于将 TLS 协议限制为 TLSv1.2 或更高版本:- [system_default_sect] MinProtocol = TLSv1.2- 将值更改为较低的协议版本或 - None使系统更加宽松。此解决方法的缺点是允许较低(不太安全)的协议可能会产生不利的安全后果。
- 如果您不能或不想更改主机系统 TLS 配置,请更改 MySQL 应用程序以使用主机系统允许的更高(更安全)的 TLS 协议。对于仅支持较低协议版本的旧版本 MySQL,这可能是不可能的。例如,TLSv1 是 MySQL 5.6.46 之前唯一受支持的协议,因此即使客户端来自支持更高协议版本的较新 MySQL 版本,尝试连接到 5.6.46 之前的服务器也会失败。在这种情况下,可能需要升级到支持其他 TLS 版本的 MySQL 版本。 
 
- SSL 库。如果 SSL 库不支持特定协议,则 MySQL 也不支持,并且以下讨论中指定该协议的任何部分都不适用。 - 当使用 OpenSSL 1.0.1 或更高版本编译时,MySQL 从 MySQL 5.6.46 开始支持 TLSv1、TLSv1.1 和 TLSv1.2 协议,在 5.6.46 之前支持 TLS1v1。 
- 使用 yaSSL 编译时,MySQL 支持 TLSv1 协议。 
 笔记- 仅在 MySQL 5.6.46 之前,可以使用 yaSSL 作为 OpenSSL 的替代方案来编译 MySQL。从 MySQL 5.6.46 开始,删除了对 yaSSL 的支持,所有 MySQL 构建都使用 OpenSSL。 
MySQL 支持使用 TLSv1 协议和(从 MySQL 5.6.46 开始)TLSv1.1 和 TLSv1.2 的加密连接。协议支持是内置的,不能像 MySQL 5.7 及更高版本中那样进行配置。为给定连接选择的协议取决于协商过程。请参阅 连接 TLS 协议协商。
一组默认密码适用于加密连接,可以通过显式配置允许的密码来覆盖它。在连接建立期间,连接的双方必须允许一些共同的密码,否则连接失败。在双方通用的允许密码中,SSL 库选择所提供证书支持的具有最高优先级的密码。
        要为加密连接指定一个或多个密码,请ssl_cipher在服务器端设置系统变量,并使用
        --ssl-cipher客户端程序的选项。
      
        对于源/副本复制,语句的
        MASTER_SSL_CIPHER选项
        CHANGE MASTER TO指定副本服务器允许哪些密码连接到源。
      
Ssl_cipher_list要确定给定服务器支持哪些密码,请检查状态变量
      
        的会话值
        :
SHOW SESSION STATUS LIKE 'Ssl_cipher_list';
        status 变量列出了可能的Ssl_cipher_listSSL 密码(对于非 SSL 连接为空)。可用密码集取决于您的 MySQL 版本以及 MySQL 是使用 OpenSSL 还是 yaSSL 编译的,以及(对于 OpenSSL)用于编译 MySQL 的库版本。
      
MySQL 将默认密码列表传递给 SSL 库。
MySQL 将此默认密码列表传递给 OpenSSL:
AES256-GCM-SHA384
AES256-SHA
AES256-SHA256
CAMELLIA256-SHA
DES-CBC3-SHA
DHE-DSS-AES256-GCM-SHA384
DHE-DSS-AES256-SHA
DHE-DSS-AES256-SHA256
DHE-DSS-CAMELLIA256-SHA
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES256-SHA
DHE-RSA-AES256-SHA256
DHE-RSA-CAMELLIA256-SHA
ECDH-ECDSA-AES256-GCM-SHA384
ECDH-ECDSA-AES256-SHA
ECDH-ECDSA-AES256-SHA384
ECDH-ECDSA-DES-CBC3-SHA
ECDH-RSA-AES256-GCM-SHA384
ECDH-RSA-AES256-SHA
ECDH-RSA-AES256-SHA384
ECDH-RSA-DES-CBC3-SHA
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES128-SHA
ECDHE-ECDSA-AES128-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES256-SHA
ECDHE-ECDSA-AES256-SHA384
ECDHE-ECDSA-DES-CBC3-SHA
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES128-SHA
ECDHE-RSA-AES128-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-RSA-AES256-SHA
ECDHE-RSA-AES256-SHA384
ECDHE-RSA-DES-CBC3-SHA
EDH-DSS-DES-CBC3-SHA
EDH-RSA-DES-CBC3-SHA
PSK-3DES-EDE-CBC-SHA
PSK-AES256-CBC-SHA
SRP-DSS-3DES-EDE-CBC-SHA
SRP-DSS-AES-128-CBC-SHA
SRP-DSS-AES-256-CBC-SHA
SRP-RSA-3DES-EDE-CBC-SHA
SRP-RSA-AES-128-CBC-S
SRP-RSA-AES-256-CBC-SHAMySQL 将此默认密码列表传递给 yaSSL:
AES128-RMD
AES128-SHA
AES256-RMD
AES256-SHA
DES-CBC-SHA
DES-CBC3-RMD
DES-CBC3-SHA
DHE-RSA-AES128-RMD
DHE-RSA-AES128-SHA
DHE-RSA-AES256-RMD
DHE-RSA-AES256-SHA
DHE-RSA-DES-CBC3-RMD
EDH-RSA-DES-CBC-SHA
EDH-RSA-DES-CBC3-SHA
RC4-MD5
RC4-SHAMySQL 中的连接尝试协商使用双方可用的最高 TLS 协议版本,双方都可以使用协议兼容的加密密码。协商过程取决于用于编译服务器和客户端的 SSL 库、TLS 协议和加密密码配置以及使用的密钥大小等因素:
- 为使连接尝试成功,服务器和客户端 TLS 协议配置必须允许某些通用协议。 
- 同样,服务器和客户端加密密码配置必须允许一些共同的密码。给定的密码可能只适用于特定的 TLS 协议,因此除非也有兼容的密码,否则不会选择可用于协商过程的协议。 
- 如果服务器和客户端使用 OpenSSL 编译,则尽可能使用 TLSv1.2。如果服务器和客户端之一或两者都使用 yaSSL 进行编译,则只能使用 TLSv1。(“可能”意味着服务器和客户端配置都必须允许指定的协议,并且都必须允许一些协议兼容的加密密码。)否则,MySQL 继续通过可用协议列表,从更安全的协议到更不安全的协议。 
- TLSv1.2 不适用于密钥大小为 512 位或更小的所有密码。要将此协议与此类密钥一起使用,请 - ssl_cipher在服务器端设置系统变量或使用- --ssl-cipher客户端选项明确指定密码名称:- AES128-SHA AES128-SHA256 AES256-SHA AES256-SHA256 CAMELLIA128-SHA CAMELLIA256-SHA DES-CBC3-SHA DHE-RSA-AES256-SHA RC4-MD5 RC4-SHA SEED-SHA
- 为提高安全性,请使用 RSA 密钥大小至少为 2048 位的证书。 
如果服务器和客户端没有共同的允许协议和共同的协议兼容密码,则服务器终止连接请求。例子:
- 如果服务器来自 MySQL 5.7 或更高版本并且配置为 - tls_version=TLSv1.1,TLSv1.2:- 对于仅支持 TLSv1 的 MySQL 5.6.46 之前的客户端,连接尝试失败。 
- 同样,对于仅支持 TLSv1 的 MySQL 5.6.46 之前的副本,连接尝试失败。 
 
- 如果服务器是仅支持 TLSv1 的 MySQL 5.6.46 之前的服务器: - 使用 调用的 MySQL 5.7 或更高版本客户端的连接尝试失败 - --tls-version=TLSv1.1,TLSv1.2。
- 同样,对于 MySQL 5.7 或更高版本配置的副本,连接尝试失败 - MASTER_TLS_VERSION = 'TLSv1.1,TLSv1.2'。
 
        要确定当前客户端会话使用哪种加密 TLS 协议和密码,请检查
        Ssl_version和
        Ssl_cipher状态变量的会话值:
      
mysql> SHOW SESSION STATUS LIKE 'Ssl_version';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Ssl_version   | TLSv1 |
+---------------+-------+
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| Ssl_cipher    | DHE-RSA-AES256-SHA |
+---------------+--------------------+如果连接未加密,则两个变量都为空值。