Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Encrypted Connection TLS Protocols and Ciphers

8.3.2 加密连接 TLS 协议和密码

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

支持的 TLS 协议

连接到给定 MySQL 服务器实例的协议集受多个因素的影响,如下所示:

MySQL Server release
  • 直到 MySQL 8.0.15,MySQL 支持 TLSv1、TLSv1.1 和 TLSv1.2 协议。

  • 从 MySQL 8.0.16 开始,MySQL 还支持 TLSv1.3 协议。要使用 TLSv1.3,MySQL 服务器和客户端应用程序都必须使用 OpenSSL 1.1.1 或更高版本编译。从 MySQL 8.0.18 开始,组复制组件支持 TLSv1.3(详见 第 20.6.2 节,“使用安全套接字层 (SSL) 保护组通信连接”)。

  • 从 MySQL 8.0.26 开始,TLSv1 和 TLSv1.1 协议被弃用。这些协议版本很旧,分别发布于 1996 年和 2006 年,使用的算法也过时了。有关背景信息,请参阅 IETF备忘录 弃用 TLSv1.0 和 TLSv1.1

  • 从 MySQL 8.0.28 开始,MySQL 不再支持 TLSv1 和 TLSv1.1 协议。从这个版本开始,客户端无法使用 TLSv1 或 TLSv1.1 协议建立 TLS/SSL 连接。有关详细信息,请参阅 TLSv1 和 TLSv1.1 协议支持的删除

表 8.13 MySQL 服务器 TLS 协议支持

MySQL Server Release TLS Protocols Supported
MySQL 8.0.15 及以下 TLSv1, TLSv1.1, TLSv1.2
MySQL 8.0.16 和 MySQL 8.0.17 TLSv1, TLSv1.1, TLSv1.2, TLSv1.3(除 Group Replication 之外)
MySQL 8.0.18 到 MySQL 8.0.25 TLSv1, TLSv1.1, TLSv1.2, TLSv1.3(包括 Group Replication)
MySQL 8.0.26 和 MySQL 8.0.27 TLSv1(已弃用),TLSv1.1(已弃用),TLSv1.2, TLSv1.3
MySQL 8.0.28 及以上 TLSv1.2, TLSv1.3

SSL library

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

MySQL instance configuration

可以在服务器端和客户端配置 TLS 协议,以便仅包括支持的 TLS 协议的子集。双方的配置必须至少包含一个共同的协议,否则连接尝试无法协商协议。有关详细信息,请参阅 连接 TLS 协议协商

System-wide host configuration

主机系统可能仅允许某些 TLS 协议,这意味着 MySQL 连接无法使用不允许的协议,即使 MySQL 本身允许它们:

  • 假设 MySQL 配置允许 TLSv1、TLSv1.1 和 TLSv1.2,但是主机系统配置仅允许使用 TLSv1.2 或更高版本的连接。在这种情况下,即使 MySQL 配置允许 TLSv1 和 TLSv1.1,也无法建立使用这些协议的 MySQL 连接,因为主机系统不允许它们。

  • 如果 MySQL 配置允许 TLSv1、TLSv1.1 和 TLSv1.2,但是主机系统配置仅允许使用 TLSv1.3 或更高版本的连接,那么无法建立任何 MySQL 连接,因为 MySQL 允许的任何协议都不被主机系统允许。

解决这个问题的方法包括:<|start_header_id|>assistant<|end_header_id|> Please note that I've translated the text into Simplified Chinese. If you need Traditional Chinese, please let me know.

  • 将系统范围的主机配置更改为允许其他TLS协议。请参阅操作系统文档以获取说明。例如,您的系统可能具有一个包含以下行的/etc/ssl/openssl.cnf文件,以限制TLS协议为TLSv1.2或更高版本:

    [system_default_sect]
    MinProtocol = TLSv1.2

    将值更改为较低的协议版本或None使系统更加宽松。这一变通方法的缺点是允许较低(不太安全)的协议可能会产生不良的安全后果。

  • 如果您无法或不愿更改主机系统的TLS配置,可以更改MySQL应用程序以使用主机系统允许的更高(更安全)的TLS协议。这可能不适用于较旧版本的MySQL,因为它们只支持较低的协议版本。例如,在MySQL 5.6.46之前,TLSv1是唯一支持的协议,因此,即使客户端来自较新的MySQL版本,但仍然支持较高的协议版本,尝试连接到pre-5.6.46服务器仍将失败。在这种情况下,可能需要升级到支持其他TLS版本的MySQL版本。

