### 17.3.1 设置复制以使用加密连接

要使用加密连接传输复制期间所需的二进制日志，源服务器和副本服务器都必须支持加密网络连接。如果任一服务器不支持加密连接（因为尚未为它们编译或配置），则无法通过加密连接进行复制。

为复制设置加密连接类似于为客户端/服务器连接设置加密连接。您必须获得（或创建）可在源上使用的合适的安全证书，以及每个副本上的类似证书（来自相同的证书颁发机构）。您还必须获取合适的密钥文件。

有关为加密连接设置服务器和客户端的更多信息，请参阅[第 6.3.1 节，“配置 MySQL 以使用加密连接”](using-encrypted-connections.html).

要在源上启用加密连接，您必须创建或获取合适的证书和密钥文件，然后将以下配置参数添加到源中的配置中`[mysqld]`源的部分`我的.cnf`文件，根据需要更改文件名：

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

文件的路径可以是相对的或绝对的；我们建议您始终为此使用完整路径。

配置参数如下：

-   [`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): 服务器私钥文件的路径名。

    要在副本上启用加密连接，请使用[`将复制源更改为`](change-replication-source-to.html)语句（来自 MySQL 8.0.23）或[`将主更改为`](change-master-to.html)语句（在 MySQL 8.0.23 之前）。您可以将副本的证书和加密连接所需的 SSL 私钥文件命名为`[客户]`复制品的部分`我的.cnf`文件，或者您可以使用[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)陈述。

-   要使用选项文件命名副本的证书和密钥文件，请将以下行添加到`[客户]`复制品的部分`我的.cnf`文件，根据需要更改文件名：

    ```
    [client]
    ssl-ca=cacert.pem
    ssl-cert=client-cert.pem
    ssl-key=client-key.pem
    ```

-   重新启动副本服务器，使用[`--skip-slave-启动`](replication-options-replica.html#option_mysqld_skip-slave-start)选项，或者从 MySQL 8.0.24 开始，[`skip_slave_start`](replication-options-replica.html#sysvar_skip_slave_start)系统变量，以防止副本连接到源。采用[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)指定源配置，并添加`MASTER_SSL`使用加密连接的选项：

    ```
    mysql> CHANGE MASTER TO
        -> MASTER_HOST='source_hostname',
        -> MASTER_USER='repl',
        -> MASTER_PASSWORD='password',
        -> MASTER_SSL=1;

    Or from MySQL 8.0.23:
    mysql> CHANGE REPLICATION SOURCE TO
        -> SOURCE_HOST='source_hostname',
        -> SOURCE_USER='repl',
        -> SOURCE_PASSWORD='password',
        -> SOURCE_SSL=1;
    ```

    环境`SOURCE_SSL=1`\|`MASTER_SSL=1`对于复制连接，然后不再设置`SOURCE_SSL_*`xxx`*`\|`MASTER_SSL_*`xxx`*`选项对应设置`--ssl 模式=必需`对于客户端，如中所述[加密连接的命令选项](connection-options.html#encrypted-connection-options).和`SOURCE_SSL=1`\|`MASTER_SSL=1`，只有在可以建立加密连接的情况下，连接尝试才会成功。复制连接不会回退到未加密的连接，因此没有对应的设置`--ssl-mode=首选`复制设置。如果`SOURCE_SSL=0`\|`MASTER_SSL=0`设置，这对应于`--ssl-mode=禁用`.

-   使用[`将复制源更改为`](change-replication-source-to.html)\|[`将主更改为`](change-master-to.html)声明，如果您没有在副本中执行此操作`我的.cnf`文件，添加适当的`SOURCE_SSL_*`xxx`*`\|`MASTER_SSL_*`xxx`*`选项：

    ```
        -> MASTER_SSL_CA = 'ca_file_name',
        -> MASTER_SSL_CAPATH = 'ca_directory_name',
        -> MASTER_SSL_CERT = 'cert_file_name',
        -> MASTER_SSL_KEY = 'key_file_name',
    ```

    这些选项对应于`--ssl-*`xxx`*`具有相同名称的选项，如中所述[加密连接的命令选项](connection-options.html#encrypted-connection-options).要使这些选项生效，`MASTER_SSL=1`也必须设置。对于复制连接，指定一个值`MASTER_SSL_CA`要么`MASTER_SSL_CAPATH`，或在副本的`我的.cnf`文件，对应于设置`--ssl-mode=VERIFY_CA`.仅当使用指定信息找到有效的匹配证书颁发机构 (CA) 证书时，连接尝试才会成功。

-   要激活主机名身份验证，请添加`MASTER_SSL_VERIFY_SERVER_CERT`选项：

    ```
        -> MASTER_SSL_VERIFY_SERVER_CERT=1,
    ```

    此选项对应于`--ssl-验证服务器证书`选项，从 MySQL 5.7 中弃用并在 MySQL 8.0 中删除。对于复制连接，指定`MASTER_SSL_VERIFY_SERVER_CERT=1`对应设置`--ssl-mode=VERIFY_IDENTITY`，如中所述[加密连接的命令选项](connection-options.html#encrypted-connection-options).要使此选项生效，`MASTER_SSL=1`也必须设置。主机名身份验证不适用于自签名证书。

-   要激活证书吊销列表 (CRL) 检查，请添加`MASTER_SSL_CRL`要么`MASTER_SSL_CRLPATH`选项：

    ```
        -> MASTER_SSL_CRL = 'crl_file_name',
        -> MASTER_SSL_CRLPATH = 'crl_directory_name',
    ```

    这些选项对应于`--ssl-*`xxx`*`具有相同名称的选项，如中所述[加密连接的命令选项](connection-options.html#encrypted-connection-options).如果未指定，则不进行 CRL 检查。

-   要为复制连接指定副本允许的密码、密码套件和加密协议列表，请使用`MASTER_SSL_CIPHER`,`MASTER_TLS_VERSION`， 和`MASTER_TLS_CIPHERSUITES`选项：

    ```
        -> MASTER_SSL_CIPHER = 'cipher_list',
        -> MASTER_TLS_VERSION = 'protocol_list',
        -> MASTER_TLS_CIPHERSUITES = 'ciphersuite_list',
    ```

    -   这`MASTER_SSL_CIPHER`选项指定副本允许用于复制连接的一个或多个密码的冒号分隔列表。

    -   这`MASTER_TLS_VERSION`选项指定副本允许用于复制连接的 TLS 加密协议的逗号分隔列表，其格式类似于[`tls_version`](server-system-variables.html#sysvar_tls_version)服务器系统变量。连接过程协商使用源和副本都允许的最高 TLS 版本。为了能够连接，副本必须至少有一个与源相同的 TLS 版本。

    -   这`MASTER_TLS_CIPHERSUITES`选项（可从 MySQL 8.0.19 获得）指定一个或多个密码套件的冒号分隔列表，如果 TLSv1.3 用于连接，则复制连接允许这些密码套件。如果此选项设置为`空值`使用 TLSv1.3 时（如果您不设置该选项，则为默认设置），默认启用的密码套件是允许的。如果将该选项设置为空字符串，则不允许使用任何密码套件，因此不使用 TLSv1.3。

        您可以在这些列表中指定的协议、密码和密码套件取决于用于编译 MySQL 的 SSL 库。有关格式、允许的值和未指定选项的默认值的信息，请参阅[第 6.3.2 节，“加密连接 TLS 协议和密码”](encrypted-connection-protocols-ciphers.html).

    笔记

    在 MySQL 8.0.16 到 8.0.18 中，MySQL 支持 TLSv1.3，但是`MASTER_TLS_CIPHERSUITES`选项不可用。在这些版本中，如果 TLSv1.3 用于源和副本之间的连接，则源必须允许使用至少一个默认启用的 TLSv1.3 密码套件。从 MySQL 8.0.19 开始，您可以使用该选项来指定任何选择的密码套件，如果需要，仅包括非默认密码套件。

-   更新源信息后，在副本上启动复制过程：

    ```
    mysql> START SLAVE;
    Or from MySQL 8.0.22:
    mysql> START REPLICA;
    ```

    您可以使用[`显示副本状态`](show-replica-status.html)（或在 MySQL 8.0.22 之前，[`显示奴隶状态`](show-slave-status.html)) 声明以确认已成功建立加密连接。

-   要求副本上的加密连接并不能确保源需要来自副本的加密连接。如果要确保源仅接受使用加密连接进行连接的副本，请使用`需要 SSL`选项，然后授予该用户[`复制奴隶`](privileges-provided.html#priv_replication-slave)特权。例如：

    ```
    mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password'
        -> REQUIRE SSL;
    mysql> GRANT REPLICATION SLAVE ON *.*
        -> TO 'repl'@'%.example.com';
    ```

    如果您在源上有一个现有的复制用户帐户，您可以添加`需要 SSL`用这个声明：

    ```
    mysql> ALTER USER 'repl'@'%.example.com' REQUIRE SSL;
    ```
