MySQL 8.0 参考手册  / 第 6 章 安全  /  6.3 使用加密连接

6.3 使用加密连接

通过 MySQL 客户端和服务器之间的未加密连接,有权访问网络的人可以监视您的所有流量并检查客户端和服务器之间发送或接收的数据。

当您必须以安全的方式在网络上移动信息时,未加密的连接是不可接受的。要使任何类型的数据不可读,请使用加密。加密算法必须包含安全元素以抵御多种已知攻击,例如更改加密消息的顺序或重放数据两次。

MySQL 支持使用 TLS(传输层安全)协议在客户端和服务器之间进行加密连接。TLS 有时被称为 SSL(安全套接字层),但 MySQL 实际上并不使用 SSL 协议进行加密连接,因为它的加密很弱(请参阅 第 6.3.2 节,“加密连接 TLS 协议和密码”)。

TLS 使用加密算法来确保通过公共网络接收的数据是可信的。它具有检测数据更改、丢失或重放的机制。TLS 还包含使用 X.509 标准提供身份验证的算法。

X.509 使在 Internet 上识别某人成为可能。简而言之,应该有一些称为证书颁发机构(或 CA)的实体将电子证书分配给需要它们的任何人。证书依赖于具有两个加密密钥(公钥和秘密密钥)的非对称加密算法。证书所有者可以将证书作为身份证明提供给另一方。证书由其所有者的公钥组成。使用此公钥加密的任何数据只能使用证书所有者持有的相应密钥进行解密。

可以使用 OpenSSL 或 yaSSL 编译 MySQL 以支持加密连接。有关这两个包的比较,请参阅 第 6.3.4 节,“SSL 库相关功能”。有关每个包支持的加密协议和密码的信息,请参阅 第 6.3.2 节,“加密连接 TLS 协议和密码”

笔记

仅在 MySQL 5.7.28 之前,可以使用 yaSSL 作为 OpenSSL 的替代方案来编译 MySQL。从 MySQL 5.7.28 开始,删除了对 yaSSL 的支持,所有 MySQL 构建都使用 OpenSSL。

默认情况下,如果服务器支持加密连接,MySQL 程序会尝试使用加密连接,如果无法建立加密连接,则回退到未加密连接。有关影响加密连接使用的选项的信息,请参阅 第 6.3.1 节,“配置 MySQL 以使用加密连接”和 加密连接的命令选项

MySQL 在每个连接的基础上执行加密,并且对给定用户使用加密可以是可选的或强制的。这使您能够根据各个应用程序的要求选择加密或未加密的连接。有关如何要求用户使用加密连接的信息,请参阅第 13.7.1.2 节“CREATE USER 语句”中语句 的REQUIRE子句的 讨论。另请参阅 第 5.1.7 节“服务器系统变量”中系统变量的说明CREATE USERrequire_secure_transport

可以在源服务器和副本服务器之间使用加密连接。请参阅第 16.3.8 节,“设置复制以使用加密连接”

有关从 MySQL C API 使用加密连接的信息,请参阅支持加密连接

也可以使用 SSH 连接中的加密连接到 MySQL 服务器主机。有关示例,请参阅 第 6.3.5 节,“使用 SSH 从 Windows 远程连接到 MySQL”

MySQL 5.7 中对加密连接支持进行了多项改进。以下时间表总结了这些变化:

  • 5.7.3:在客户端,显式 --ssl选项不再是建议性的而是规范性的。给定一个支持加密连接的服务器,客户端程序可以通过仅指定 --ssl选项来要求加密连接。(以前,客户端必须指定 选项,或、 和 选项--ssl-ca的所有三个选项。)如果无法建立加密连接,连接尝试将失败。在没有的情况下,客户端的 其他 选项是建议性的--ssl-ca--ssl-key--ssl-cert--ssl-xxx--ssl:客户端尝试使用加密进行连接,但如果无法建立加密连接,则会回退到未加密的连接。

  • 5.7.5:服务器端--ssl 选项值默认启用。

    对于使用 OpenSSL 编译的服务器, auto_generate_certssha256_password_auto_generate_rsa_keys 系统变量可用于在启动时启用 SSL/RSA 证书和密钥文件的自动生成和自动发现。对于证书和密钥自动发现,如果 --ssl启用并且 提供其他选项来显式配置加密连接,则服务器会在启动时尝试在数据目录中发现必需的证书和密钥文件时自动启用对加密连接的支持。 --ssl-xxx

  • 5.7.6: The mysql_ssl_rsa_setup utility is available to make it easier to manually generate SSL/RSA certificate and key files. Autodiscovery of SSL/RSA files at startup is expanded to apply to all servers, whether compiled using OpenSSL or yaSSL. (This means that auto_generate_certs need not be enabled for autodiscovery to occur.)

    If the server discovers at startup that the CA certificate is self-signed, it writes a warning to the error log. (The certificate is self-signed if created automatically by the server, or manually using mysql_ssl_rsa_setup.)

  • 5.7.7: The C client library attempts to establish an encrypted connection by default if the server supports encrypted connections. This affects client programs as follows:

    • In the absence of an --ssl option, clients attempt to connect using encryption, falling back to an unencrypted connection if an encrypted connection cannot be established.

    • The presence of an explicit --ssl option or a synonym (--ssl=1, --enable-ssl) is prescriptive: Clients require an encrypted connection and fail if one cannot be established.

    • With an --ssl=0 option or a synonym (--skip-ssl, --disable-ssl), clients use an unencrypted connection.

    This change also affects subsequent releases of MySQL Connectors that are based on the C client library: Connector/C++ and Connector/ODBC.

  • 5.7.8: The require_secure_transport system variable is available to control whether client connections to the server must use some form of secure transport.

  • 5.7.10: TLS protocol support is extended from TLSv1 to also include TLSv1.1 and TLSv1.2. The tls_version system variable on the server side and --tls-version option on the client side enable the level of support to be selected. See Section 6.3.2, “Encrypted Connection TLS Protocols and Ciphers”.

  • 5.7.11: MySQL client programs support an --ssl-mode option that enables you to specify the security state of the connection to the server. The --ssl-mode option comprises the capabilities of the client-side --ssl and --ssl-verify-server-cert options. Consequently, --ssl and --ssl-verify-server-cert are deprecated, and are removed in MySQL 8.0.

  • 5.7.28:删除了对 yaSSL 的支持。所有 MySQL 构建都使用 OpenSSL。

  • 5.7.35:不推荐使用 TLSv1 和 TLSv1.1 协议。