### 6.3.1 配置 MySQL 以使用加密连接

[](<>)[](<>)[](<>)

有几个配置参数可用于指示是否使用加密连接，并指定适当的证书和密钥文件。本节提供有关为加密连接配置服务器和客户端的一般指导：

-   [加密连接的服务器端启动配置](using-encrypted-connections.html#using-encrypted-connections-server-side-startup-configuration)

-   [加密连接的服务器端运行时配置和监控](using-encrypted-connections.html#using-encrypted-connections-server-side-runtime-configuration)

-   [加密连接的客户端配置](using-encrypted-connections.html#using-encrypted-connections-client-side-configuration)

-   [将加密连接配置为强制](using-encrypted-connections.html#mandatory-encrypted-connections)

    加密连接也可以在其他上下文中使用，如以下附加部分所述：

-   在源和副本复制服务器之间。看[第 17.3.1 节，“设置复制以使用加密连接”](replication-solutions-encrypted-connections.html).

-   在组复制服务器之间。看[第 18.6.2 节，“使用安全套接字层 (SSL) 保护组通信连接”](group-replication-secure-socket-layer-support-ssl.html).

-   通过基于 MySQL C API 的客户端程序。看[支持加密连接](https://dev.mysql.com/doc/c-api/8.0/en/c-api-encrypted-connections.html).

    创建任何所需证书和密钥文件的说明可在[第 6.3.3 节，“创建 SSL 和 RSA 证书和密钥”](creating-ssl-rsa-files.html).

#### 加密连接的服务器端启动配置

在服务器端，[`--ssl`](server-options.html#option_mysqld_ssl)选项指定服务器允许但不需要加密连接。此选项默认启用，因此无需明确指定。

要要求客户端使用加密连接进行连接，请启用[`require_secure_transport`](server-system-variables.html#sysvar_require_secure_transport)系统变量。看[将加密连接配置为强制](using-encrypted-connections.html#mandatory-encrypted-connections).

服务器端的这些系统变量指定服务器在允许客户端建立加密连接时使用的证书和密钥文件：

-   [`ssl_ca`](server-system-variables.html#sysvar_ssl_ca)：证书颁发机构 (CA) 证书文件的路径名。([`ssl_capath`](server-system-variables.html#sysvar_ssl_capath)类似，但指定 CA 证书文件目录的路径名。）

-   [`ssl_cert`](server-system-variables.html#sysvar_ssl_cert)：服务器公钥证书文件的路径名。该证书可以发送到客户端并根据其拥有的 CA 证书进行身份验证。

-   [`ssl_key`](server-system-variables.html#sysvar_ssl_key): 服务器私钥文件的路径名。

    例如，要启用服务器进行加密连接，请在`我的.cnf`文件，根据需要更改文件名：


```
[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
```

要另外指定客户端需要使用加密连接，请启用[`require_secure_transport`](server-system-variables.html#sysvar_require_secure_transport)系统变量：

```
[mysqld]
ssl_ca=ca.pem
ssl_cert=server-cert.pem
ssl_key=server-key.pem
require_secure_transport=ON
```

每个证书和密钥系统变量都以 PEM 格式命名一个文件。如果您需要创建所需的证书和密钥文件，请参阅[第 6.3.3 节，“创建 SSL 和 RSA 证书和密钥”](creating-ssl-rsa-files.html).使用 OpenSSL 编译的 MySQL 服务器可以在启动时自动生成丢失的证书和密钥文件。看[第 6.3.3.1 节，“使用 MySQL 创建 SSL 和 RSA 证书和密钥”](creating-ssl-rsa-files-using-mysql.html).或者，如果您有 MySQL 源代码分发，您可以使用演示证书和密钥文件测试您的设置`mysql-test/std_data`目录。

服务器执行证书和密钥文件自动发现。如果没有给出明确的加密连接选项，除了[`--ssl`](server-options.html#option_mysqld_ssl)（可能与[`ssl_cipher`](server-system-variables.html#sysvar_ssl_cipher)) 配置加密连接，服务器尝试在启动时自动启用加密连接支持：

-   如果服务器发现名为`卡佩姆`,`server-cert.pem`和`服务器密钥。佩姆`在数据目录中，它支持客户端的加密连接。（文件不需要自动生成；重要的是它们有这些名称并且有效。）

-   如果服务器在数据目录中找不到有效的证书和密钥文件，它将继续执行，但不支持加密连接。

    如果服务器自动启用加密连接支持，它会在错误日志中写入注释。如果服务器发现CA证书是自签名的，它会将警告写入错误日志。（如果由服务器自动创建或使用[**mysql_ssl_rsa\_设置**](mysql-ssl-rsa-setup.html).)

    MySQL还为服务器端加密连接控制提供以下系统变量：

-   [`ssl_密码`](server-system-variables.html#sysvar_ssl_cipher)：连接加密允许使用的密码列表。

-   [`ssl_crl`](server-system-variables.html#sysvar_ssl_crl)：包含证书吊销列表的文件的路径名。([`ssl_crlpath`](server-system-variables.html#sysvar_ssl_crlpath)类似，但指定证书吊销列表文件目录的路径名。）

-   [`tls_版本`](server-system-variables.html#sysvar_tls_version),[`tls_密码套件`](server-system-variables.html#sysvar_tls_ciphersuites)：服务器允许哪些加密协议和密码套件用于加密连接；看见[第6.3.2节，“加密连接TLS协议和密码”](encrypted-connection-protocols-ciphers.html)。例如，您可以配置[`tls_版本`](server-system-variables.html#sysvar_tls_version)防止客户端使用不太安全的协议。

    如果服务器无法从服务器端加密连接控制的系统变量创建有效的TLS上下文，则服务器将在不支持加密连接的情况下执行。

#### 加密服务器的服务器端运行时配置和监控

连接

在MySQL 8.0.16之前`tls_*`xxx`*`和`ssl_*`xxx`*`配置加密连接支持的系统变量只能在服务器启动时设置。因此，这些系统变量决定服务器用于所有新连接的TLS上下文。

从MySQL 8.0.16开始`tls_*`xxx`*`和`ssl_*`xxx`*`系统变量是动态的，可以在运行时设置，而不仅仅是在启动时。如果改变了[`设置全局`](set-variable.html)，新值仅适用于服务器重新启动。如果改变了[`设定持续时间`](set-variable.html)，新值也会转移到后续服务器重新启动。看见[第13.7.6.1节，“设置变量赋值语法”](set-variable.html)。但是，对这些变量的运行时更改不会立即影响新连接的TLS上下文，如本节后面所述。

除了MySQL 8.0.16中允许对TLS上下文相关系统变量进行运行时更改的更改外，服务器还支持对用于新连接的实际TLS上下文进行运行时更新。例如，此功能可能有助于避免重新启动运行时间太长以致其SSL证书过期的MySQL服务器。

为了创建初始TLS上下文，服务器使用与上下文相关的系统变量在启动时的值。为了公开上下文值，服务器还初始化了一组相应的状态变量。下表显示了定义TLS上下文的系统变量，以及公开当前活动上下文值的相应状态变量。

[](<>)

**表6.12服务器主连接接口TLS上下文的系统和状态变量**

| 系统变量名 | 对应的状态变量名 |
| ----- | -------- |
| [`安大略省`](server-system-variables.html#sysvar_ssl_ca) | [`当前的_tls_ca`](server-status-variables.html#statvar_Current_tls_ca) |
| [`卡帕斯酒店`](server-system-variables.html#sysvar_ssl_capath) | [`当前的_tls_capath`](server-status-variables.html#statvar_Current_tls_capath) |
| [`ssl_证书`](server-system-variables.html#sysvar_ssl_cert) | [`当前证书`](server-status-variables.html#statvar_Current_tls_cert) |
| [`ssl_密码`](server-system-variables.html#sysvar_ssl_cipher) | [`当前密码`](server-status-variables.html#statvar_Current_tls_cipher) |
| [`ssl_crl`](server-system-variables.html#sysvar_ssl_crl) | [`当前的_tls _crl`](server-status-variables.html#statvar_Current_tls_crl) |
| [`ssl_crlpath`](server-system-variables.html#sysvar_ssl_crlpath) | [`当前路径`](server-status-variables.html#statvar_Current_tls_crlpath) |
| [`ssl_密钥`](server-system-variables.html#sysvar_ssl_key) | [`当前_tls_密钥`](server-status-variables.html#statvar_Current_tls_key) |
| [`tls_密码套件`](server-system-variables.html#sysvar_tls_ciphersuites) | [`当前的加密套件`](server-status-variables.html#statvar_Current_tls_ciphersuites) |
| [`tls_版本`](server-system-variables.html#sysvar_tls_version) | [`当前版本`](server-status-variables.html#statvar_Current_tls_version) |

从MySQL 8.0.21开始，这些活动TLS上下文值也在性能模式中作为属性公开[`tls_频道_状态`](performance-schema-tls-channel-status-table.html)表，以及任何其他活动TLS上下文的属性。

要在运行时重新配置TLS上下文，请使用以下步骤：

1.  将每个与TLS上下文相关的系统变量设置为其新值。

2.  处决[`改变实例重新加载TLS`](alter-instance.html#alter-instance-reload-tls)。此语句根据TLS上下文相关系统变量的当前值重新配置活动TLS上下文。它还设置与上下文相关的状态变量，以反映新的活动上下文值。声明要求[`连接管理`](privileges-provided.html#priv_connection-admin)特权

3.  执行后建立的新连接[`改变实例重新加载TLS`](alter-instance.html#alter-instance-reload-tls)使用新的TLS上下文。现有连接仍不受影响。如果应该终止现有连接，请使用[`杀死`](kill.html)陈述

    由于重新配置程序的工作方式，每对系统和状态变量的成员可能暂时具有不同的值：

-   之前对系统变量的更改[`改变实例重新加载TLS`](alter-instance.html#alter-instance-reload-tls)不要更改TLS上下文。此时，这些更改对新连接没有影响，相应的上下文相关系统和状态变量可能具有不同的值。这使您能够对单个系统变量进行所需的任何更改，然后使用[`改变实例重新加载TLS`](alter-instance.html#alter-instance-reload-tls)所有系统变量更改完成后。

-   之后[`改变实例重新加载TLS`](alter-instance.html#alter-instance-reload-tls)，相应的系统和状态变量具有相同的值。直到下一次更改系统变量时，这一点才改变。

    在某些情况下，[`改变实例重新加载TLS`](alter-instance.html#alter-instance-reload-tls)它本身可能足以重新配置TLS上下文，而无需更改任何系统变量。假设名为的文件中的证书[`ssl_证书`](server-system-variables.html#sysvar_ssl_cert)已经过期了。用非扩展证书替换现有文件内容并执行就足够了[`改变实例重新加载TLS`](alter-instance.html#alter-instance-reload-tls)使新文件内容被读取并用于新连接。

    从MySQL 8.0.21开始，服务器对管理连接接口进行独立的连接加密配置。看见[对加密连接的管理接口支持](administrative-connection-interface.html#administrative-interface-encrypted-connections)此外[`改变实例重新加载TLS`](alter-instance.html#alter-instance-reload-tls)用一个`频道`子句，该子句允许指定要为其重新加载TLS上下文的通道（接口）。看见[第13.1.5节“变更实例声明”](alter-instance.html)。没有状态变量可公开管理接口TLS上下文，但有性能模式[`tls_频道_状态`](performance-schema-tls-channel-status-table.html)表公开了主界面和管理界面的TLS属性。看见[第27.12.21.7节，“tls\_频道\_“状态表”](performance-schema-tls-channel-status-table.html).

    更新主界面TLS上下文具有以下效果：

-   更新会更改主连接接口上用于新连接的TLS上下文。

-   更新还会更改用于管理接口上新连接的TLS上下文，除非为该接口配置了一些非默认TLS参数值。

-   更新不会影响其他已启用的服务器插件或组件（如组复制或X插件）使用的TLS上下文：

    -   要将主接口重新配置应用于组复制的组通信连接（这些连接从服务器的TLS上下文相关系统变量获取设置），必须执行[`停止组复制`](stop-group-replication.html)然后[`启动组复制`](start-group-replication.html)停止并重新启动组复制。

    -   X Plugin在插件初始化时初始化其TLS上下文，如中所述[第20.5.3节，“使用X插件的加密连接”](x-plugin-encrypted-connections.html).此后，这种情况不会改变。

    默认情况下`重新加载TLS`如果配置值不允许创建新的TLS上下文，则操作将回滚并显示错误，且不起作用。以前的上下文值将继续用于新连接。如果可选`无错误回滚`子句，并且无法创建新上下文，不会发生回滚。相反，会生成一条警告，并对应用该语句的接口上的新连接禁用加密。

    在连接接口上启用或禁用加密连接的选项仅在启动时有效。例如[`--ssl`](server-options.html#option_mysqld_ssl)和[`--管理ssl`](server-options.html#option_mysqld_admin-ssl)选项仅在启动时影响主接口和管理接口是否支持加密连接。这些选项会被忽略，并且对系统的运行没有影响[`改变实例重新加载TLS`](alter-instance.html#alter-instance-reload-tls)在运行时。例如，你可以使用[`--ssl=关闭`](server-options.html#option_mysqld_ssl)要在主界面上禁用加密连接的情况下启动服务器，请重新配置TLS并执行[`改变实例重新加载TLS`](alter-instance.html#alter-instance-reload-tls)在运行时启用加密连接。

#### 加密连接的客户端配置

有关与建立加密连接相关的客户端选项的完整列表，请参阅[用于加密连接的命令选项](connection-options.html#encrypted-connection-options).

默认情况下，如果服务器支持加密连接，MySQL客户端程序会尝试建立加密连接，通过[`--ssl模式`](connection-options.html#option_general_ssl-mode)选项：

-   在没有[`--ssl模式`](connection-options.html#option_general_ssl-mode)选项，客户端尝试使用加密连接，如果无法建立加密连接，则返回到未加密连接。这也是一种带有明确含义的行为[`--ssl模式=首选`](connection-options.html#option_general_ssl-mode)选项

-   具有[`--ssl模式=必需`](connection-options.html#option_general_ssl-mode)，客户端需要加密连接，如果无法建立连接，则会失败。

-   具有[`--ssl模式=禁用`](connection-options.html#option_general_ssl-mode)，客户端使用未加密的连接。

-   具有[`--ssl模式=验证`](connection-options.html#option_general_ssl-mode)或[`--ssl模式=验证身份`](connection-options.html#option_general_ssl-mode)，客户端需要加密连接，还需要对服务器CA证书和（使用）进行验证`验证您的身份`)针对其证书中的服务器主机名。

    如果[`需要安全的交通工具`](server-system-variables.html#sysvar_require_secure_transport)在服务器端启用系统变量，使服务器需要加密连接。看见[强制配置加密连接](using-encrypted-connections.html#mandatory-encrypted-connections).

    客户端上的以下选项标识客户端在与服务器建立加密连接时使用的证书和密钥文件。它们与[`安大略省`](server-system-variables.html#sysvar_ssl_ca), [`ssl_证书`](server-system-variables.html#sysvar_ssl_cert)和[`ssl_密钥`](server-system-variables.html#sysvar_ssl_key)服务器端使用的系统变量，但[`--ssl证书`](connection-options.html#option_general_ssl-cert)和[`--ssl密钥`](connection-options.html#option_general_ssl-key)识别客户端公钥和私钥：

-   [`--ssl ca`](connection-options.html#option_general_ssl-ca)：证书颁发机构（CA）证书文件的路径名。如果使用此选项，则必须指定服务器使用的相同证书。(`--ssl capath`类似，但指定CA证书文件目录的路径名。）

-   [`--ssl证书`](connection-options.html#option_general_ssl-cert)：客户端公钥证书文件的路径名。

-   [`--ssl密钥`](connection-options.html#option_general_ssl-key)：客户端私钥文件的路径名。

    为了获得相对于默认加密提供的额外安全性，客户端可以提供与服务器使用的CA证书匹配的CA证书，并启用主机名身份验证。通过这种方式，服务器和客户端将其信任放在同一CA证书中，并且客户端验证其连接的主机是否是预期的主机：

-   要指定CA证书，请使用[`--ssl ca`](connection-options.html#option_general_ssl-ca)（或[`--ssl capath`](connection-options.html#option_general_ssl-capath))，并指定[`--ssl模式=验证`](connection-options.html#option_general_ssl-mode).

-   要同时启用主机名身份验证，请使用[`--ssl模式=验证身份`](connection-options.html#option_general_ssl-mode)而不是[`--ssl模式=验证`](connection-options.html#option_general_ssl-mode).

笔记

主机名身份验证`验证您的身份`不适用于由服务器自动创建或使用手动创建的自签名证书[**mysql_ssl_rsa\_设置**](mysql-ssl-rsa-setup.html)（见[第6.3.3.1节，“使用MySQL创建SSL和RSA证书及密钥”](creating-ssl-rsa-files-using-mysql.html))。此类自签名证书不包含服务器名称作为公共名称值。

在MySQL 8.0.12之前，主机名身份验证也不适用于使用通配符指定公共名称的证书，因为该名称会与服务器名进行逐字比较。

MySQL还为客户端加密连接控制提供以下选项：

-   [`--ssl密码`](connection-options.html#option_general_ssl-cipher)：连接加密允许使用的密码列表。

-   [`--ssl crl`](connection-options.html#option_general_ssl-crl)：包含证书吊销列表的文件的路径名。(`--ssl crlpath`类似，但指定证书吊销列表文件目录的路径名。）

-   [`--tls版本`](connection-options.html#option_general_tls-version), [`--tls密码套件`](connection-options.html#option_general_tls-ciphersuites)：许可的加密协议和密码套件；看见[第6.3.2节，“加密连接TLS协议和密码”](encrypted-connection-protocols-ciphers.html).

    根据客户端使用的MySQL帐户的加密要求，客户端可能需要指定某些选项，以使用加密连接到MySQL服务器。

    假设您希望使用一个没有特殊加密要求的帐户或使用[`创建用户`](create-user.html)包括`需要SSL`条款假设服务器支持加密连接，则客户端可以使用加密连接，而无需加密[`--ssl模式`](connection-options.html#option_general_ssl-mode)选项或带有明确的[`--ssl模式=首选`](connection-options.html#option_general_ssl-mode)选项：


```
mysql
```

或者：

```
mysql --ssl-mode=PREFERRED
```

对于使用`需要SSL`子句，如果无法建立加密连接，则连接尝试失败。对于没有特殊加密要求的帐户，如果无法建立加密连接，则尝试返回到未加密连接。为了防止在无法获得加密连接时出现回退和失败，请按以下方式连接：

```
mysql --ssl-mode=REQUIRED
```

如果帐户有更严格的安全要求，则必须指定其他选项以建立加密连接：

-   对于使用`需要X509`子句中，客户端必须至少指定[`--ssl证书`](connection-options.html#option_general_ssl-cert)和[`--ssl密钥`](connection-options.html#option_general_ssl-key)此外[`--ssl ca`](connection-options.html#option_general_ssl-ca)（或[`--ssl capath`](connection-options.html#option_general_ssl-capath))建议使用，以便验证服务器提供的公共证书。例如（在一行中输入命令）：

    ```
    mysql --ssl-ca=ca.pem
          --ssl-cert=client-cert.pem
          --ssl-key=client-key.pem
    ```

-   对于使用`要求发行人`或`要求主题`条款，加密要求与`需要X509`，但证书必须分别与帐户定义中指定的问题或主题匹配。

    有关`要求`子句，参见[第13.7.1.3节“创建用户声明”](create-user.html).

    防止使用加密并覆盖其他`--ssl-*`xxx`*`选项，使用[`--ssl模式=禁用`](connection-options.html#option_general_ssl-mode):


```
mysql --ssl-mode=DISABLED
```

要确定与服务器的当前连接是否使用加密，请检查[`Ssl_密码`](server-status-variables.html#statvar_Ssl_cipher)状态变量。如果该值为空，则连接未加密。否则，连接将被加密，该值表示加密密码。例如：

```
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
+---------------+---------------------------+
| Variable_name | Value                     |
+---------------+---------------------------+
| Ssl_cipher    | DHE-RSA-AES128-GCM-SHA256 |
+---------------+---------------------------+
```

对于[**mysql**](mysql.html)客户端，另一种选择是使用`地位`或`\s`命令并检查`SSL`行：

```
mysql> \s
...
SSL: Not in use
...
```

或者：

```
mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
...
```

#### 强制配置加密连接

[](<>)

对于某些MySQL部署，使用加密连接不仅是可取的，而且是强制性的（例如，为了满足监管要求）。本节讨论使您能够执行此操作的配置设置。这些级别的控制是可用的：

-   您可以将服务器配置为要求客户端使用加密连接进行连接。

-   即使服务器允许但不需要加密，也可以调用各个客户端程序来要求加密连接。

-   您可以将单个MySQL帐户配置为仅在加密连接上可用。

    要要求客户端使用加密连接进行连接，请启用[`需要安全的交通工具`](server-system-variables.html#sysvar_require_secure_transport)系统变量。例如，将这些行放入服务器`我的cnf`文件：


```
[mysqld]
require_secure_transport=ON
```

或者，要在运行时设置并保持该值，请使用以下语句：

```
SET PERSIST require_secure_transport=ON;
```

[`设定持续时间`](set-variable.html)为正在运行的MySQL实例设置一个值。它还会保存该值，使其用于后续服务器重启。看见[第13.7.6.1节，“设置变量赋值语法”](set-variable.html).

具有[`需要安全的交通工具`](server-system-variables.html#sysvar_require_secure_transport)启用后，需要客户端连接到服务器才能使用某种形式的安全传输，服务器只允许使用SSL的TCP/IP连接，或使用套接字文件（在Unix上）或共享内存（在Windows上）的连接。服务器拒绝不安全的连接尝试，这些尝试失败时会出现错误[`ER_安全_运输_需要`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_secure_transport_required)错误

要调用客户端程序，使其无论服务器是否需要加密都需要加密连接，请使用[`--ssl模式`](connection-options.html#option_general_ssl-mode)期权价值`必修的`, `核实`或`验证您的身份`.例如：

```
mysql --ssl-mode=REQUIRED
mysqldump --ssl-mode=VERIFY_CA
mysqladmin --ssl-mode=VERIFY_IDENTITY
```

要将MySQL帐户配置为仅在加密连接上可用，请包括`要求`条款[`创建用户`](create-user.html)创建帐户的语句，在该子句中指定所需的加密特征。例如，要要求加密连接并使用有效的X.509证书，请使用`需要X509`:

```
CREATE USER 'jeffrey'@'localhost' REQUIRE X509;
```

有关`要求`子句，参见[第13.7.1.3节“创建用户声明”](create-user.html).

要修改没有加密要求的现有帐户，请使用[`改变用户`](alter-user.html)陈述