删除对TLSv1和TLSv1.1协议的支持

从MySQL 8.0.28开始,不再支持TLSv1和TLSv1.1连接协议。这些协议从MySQL 8.0.26开始被弃用。有关背景信息,请参阅IETF备忘录弃用TLSv1.0和TLSv1.1。建议使用更安全的TLSv1.2和TLSv1.3协议。TLSv1.3需要MySQL服务器和客户端应用程序都编译了OpenSSL 1.1.1。

删除对TLSv1和TLSv1.1的支持,因为这些协议版本很旧,分别发布于1996年和2006年。这些算法使用的是弱旧的。除非您使用非常旧的MySQL Server或连接器,否则您不太可能使用TLSv1.0或TLSv1.1连接。MySQL连接器和客户端默认选择最高的TLS版本。

在不支持TLSv1和TLSv1.1连接协议的版本中(从MySQL 8.0.28开始),包括MySQL Shell在内的客户端,支持指定TLS协议的--tls-version选项,无法使用TLSv1或TLSv1.1协议连接到MySQL服务器。如果客户端尝试使用这些协议连接,TCP连接将失败,并返回错误给客户端。对于套接字连接,如果--ssl-mode设置为REQUIRED,连接将失败,否则连接将被禁用TLS/SSL。

在服务器端,从MySQL 8.0.28开始,以下设置将被更改:

在弃用TLSv1和TLSv1.1连接协议的版本中(MySQL 8.0.26和MySQL 8.0.27),服务器将写入错误日志,如果它们包含在tls_versionadmin_tls_version系统变量的值中,并且如果客户端成功连接使用它们。警告也将返回,如果您在运行时设置弃用协议并使用ALTER INSTANCE RELOAD TLS语句实现它们。客户端,包括副本指定TLS协议连接到源服务器和组复制组成员指定TLS协议分布式恢复连接,不会发出警告,如果它们配置为允许弃用TLS协议。

有关更多信息,请参阅MySQL 8.0是否支持TLS 1.0和1.1?

连接TLS协议配置

在服务器端,tls_version 系统变量确定了 MySQL 服务器允许的 TLS 协议版本,以便进行加密连接。tls_version 值适用于来自客户端的连接、源/副本复制连接(其中该服务器实例是源)、组复制组通信连接和组复制分布式恢复连接(其中该服务器实例是捐赠者)。管理连接接口配置类似,但使用 admin_tls_version 系统变量(见 第 7.1.12.2 节,“管理连接管理”)。本讨论也适用于 admin_tls_version

tls_version 值是一个或多个以逗号分隔的 TLS 协议版本列表,不区分大小写。默认情况下,该变量列出了 MySQL Server 发布版本和 SSL 库支持的所有协议。因此,默认设置如 表 8.14,“MySQL 服务器 TLS 协议默认设置” 所示。

表 8.14 MySQL 服务器 TLS 协议默认设置

MySQL Server Release tls_version Default Setting
MySQL 8.0.15 及以下

TLSv1,TLSv1.1,TLSv1.2

MySQL 8.0.16 和 MySQL 8.0.17

TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 (使用 OpenSSL 1.1.1)

TLSv1,TLSv1.1,TLSv1.2 (否则)

组复制不支持 TLSv1.3

MySQL 8.0.18 到 MySQL 8.0.25

TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 (使用 OpenSSL 1.1.1)

TLSv1,TLSv1.1,TLSv1.2 (否则)

组复制支持 TLSv1.3

MySQL 8.0.26 和 MySQL 8.0.27

TLSv1,TLSv1.1,TLSv1.2,TLSv1.3 (使用 OpenSSL 1.1.1)

