文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (美国信纸) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  加密连接 TLS 协议和密码

8.3.2 加密连接 TLS 协议和密码

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

支持的 TLS 协议

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

MySQL 9.0 不支持旧的 TLSv1 和 TLSv1.1 协议。

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

主机系统可能只允许某些 TLS 协议,这意味着 MySQL 连接无法使用主机不允许的协议,即使 MySQL 本身允许它们。解决此问题的可能方法包括以下几种

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

    [system_default_sect]
    MinProtocol = TLSv1.3

    将值更改为较低的协议版本或 None 使系统更具许可性。此解决方法的缺点是允许较低的(不太安全的)协议可能会对安全造成不利影响。

  • 如果您不能或不愿意更改主机系统 TLS 配置,请更改 MySQL 应用程序以使用主机系统允许的更高(更安全)的 TLS 协议。对于仅支持较低协议版本的旧版 MySQL,这可能无法实现。例如,在 MySQL 5.6.46 之前,TLSv1 是唯一支持的协议,因此即使客户端来自支持更高协议版本的更新版 MySQL,也无法建立与 5.6.46 之前版本的服务器的连接。在这种情况下,可能需要升级到支持更多 TLS 版本的 MySQL 版本。

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

  • 如果 MySQL 配置允许 TLSv1、TLSv1.1 和 TLSv1.2,但您的主机系统配置只允许使用 TLSv1.3 或更高版本的连接,则您根本无法建立 MySQL 连接,因为 MySQL 允许的协议都没有被主机系统允许。

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

对 TLSv1 和 TLSv1.1 连接协议的支持已在 MySQL 8.0 中弃用并删除。有关背景信息,请参阅 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 连接协议的版本中,支持 --tls-version 选项以指定与 MySQL 服务器连接的 TLS 协议的客户端(包括 MySQL Shell)无法使用设置为 TLSv1 或 TLSv1.1 的协议建立 TLS/SSL 连接。如果客户端尝试使用这些协议进行连接,对于 TCP 连接,连接将失败,并将错误返回给客户端。对于套接字连接,如果 --ssl-mode 设置为 REQUIRED,则连接将失败,否则连接将建立,但 TLS/SSL 将被禁用。

有关更多信息,请参阅 MySQL 9.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 的 SSL 库和 MySQL Server 版本支持的所有协议。因此,默认设置如 表 8.13,“MySQL Server TLS 协议默认设置” 中所示。

表 8.13 MySQL Server TLS 协议默认设置

MySQL Server 版本 tls_version 默认设置
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

要更严格地限制并仅允许 TLSv1.3 连接,请像这样设置 tls_version

[mysqld]
tls_version=TLSv1.3

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

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

对于此服务器实例为副本的源/副本复制连接, CHANGE REPLICATION SOURCE TO 语句的 SOURCE_TLS_VERSION 选项指定副本允许哪些 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.2)的加密连接的密码或密码集

对于使用 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
注意

在 MySQL 9.0 中,使用 TLS_AES_128_CCM_8_SHA256 与服务器系统变量 --tls-ciphersuites--admin-tls-ciphersuites 会生成弃用警告。

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

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

给定密码可能仅与特定 TLS 协议配合使用,这会影响 TLS 协议协商过程。请参阅连接 TLS 协议协商

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

SHOW SESSION STATUS LIKE 'Ssl_cipher_list';

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

注意

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

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

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

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 协议协商

MySQL 中的连接尝试协商在双方都可用的最高 TLS 协议版本的使用,双方都具有与协议兼容的加密密码。协商过程取决于一些因素,例如用于编译服务器和客户端的 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 库,最终由该库决定从提供的列表中实际启用哪些协议。有关 SSL 库如何处理此问题的详细信息,请参阅 MySQL 源代码和 OpenSSL 的SSL_CTX_new()文档。

监控当前客户端会话 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                   |
+---------------+---------------------------+

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