16.3.8 设置复制以使用加密的连接

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

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

有关为加密连接设置服务器和 Client 端的更多信息,请参见第 6.3.1 节“配置 MySQL 以使用加密连接”

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

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

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

配置参数如下:

  • ssl_ca:证书颁发机构(CA)证书文件的路径名。 (--ssl-capath类似,但指定了 CA 证书文件目录的路径名.)

  • ssl_cert:服务器公用密钥证书文件的路径名。可以将此证书发送到 Client 端,并根据其拥有的 CA 证书进行身份验证。

  • ssl_key:服务器私钥文件的路径名。

要在副本上启用加密连接,请使用更改为主语句。您可以在副本的my.cnf文件的[client]部分中命名加密连接所需的副本证书和 SSL 私钥文件,也可以使用更改为主语句显式指定该信息。有关更改为主语句的更多信息,请参见第 13.4.2.1 节“将主 table 更改为语句”

  • 要使用选项文件命名副本证书和密钥文件,请将以下行添加到副本的my.cnf文件的[client]部分,并根据需要更改文件名:
[client]
ssl-ca=cacert.pem
ssl-cert=client-cert.pem
ssl-key=client-key.pem
  • 使用--skip-slave-start选项重新启动副本服务器,以防止副本连接到源。使用更改为主指定源配置,并添加MASTER_SSL选项以使用加密进行连接:
mysql> CHANGE MASTER TO
    -> MASTER_HOST='source_hostname',
    -> MASTER_USER='repl',
    -> MASTER_PASSWORD='password',
    -> MASTER_SSL=1;

加密连接的命令选项中所述,为复制连接设置MASTER_SSL=1,然后再不设置其他MASTER_SSL_xxx选项对应于为 Client 端设置--ssl-mode=REQUIRED。使用MASTER_SSL=1,只有在可以构建加密连接的情况下,连接尝试才会成功。复制连接不会退回到未加密的连接,因此没有与--ssl-mode=PREFERRED设置相对应的复制设置。如果设置了MASTER_SSL=0,则它对应于--ssl-mode=DISABLED

  • 要使用更改为主语句命名副本证书和 SSL 私钥文件,如果未在副本的my.cnf文件中执行此操作,请添加适当的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选项,如加密连接的命令选项中所述。为了使这些选项生效,还必须设置MASTER_SSL=1。对于复制连接,为MASTER_SSL_CAMASTER_SSL_CAPATH指定一个值,或在副本的my.cnf文件中指定这些选项对应于设置--ssl-mode=VERIFY_CA。仅当使用指定的信息找到有效的匹配证书颁发机构(CA)证书时,连接尝试才会成功。

  • 要激活主机名身份验证,请添加MASTER_SSL_VERIFY_SERVER_CERT选项:
-> MASTER_SSL_VERIFY_SERVER_CERT=1,

该选项与--ssl-verify-server-cert选项相对应,该选项从 MySQL 5.7.11 开始不推荐使用,并在 MySQL 8.0 中删除。对于复制连接,如加密连接的命令选项中所述,指定MASTER_SSL_VERIFY_SERVER_CERT=1对应于设置--ssl-mode=VERIFY_IDENTITY。为了使此选项生效,还必须设置MASTER_SSL=1。主机名身份验证不适用于自签名证书。

  • 要激活证书吊销列 table(CRL)检查,请添加MASTER_SSL_CRLMASTER_SSL_CRLPATH选项:
-> MASTER_SSL_CRL = 'crl_file_name',
    -> MASTER_SSL_CRLPATH = 'crl_directory_name',

这些选项对应于具有相同名称的--ssl-xxx选项,如加密连接的命令选项中所述。如果未指定,则不会进行 CRL 检查。

  • 要指定副本允许复制连接使用的密码和加密协议的列 table,请添加MASTER_SSL_CIPHERMASTER_TLS_VERSION选项:
-> MASTER_SSL_CIPHER = 'cipher_list',
    -> MASTER_TLS_VERSION = 'protocol_list',

MASTER_SSL_CIPHER选项指定副本允许用于复制连接的密码列 table,其中一个或多个密码名称以冒号分隔。 MASTER_TLS_VERSION选项指定副本允许复制连接使用的加密协议。格式类似于tls_version系统变量的格式,具有一个或多个逗号分隔的协议版本。这些列 table 中可以使用的协议和密码取决于用于编译 MySQL 的 SSL 库。有关格式和允许值的信息,请参见第 6.3.2 节“加密的连接 TLS 协议和密码”

  • 在更新源信息之后,开始复制过程:
mysql> START SLAVE;

您可以使用显示从站状态语句来确认已成功构建加密连接。

  • 在副本服务器上要求加密连接并不能确保源要求副本服务器上的加密连接。如果要确保源仅接受使用加密连接进行连接的副本,请使用REQUIRE SSL选项在源上创建复制用户帐户,然后向该用户授予REPLICATION SLAVE特权。例如:
mysql> CREATE USER 'repl'@'%.example.com' IDENTIFIED BY 'password'
    -> REQUIRE SSL;
mysql> GRANT REPLICATION SLAVE ON *.*
    -> TO 'repl'@'%.example.com';

如果源上已有复制用户帐户,则可以使用以下语句向其添加REQUIRE SSL

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