TLSv1,TLSv1.1,TLSv1.2 (否则)

TLSv1 和 TLSv1.1 已弃用

MySQL 8.0.28 及以上

TLSv1.2,TLSv1.3


要确定 tls_version 的运行时值,请使用以下语句:

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

要更改 tls_version 的值,请在服务器启动时设置它。例如,要允许使用 TLSv1.2 或 TLSv1.3 协议的连接,但禁止使用不太安全的 TLSv1 和 TLSv1.1 协议,请在服务器 my.cnf 文件中使用以下行:

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

要变得更加 restrictiv 并仅允许 TLSv1.3 连接,请将 tls_version 设置如下:

[mysqld]
tls_version=TLSv1.3

tls_version 可以在运行时更改。请参阅 服务器端运行时配置和监控加密连接

在客户端,--tls-version 选项指定客户端程序允许的 TLS 协议版本,以连接到服务器。选项值的格式与之前描述的 tls_version 系统变量相同(一个或多个以逗号分隔的协议版本列表)。

对于源/副本复制连接,其中该服务器实例是副本,SOURCE_TLS_VERSION 选项为 CHANGE REPLICATION SOURCE TO 语句指定副本允许的 TLS 协议版本,以连接到源。选项值的格式与之前描述的 tls_version 系统变量相同。请参阅 第 19.3.1 节,“设置复制以使用加密连接”

可以为 SOURCE_TLS_VERSION 指定的协议取决于 SSL 库。此选项独立于服务器 tls_version 值不受影响。例如,作为副本的服务器可以配置 tls_version 设置为 TLSv1.3,以仅允许使用 TLSv1.3 的入站连接,但也可以配置 SOURCE_TLS_VERSION 设置为 TLSv1.2,以仅允许 TLSv1.2 的出站副本连接到源。

对于组复制分布式恢复连接,其中该服务器实例是加入成员,启动分布式恢复(即客户端),group_replication_recovery_tls_version系统变量指定了客户端允许的协议。再次,这个选项独立于且不受服务器tls_version值的影响,该值适用于当该服务器实例是捐赠者时。组复制服务器通常在其组成员资格期间同时作为捐赠者和加入成员,因此这两个系统变量都应该被设置。请参阅第 20.6.2 节,“使用安全套接字层(SSL)保护组通信连接”

TLS 协议配置影响连接使用的协议,如连接 TLS 协议协商中所述。

允许的协议应该被选择,以免在列表中留下“漏洞。例如,这些服务器配置值不包含漏洞:

tls_version=TLSv1,TLSv1.1,TLSv1.2,TLSv1.3
tls_version=TLSv1.1,TLSv1.2,TLSv1.3
tls_version=TLSv1.2,TLSv1.3
tls_version=TLSv1.3

这些值包含漏洞,不应该被使用:

tls_version=TLSv1,TLSv1.2       (TLSv1.1 is missing)
tls_version=TLSv1.1,TLSv1.3     (TLSv1.2 is missing)

禁止漏洞的规则也适用于其他配置上下文,例如客户端或副本。

除非您意图禁用加密连接,否则允许协议列表不应该为空。如果您将 TLS 版本参数设置为空字符串,加密连接将无法建立:

连接密码配置

默认情况下,应用于加密连接的一组密码套件,可以通过显式配置允许的密码来覆盖。在连接建立期间,连接的两端必须允许某个共同的密码,否则连接将失败。在允许的密码中,SSL 库选择了支持提供的证书的最高优先级的密码。

要指定适用于使用 TLS 协议的加密连接的密码或密码套件:

对于使用 TLSv1.3 的加密连接,OpenSSL 1.1.1 及更高版本支持以下密码套件,默认情况下启用这些密码套件以供服务器系统变量 --tls-ciphersuites--admin-tls-ciphersuites 使用:

TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_CCM_SHA256
Note

在 MySQL 8.2 之前,TLS_AES_128_CCM_8_SHA256 支持用于服务器系统变量 --tls-ciphersuites--admin-tls-ciphersuitesTLS_AES_128_CCM_8_SHA256 如果在 MySQL 8.2 及更高版本中配置,将生成弃用警告。

