MySQL 8.0 参考手册  / 第 6 章 安全  / 6.3 使用加密连接  /  6.3.2 加密连接 TLS 协议和密码

6.3.2 加密连接 TLS 协议和密码

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

支持的连接 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,这可能是不可能的。例如,TL​​Sv1 是 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。

连接 TLS 协议配置

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-SHA

MySQL 将此默认密码列表传递给 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-SHA

连接 TLS 协议协商

MySQL 中的连接尝试协商使用双方可用的最高 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 协议和密码

要确定当前客户端会话使用哪种加密 TLS 协议和密码,请检查 Ssl_versionSsl_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 |
+---------------+--------------------+

如果连接未加密,则两个变量都为空值。