### 6.3.2 加密连接 TLS 协议和密码

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

-   [支持的 TLS 协议](encrypted-connection-protocols-ciphers.html#encrypted-connection-supported-protocols)

-   [删除对 TLSv1 和 TLSv1.1 协议的支持](encrypted-connection-protocols-ciphers.html#encrypted-connection-deprecated-protocols)

-   [连接 TLS 协议配置](encrypted-connection-protocols-ciphers.html#encrypted-connection-protocol-configuration)

-   [连接密码配置](encrypted-connection-protocols-ciphers.html#encrypted-connection-cipher-configuration)

-   [连接 TLS 协议协商](encrypted-connection-protocols-ciphers.html#encrypted-connection-protocol-negotiation)

-   [监控当前客户端会话 TLS 协议和密码](encrypted-connection-protocols-ciphers.html#encrypted-connection-protocol-monitoring)

#### 支持的 TLS 协议

允许连接到给定 MySQL 服务器实例的协议集受以下多个因素的影响：

MySQL 服务器版本

-   直到并包括 MySQL 8.0.15，MySQL 支持 TLSv1、TLSv1.1 和 TLSv1.2 协议。

-   从 MySQL 8.0.16 开始，MySQL 还支持 TLSv1.3 协议。要使用 TLSv1.3，MySQL 服务器和客户端应用程序都必须使用 OpenSSL 1.1.1 或更高版本进行编译。Group Replication 组件支持 MySQL 8.0.18 中的 TLSv1.3（有关详细信息，请参阅[第 18.6.2 节，“使用安全套接字层 (SSL) 保护组通信连接”](group-replication-secure-socket-layer-support-ssl.html)）。

-   从 MySQL 8.0.26 开始，不推荐使用 TLSv1 和 TLSv1.1 协议。这些协议版本较旧，分别于 1996 年和 2006 年发布，使用的算法较弱且过时。有关背景，请参阅 IETF 备忘录[弃用 TLSv1.0 和 TLSv1.1](https://tools.ietf.org/id/draft-ietf-tls-oldversions-deprecate-02.html).

-   从 MySQL 8.0.28 开始，MySQL 不再支持 TLSv1 和 TLSv1.1 协议。从此版本开始，客户端无法使用设置为 TLSv1 或 TLSv1.1 的协议建立 TLS/SSL 连接。有关更多详细信息，请参阅[删除对 TLSv1 和 TLSv1.1 协议的支持](encrypted-connection-protocols-ciphers.html#encrypted-connection-deprecated-protocols).

[](<>)

**表 6.13 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. |

SSL库

如果SSL库不支持特定协议，MySQL也不支持，下面讨论中指定该协议的任何部分都不适用。特别要注意的是，要使用TLSv1。3、MySQL服务器和客户端应用程序都必须使用OpenSSL 1.1.1或更高版本进行编译。MySQL服务器在启动时检查OpenSSL的版本，如果低于1.1.1，则检查TLSv1。3从与TLS版本相关的服务器系统变量的默认值中删除([`tls_版本`](server-system-variables.html#sysvar_tls_version),[`admin_tls_版本`](server-system-variables.html#sysvar_admin_tls_version)和[`组\u复制\u恢复\u tls\u版本`](group-replication-options.html#sysvar_group_replication_recovery_tls_version)).

MySQL实例配置

允许的TLS协议可以在服务器端和客户端配置为只包括受支持的TLS协议的子集。双方的配置必须至少包含一个通用协议，否则连接尝试无法协商要使用的协议。有关详细信息，请参阅[连接TLS协议协商](encrypted-connection-protocols-ciphers.html#encrypted-connection-protocol-negotiation).

系统范围的主机配置

主机系统可能只允许某些TLS协议，这意味着即使MySQL本身允许，MySQL连接也不能使用非许可协议：

-   假设MySQL配置允许TLSv1，TLSv1。1和TLSv1。2，但主机系统配置只允许使用TLSv1的连接。2或更高。在这种情况下，您无法建立使用TLSv1或TLSv1的MySQL连接。1，即使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
    ```

    将该值更改为较低的协议版本或`没有一个`使系统更加宽松。这种解决方案的缺点是，允许使用较低（不太安全）的协议可能会产生不利的安全后果。

-   如果您不能或不想更改主机系统TLS配置，请将MySQL应用程序更改为使用主机系统允许的更高（更安全）的TLS协议。对于只支持较低协议版本的MySQL的旧版本，这可能是不可能的。例如，TLSv1是MySQL 5.6.46之前唯一受支持的协议，因此，即使客户端来自支持更高协议版本的较新MySQL版本，尝试连接到5.6.46之前的服务器也会失败。在这种情况下，可能需要升级到支持其他TLS版本的MySQL版本。

#### 拆除TLSv1和TLSv1的支架。1.协议

对TLSv1和TLSv1的支持。1从MySQL 8.0.28开始删除连接协议。MySQL 8.0.26不推荐使用这些协议。有关背景信息，请参阅IETF备忘录[反对TLSv1。0和TLSv1。1.](https://tools.ietf.org/id/draft-ietf-tls-oldversions-deprecate-02.html).建议使用更安全的TLSv1进行连接。2和TLSv1。3个协议。TLSv1。3要求MySQL服务器和客户端应用程序都使用OpenSSL 1.1.1进行编译。

支持TLSv1和TLSv1。1被删除，因为这些协议版本是旧的，分别于1996年和2006年发布。使用的算法很弱，而且过时。除非您使用的是非常旧版本的MySQL服务器或连接器，否则不太可能使用TLSv1进行连接。0或TLSv1。1.默认情况下，MySQL连接器和客户端选择可用的最高TLS版本。

在TLSv1和TLSv1的版本中。1不支持连接协议（从MySQL 8.0.28开始），包括MySQL外壳在内的客户端支持[`--tls版本`](connection-options.html#option_general_tls-version)用于为MySQL服务器的连接指定TLS协议的选项无法使用设置为TLSv1或TLSv1的协议建立TLS/SSL连接。1.如果客户端尝试使用这些协议进行连接，对于TCP连接，连接失败，并向客户端返回错误。对于插座连接，如果[`--ssl模式`](connection-options.html#option_general_ssl-mode)即将`必修的`，则连接失败，否则将建立连接，但禁用TLS/SSL。

在服务器端，MySQL 8.0.28更改了以下设置：

-   服务器的默认值[`tls_版本`](server-system-variables.html#sysvar_tls_version)和[`admin_tls_版本`](server-system-variables.html#sysvar_admin_tls_version)系统变量不再包括TLSv1和TLSv1。1.

-   组复制系统变量的默认值[`组\u复制\u恢复\u tls\u版本`](group-replication-options.html#sysvar_group_replication_recovery_tls_version)不再包括TLSv1和TLSv1。1.

-   对于异步复制，副本无法将与源服务器的连接协议设置为TLSv1或TLSv1。1（第`SOURCE_TLS_版本`选择[`将复制源更改为`](change-replication-source-to.html)声明）。

    在TLSv1和TLSv1的版本中。1不推荐使用连接协议（MySQL 8.0.26和MySQL 8.0.27），如果它们包含在[`tls_版本`](server-system-variables.html#sysvar_tls_version)或[`admin_tls_版本`](server-system-variables.html#sysvar_admin_tls_version)系统变量，以及客户端是否使用它们成功连接。如果在运行时设置不推荐的协议并使用`改变实例重新加载TLS`陈述客户端，包括为连接到源服务器指定TLS协议的副本，以及为分布式恢复连接指定TLS协议的组复制组成员，如果配置为允许使用不推荐的TLS协议，则不会发出警告。

    有关更多信息，请参阅[MySQL 8.0是否支持TLS 1.0和1.1？](faqs-security.html#faq-mysql-tls-versions)

#### 连接TLS协议配置

在服务器端[`tls_版本`](server-system-variables.html#sysvar_tls_version)系统变量确定MySQL服务器允许哪些TLS协议进行加密连接。这个[`tls_版本`](server-system-variables.html#sysvar_tls_version)该值适用于来自客户端的连接、此服务器实例为源的常规源/副本复制连接、组复制组通信连接，以及此服务器实例为施主的组复制分布式恢复连接。管理连接接口的配置类似，但使用[`admin_tls_版本`](server-system-variables.html#sysvar_admin_tls_version)系统变量（参见[第5.1.12.2节“行政连接管理”](administrative-connection-interface.html)）。本讨论适用于[`管理TLS版本`](server-system-variables.html#sysvar_admin_tls_version)我也是。

在[`TLS版本`](server-system-variables.html#sysvar_tls_version)值是一个或多个不区分大小写的Comma-Separated TLS协议版本的列表。默认情况下，此变量列出用于编译MySQL的SSL库和MySQL Server版本所支持的所有协议。因此，默认设置如下所示[表6.14，“MySQL Server TLS协议默认设置”](encrypted-connection-protocols-ciphers.html#tls-support-defaults)-是的。

[](<>)

**表6.14 MySQL Server TLS协议默认设置**

| MySQL Server版本 | `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（使用OpenSSL 1.1.1）`<br/><br/>`TLSv1，TLSv1。1，TLSv1。2（否则）`<br/><br/>组复制不支持TLSv1。3. |
| MySQL 8.0.18至MySQL 8.0.25 | `TLSv1，TLSv1。1，TLSv1。2、TLSv1。3（使用OpenSSL 1.1.1）`<br/><br/>`TLSv1，TLSv1。1，TLSv1。2（否则）`<br/><br/>组复制支持TLSv1。3. |
| MySQL 8.0.26和MySQL 8.0.27 | `TLSv1，TLSv1。1，TLSv1。2、TLSv1。3（使用OpenSSL 1.1.1）`<br/><br/>`TLSv1，TLSv1。1，TLSv1。2（否则）`<br/><br/>TLSv1和TLSv1。1.不推荐使用 |
| MySQL 8.0.28及以上版本 | `TLSv1。2、TLSv1。3.` |

确定…的价值[`tls_版本`](server-system-variables.html#sysvar_tls_version)在运行时，使用以下语句：

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

改变[`tls_版本`](server-system-variables.html#sysvar_tls_version)，将其设置为服务器启动。例如，允许使用TLSv1的连接。2或TLSv1。3协议，但禁止使用不太安全的TLSv1和TLSv1的连接。1.协议，在服务器中使用这些行`我的cnf`文件：

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

更加严格，只允许TLSv1。3个连接，设置[`tls_版本`](server-system-variables.html#sysvar_tls_version)这样地：

```
[mysqld]
tls_version=TLSv1.3
```

从MySQL 8.0.16开始，`tls_版本`可以在运行时更改。看见[服务器端运行时配置和监控加密连接](using-encrypted-connections.html#using-encrypted-connections-server-side-runtime-configuration).

在客户端[`--tls版本`](connection-options.html#option_general_tls-version)选项指定客户端程序允许连接到服务器的TLS协议。选项值的格式与[`tls_版本`](server-system-variables.html#sysvar_tls_version)前面描述的系统变量（一个或多个逗号分隔协议版本的列表）。

对于此服务器实例为副本的源/副本复制连接`SOURCE_TLS_版本` \| `主版本`选择[`将复制源更改为`](change-replication-source-to.html)语句（来自MySQL 8.0.23）或[`将主机更改为`](change-master-to.html)语句（MySQL 8.0.23之前）指定副本允许连接到源的TLS协议。选项值的格式与[`tls_版本`](server-system-variables.html#sysvar_tls_version)前面描述的系统变量。看见[第17.3.1节，“设置复制以使用加密连接”](replication-solutions-encrypted-connections.html).

可以为指定的协议`SOURCE_TLS_版本` \| `主版本`依赖于SSL库。此选项独立于服务器，不受服务器影响[`tls_版本`](server-system-variables.html#sysvar_tls_version)价值例如，作为副本的服务器可以配置为[`tls_版本`](server-system-variables.html#sysvar_tls_version)设置为TLSv1。3只允许使用TLSv1的输入连接。3，但也配置了`SOURCE_TLS_版本` \| `主版本`设置为TLSv1。2只允许TLSv1。2用于到源的传出副本连接。

对于组复制分布式恢复连接，其中此服务器实例是启动分布式恢复的加入成员（即客户端），则[`组\u复制\u恢复\u tls\u版本`](group-replication-options.html#sysvar_group_replication_recovery_tls_version)系统变量指定客户端允许哪些协议。同样，此选项独立于服务器，不受服务器影响[`tls_版本`](server-system-variables.html#sysvar_tls_version)值，该值在该服务器实例是施主时适用。组复制服务器通常在其组成员资格期间作为施主和加入成员参与分布式恢复，因此应设置这两个系统变量。看见[第18.6.2节，“使用安全套接字层（SSL）保护组通信连接”](group-replication-secure-socket-layer-support-ssl.html).

TLS协议配置会影响给定连接使用的协议，如中所述[连接TLS协议协商](encrypted-connection-protocols-ciphers.html#encrypted-connection-protocol-negotiation).

应选择允许的协议，例如不在列表中留下“漏洞”。例如，这些服务器配置值没有漏洞：

```
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版本参数设置为空字符串，则无法建立加密连接：

-   [`tls_版本`](server-system-variables.html#sysvar_tls_version)：服务器不允许加密的传入连接。

-   [`--tls版本`](connection-options.html#option_general_tls-version)：客户端不允许到服务器的加密传出连接。

-   `SOURCE_TLS_版本` \| `主版本`：复制副本不允许到源的加密传出连接。

-   [`组\u复制\u恢复\u tls\u版本`](group-replication-options.html#sysvar_group_replication_recovery_tls_version)：加入成员不允许对分布式恢复连接进行加密连接。

#### 连接密码配置

默认密码集适用于加密连接，可以通过显式配置允许的密码来覆盖。在建立连接的过程中，连接的两侧必须允许某些密码共用，否则连接将失败。在双方通用的允许密码中，SSL库选择由提供的证书支持的具有最高优先级的密码。

指定一个或多个适用于通过TLSv1使用TLS协议的加密连接的密码。2:

-   设定[`ssl_密码`](server-system-variables.html#sysvar_ssl_cipher)服务器端的系统变量，并使用[`--ssl密码`](connection-options.html#option_general_ssl-cipher)客户端程序的选项。

-   对于此服务器实例为源的常规源/副本复制连接，请设置[`ssl_密码`](server-system-variables.html#sysvar_ssl_cipher)系统变量。如果此服务器实例是副本，请使用`源密码` \| `主密码`选择[`将复制源更改为`](change-replication-source-to.html)语句（来自MySQL 8.0.23）或[`将主机更改为`](change-master-to.html)语句（MySQL 8.0.23之前）。看见[第17.3.1节，“设置复制以使用加密连接”](replication-solutions-encrypted-connections.html).

-   对于组复制组成员，对于组复制组通信连接，以及对于组复制分布式恢复连接（此服务器实例是施主），请设置[`ssl_密码`](server-system-variables.html#sysvar_ssl_cipher)系统变量。对于此服务器实例是加入成员的组复制分布式恢复连接，请使用[`组\u复制\u恢复\u ssl\u密码`](group-replication-options.html#sysvar_group_replication_recovery_ssl_cipher)系统变量。看见[第18.6.2节，“使用安全套接字层（SSL）保护组通信连接”](group-replication-secure-socket-layer-support-ssl.html).

    用于使用TLSv1的加密连接。3、OpenSSL 1.1.1及更高版本支持以下密码套件，默认情况下会启用前三个：


```
TLS_AES_128_GCM_SHA256
TLS_AES_256_GCM_SHA384
TLS_CHACHA20_POLY1305_SHA256
TLS_AES_128_CCM_SHA256
TLS_AES_128_CCM_8_SHA256
```

配置允许的TLSv1。3密码套件明确设置以下参数。在每种情况下，配置值都是由零个或多个冒号分隔的密码套件名称组成的列表。

-   在服务器端，使用[`tls_密码套件`](server-system-variables.html#sysvar_tls_ciphersuites)系统变量。如果未设置此变量，则其默认值为`无效的`，这意味着服务器允许默认的一组密码套件。如果变量设置为空字符串，则不会启用密码套件，也无法建立加密连接。

-   在客户端，使用[`--tls密码套件`](connection-options.html#option_general_tls-ciphersuites)选项如果未设置此选项，则客户端允许使用默认的密码套件集。如果该选项设置为空字符串，则不会启用密码套件，并且无法建立加密连接。

-   对于此服务器实例为源的常规源/副本复制连接，请使用[`tls_密码套件`](server-system-variables.html#sysvar_tls_ciphersuites)系统变量。如果此服务器实例是副本，请使用`源代码\u TLS\u密码套件` \| `MASTER_TLS_密码套件`选择[`将复制源更改为`](change-replication-source-to.html)语句（来自MySQL 8.0.23）或[`将主机更改为`](change-master-to.html)语句（MySQL 8.0.23之前）。看见[第17.3.1节，“设置复制以使用加密连接”](replication-solutions-encrypted-connections.html).

-   对于组复制组成员、组复制组通信连接以及组复制分布式恢复连接（此服务器实例是施主），请使用[`tls_密码套件`](server-system-variables.html#sysvar_tls_ciphersuites)系统变量。对于此服务器实例是加入成员的组复制分布式恢复连接，请使用[`组\u复制\u恢复\u tls\u密码套件`](group-replication-options.html#sysvar_group_replication_recovery_tls_ciphersuites)系统变量。看见[第18.6.2节，“使用安全套接字层（SSL）保护组通信连接”](group-replication-secure-socket-layer-support-ssl.html).

笔记

Ciphersuite支持从MySQL 8.0.16开始提供，但要求MySQL服务器和客户端应用程序都使用OpenSSL 1.1.1或更高版本进行编译。

在MySQL 8.0.16到8.0.18中[`组\u复制\u恢复\u tls\u密码套件`](group-replication-options.html#sysvar_group_replication_recovery_tls_ciphersuites)系统变量和`源代码\u TLS\u密码套件` \| `MASTER_TLS_密码套件`选择[`将复制源更改为`](change-replication-source-to.html)语句（来自MySQL 8.0.23）或[`将主机更改为`](change-master-to.html)语句（MySQL 8.0.23之前）不可用。在这些版本中，如果TLSv1。3用于源/副本复制连接，或用于分布式恢复的组内复制（MySQL 8.0.18支持），复制源或组复制施主服务器必须允许使用至少一个TLSv1。3默认启用的密码套件。在MySQL 8.0.19中，您可以使用这些选项为任何选择的密码套件配置客户端支持，如果需要，只包括非默认密码套件。

给定的密码可能仅适用于特定的TLS协议，这会影响TLS协议协商过程。看见[连接TLS协议协商](encrypted-connection-protocols-ciphers.html#encrypted-connection-protocol-negotiation).

要确定给定服务器支持哪些密码，请检查[`Ssl_密码_列表`](server-status-variables.html#statvar_Ssl_cipher_list)状态变量：

```
SHOW SESSION STATUS LIKE 'Ssl_cipher_list';
```

这个[`Ssl_密码_列表`](server-status-variables.html#statvar_Ssl_cipher_list)status变量列出了可能的SSL密码（对于非SSL连接为空）。如果MySQL支持TLSv1。3，该值包括可能的TLSv1。3个密码套件。

笔记

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

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

用于通过TLSv1使用TLS协议的加密连接。2、MySQL将以下默认密码列表传递给SSL库。

```
ECDHE-ECDSA-AES128-GCM-SHA256
ECDHE-ECDSA-AES256-GCM-SHA384
ECDHE-RSA-AES128-GCM-SHA256
ECDHE-RSA-AES256-GCM-SHA384
ECDHE-ECDSA-AES128-SHA256
ECDHE-RSA-AES128-SHA256
ECDHE-ECDSA-AES256-SHA384
ECDHE-RSA-AES256-SHA384
DHE-RSA-AES128-GCM-SHA256
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
DHE-RSA-AES256-GCM-SHA384
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_证书`](server-system-variables.html#sysvar_ssl_cert)系统变量设置为使用上述任何受限密码或密码类别的证书时，服务器启动时将禁用对加密连接的支持。

#### 连接TLS协议协商

MySQL中的连接尝试协商使用双方可用的最高TLS协议版本，双方都有协议兼容的加密密码。协商过程取决于各种因素，如用于编译服务器和客户端的SSL库、TLS协议和加密密码配置，以及使用的密钥大小：

-   为了使连接尝试成功，服务器和客户端TLS协议配置必须允许某些协议共用。

-   类似地，服务器和客户端加密密码配置必须允许某些密码共用。给定的密码可能仅适用于特定的TLS协议，因此除非存在兼容的密码，否则不会选择可用于协商过程的协议。

-   如果是TLSv1。3可用，如果可能，可以使用。（这意味着服务器和客户端配置都必须允许TLSv1.3，并且都必须允许某些TLSv1.3兼容的加密密码。）否则，MySQL将使用TLSv1继续浏览可用协议列表。2如果可能的话，以此类推。协商从更安全的协议发展到更不安全的协议。协商顺序与协议的配置顺序无关。例如，谈判顺序是相同的，无论是否[`tls_版本`](server-system-variables.html#sysvar_tls_version)价值`TLSv1，TLSv1。1，TLSv1。2、TLSv1。3.`或`TLSv1。3、TLSv1。2、TLSv1。1，TLSv1`.

-   TLSv1。2不适用于密钥大小小于等于512位的所有密码。要将此协议与这样的密钥一起使用，请设置[`ssl_密码`](server-system-variables.html#sysvar_ssl_cipher)服务器端的系统变量或使用[`--ssl密码`](connection-options.html#option_general_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位的证书。

    如果服务器和客户端没有共同的许可协议，也没有共同的协议兼容密码，则服务器会终止连接请求。例如：

-   如果服务器配置了[`tls_version=TLSv1。1，TLSv1。2.`](server-system-variables.html#sysvar_tls_version):

    -   使用调用的客户端的连接尝试失败[`--tls版本=TLSv1`](connection-options.html#option_general_tls-version)，以及仅支持TLSv1的旧客户端。

    -   类似地，配置为的复制副本的连接尝试也会失败`MASTER_TLS_VERSION='TLSv1'`，以及仅支持TLSv1的旧复制副本。

-   如果服务器配置了[`tls_版本=TLSv1`](server-system-variables.html#sysvar_tls_version)或者是只支持TLSv1的旧服务器：

    -   使用调用的客户端的连接尝试失败[`--tls版本=TLSv1。1，TLSv1。2.`](connection-options.html#option_general_tls-version).

    -   类似地，配置为的复制副本的连接尝试也会失败`MASTER_TLS_VERSION='TLSv1。1，TLSv1。2'`.

    MySQL允许指定要支持的协议列表。该列表直接传递给底层SSL库，最终取决于该库从提供的列表中实际启用了哪些协议。请参考MySQL源代码和OpenSSL[`SSL_CTX_new（）`](https://www.openssl.org/docs/man1.1.0/ssl/SSL_CTX_new.html)有关SSL库如何处理此问题的信息的文档。

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

要确定当前客户端会话使用的加密TLS协议和密码，请检查[`Ssl_版本`](server-status-variables.html#statvar_Ssl_version)和[`Ssl_密码`](server-status-variables.html#statvar_Ssl_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                   |
+---------------+---------------------------+
```

如果连接未加密，则两个变量都有一个空值。