要显式配置允许的 TLSv1.3 密码套件,请设置以下参数。在每种情况下,配置值都是零个或多个以冒号分隔的密码套件名称。

密码套件支持需要 MySQL 服务器和客户端应用程序都使用 OpenSSL 1.1.1 或更高版本编译。

给定的密码可能只能与特定的TLS协议一起工作,这会影响TLS协议negotiation过程。请参阅连接TLS协议Negotiation

要确定服务器支持哪些密码,请检查会话值Ssl_cipher_list状态变量:

SHOW SESSION STATUS LIKE 'Ssl_cipher_list';

状态变量Ssl_cipher_list列出了可能的SSL密码(非SSL连接为空)。如果MySQL支持TLSv1.3,则该值包括可能的TLSv1.3密码套件。

Note

ECDSA密码只能与使用ECDSA进行数字签名的SSL证书结合使用,并且它们不能与使用RSA的证书一起使用。MySQL Server的SSL证书自动生成过程不生成ECDSA签名证书,只生成RSA签名证书。除非您有可用的ECDSA证书,否则不要选择ECDSA密码。

对于使用TLSv1.3的加密连接,MySQL使用SSL库的默认密码套件列表。

对于使用TLS协议的加密连接,直到TLSv1.2,MySQL将以下默认密码列表传递给SSL库,以便与服务器系统变量--ssl-cipher--admin-ssl-cipher一起使用。

ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-CHACHA20-POLY1305
ECDHE-RSA-CHACHA20-POLY1305
ECDHE-ECDSA-AES256-CCM
ECDHE-ECDSA-AES128-CCM
DHE-RSA-AES128-GCM-SHA256
DHE-RSA-AES256-GCM-SHA384
DHE-RSA-AES256-CCM
DHE-RSA-AES128-CCM
DHE-RSA-CHACHA20-POLY1305

这些密码限制如下:

  • 以下密码已弃用,并在使用服务器系统变量--ssl-cipher--admin-ssl-cipher时发出警告:

    ECDHE-ECDSA-AES128-SHA256
    ECDHE-RSA-AES128-SHA256
    ECDHE-ECDSA-AES256-SHA384
    ECDHE-RSA-AES256-SHA384
    DHE-DSS-AES128-GCM-SHA256
    DHE-RSA-AES128-SHA256
    DHE-DSS-AES128-SHA256
    DHE-DSS-AES256-GCM-SHA384
    DHE-RSA-AES256-SHA256
    DHE-DSS-AES256-SHA256
    ECDHE-RSA-AES128-SHA
    ECDHE-ECDSA-AES128-SHA
    ECDHE-RSA-AES256-SHA
    ECDHE-ECDSA-AES256-SHA
    DHE-DSS-AES128-SHA
    DHE-RSA-AES128-SHA
    TLS_DHE_DSS_WITH_AES_256_CBC_SHA
    DHE-RSA-AES256-SHA
    AES128-GCM-SHA256
    DH-DSS-AES128-GCM-SHA256
    ECDH-ECDSA-AES128-GCM-SHA256
    AES256-GCM-SHA384
    DH-DSS-AES256-GCM-SHA384
    ECDH-ECDSA-AES256-GCM-SHA384
    AES128-SHA256
    DH-DSS-AES128-SHA256
    ECDH-ECDSA-AES128-SHA256
    AES256-SHA256
    DH-DSS-AES256-SHA256
    ECDH-ECDSA-AES256-SHA384
    AES128-SHA
    DH-DSS-AES128-SHA
    ECDH-ECDSA-AES128-SHA
    AES256-SHA
    DH-DSS-AES256-SHA
    ECDH-ECDSA-AES256-SHA
    DH-RSA-AES128-GCM-SHA256
    ECDH-RSA-AES128-GCM-SHA256
    DH-RSA-AES256-GCM-SHA384
    ECDH-RSA-AES256-GCM-SHA384
    DH-RSA-AES128-SHA256
    ECDH-RSA-AES128-SHA256
    DH-RSA-AES256-SHA256
    ECDH-RSA-AES256-SHA384
    ECDHE-RSA-AES128-SHA
    ECDHE-ECDSA-AES128-SHA
    ECDHE-RSA-AES256-SHA
    ECDHE-ECDSA-AES256-SHA
    DHE-DSS-AES128-SHA
    DHE-RSA-AES128-SHA
    TLS_DHE_DSS_WITH_AES_256_CBC_SHA
    DHE-RSA-AES256-SHA
    AES128-SHA
    DH-DSS-AES128-SHA
    ECDH-ECDSA-AES128-SHA
    AES256-SHA
    DH-DSS-AES256-SHA
    ECDH-ECDSA-AES256-SHA
    DH-RSA-AES128-SHA
    ECDH-RSA-AES128-SHA
    DH-RSA-AES256-SHA
    ECDH-RSA-AES256-SHA
    DES-CBC3-SHA
  • 以下密码被永久限制:

    !DHE-DSS-DES-CBC3-SHA
    !DHE-RSA-DES-CBC3-SHA
    !ECDH-RSA-DES-CBC3-SHA
    !ECDH-ECDSA-DES-CBC3-SHA
    !ECDHE-RSA-DES-CBC3-SHA
    !ECDHE-ECDSA-DES-CBC3-SHA
  • 以下类别的密码被永久限制:

    !aNULL
    !eNULL
    !EXPORT
    !LOW
    !MD5
    !DES
    !RC2
    !RC4
    !PSK
    !SSLv3

如果服务器以ssl_cert系统变量设置为使用任何上述限制密码或密码类别的证书,服务器将禁用加密连接支持。

连接TLS协议Negotiation

MySQL中的连接尝试会在双方都支持的最高TLS协议版本上进行negotiation,以便找到双方都支持的加密密码。negotiation过程取决于因素,如SSL库、TLS协议和加密密码配置,以及使用的密钥大小:

  • 为了使连接尝试成功,服务器和客户端TLS协议配置必须具有共同的协议。

  • 类似地,服务器和客户端加密密码配置必须具有共同的密码。给定的密码可能仅适用于特定的TLS协议,因此只有在协商过程中选择了兼容的密码时,协议才会被选择。

  • 如果TLSv1.3可用,将尽可能使用它。(这意味着服务器和客户端配置都必须允许TLSv1.3,并且都必须允许一些TLSv1.3兼容的加密密码。)否则,MySQL将继续通过可用的协议列表,使用TLSv1.2如果可能,依此类推。协商从更安全的协议到不太安全的协议。协商顺序独立于配置顺序。例如,无论tls_version的值是TLSv1,TLSv1.1,TLSv1.2,TLSv1.3还是TLSv1.3,TLSv1.2,TLSv1.1,TLSv1,协商顺序都是相同的。

  • 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
  • 为了更好的安全性,请使用至少2048位RSA密钥的证书。

如果服务器和客户端没有共同的允许协议和兼容的密码,服务器将终止连接请求。示例:

  • 如果服务器配置了tls_version=TLSv1.1,TLSv1.2

    • 使用--tls-version=TLSv1调用的客户端尝试失败,以及仅支持TLSv1的旧客户端。

    • 类似地,对于配置了SOURCE_TLS_VERSION = 'TLSv1'的副本,以及仅支持TLSv1的旧副本,连接尝试也将失败。

  • 如果服务器配置了tls_version=TLSv1,或者是仅支持TLSv1的旧服务器:

    • 使用--tls-version=TLSv1.1,TLSv1.2调用的客户端尝试失败。

    • 类似地,对于配置了SOURCE_TLS_VERSION = 'TLSv1.1,TLSv1.2'的副本,连接尝试也将失败。

MySQL 允许指定一系列协议以支持。该列表将直接传递给底层 SSL 库,并最终由该库决定从提供的列表中启用哪些协议。请参阅 MySQL 源代码和 OpenSSL SSL_CTX_new() 文档,以获取关于 SSL 库如何处理此操作的信息。

监控当前客户端会话 TLS 协议和密码

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

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

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