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

6.3.1 配置 MySQL 使用加密连接

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

加密连接也可用于其他上下文,如以下附加部分中所述:

第 6.3.3 节“创建 SSL 和 RSA 证书和密钥” 中提供了创建任何所需证书和密钥文件的说明。

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

在服务器端,该--ssl 选项指定服务器允许但不需要加密连接。默认情况下启用此选项,因此无需明确指定。

要要求客户端使用加密连接进行连接,请启用 require_secure_transport系统变量。请参阅将加密连接配置为强制性的。

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

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

  • ssl_cert: 服务器公钥证书文件的路径名。该证书可以发送到客户端并根据它拥有的 CA 证书进行身份验证。

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

例如,要为服务器启用加密连接,请使用my.cnf 文件中的这些行启动它,并根据需要更改文件名:

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

要另外指定客户端需要使用加密连接,请启用 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 证书和密钥”。使用 OpenSSL 编译的 MySQL 服务器可以在启动时自动生成丢失的证书和密钥文件。请参阅 第 6.3.3.1 节,“使用 MySQL 创建 SSL 和 RSA 证书和密钥”。或者,如果您有 MySQL 源代码分发版,则可以使用其mysql-test/std_data目录中的演示证书和密钥文件来测试您的设置。

服务器执行证书和密钥文件自动发现。--ssl如果除了(可能连同 )配置加密连接之外没有给出明确的加密连接选项 ssl_cipher,服务器会尝试在启动时自动启用加密连接支持:

  • ca.pem如果服务器在数据目录中发现名为、 server-cert.pem和 的 有效证书和密钥文件server-key.pem,它会启用对客户端加密连接的支持。(这些文件不需要自动生成;重要的是它们具有这些名称并且是有效的。)

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

如果服务器自动启用加密连接支持,它会在错误日志中写入一条注释。如果服务器发现 CA 证书是自签名的,它会在错误日志中写入一条警告。(如果由服务器自动创建或使用 mysql_ssl_rsa_setup手动创建,则该证书是自签名的。)

MySQL 还为服务器端加密连接控制提供了这些系统变量:

加密连接的客户端配置

有关与建立加密连接相关的客户端选项的完整列表,请参阅加密连接的 命令选项

默认情况下,如果服务器支持加密连接,MySQL 客户端程序会尝试建立加密连接,并通过以下 --ssl-mode选项进一步控制:

  • 在没有 --ssl-mode选项的情况下,客户端会尝试使用加密进行连接,如果无法建立加密连接,则会回退到未加密的连接。这也是具有显式 --ssl-mode=PREFERRED选项的行为。

  • 使用--ssl-mode=REQUIRED,客户端需要加密连接,如果无法建立则失败。

  • 对于--ssl-mode=DISABLED,客户端使用未加密的连接。

  • 使用--ssl-mode=VERIFY_CA--ssl-mode=VERIFY_IDENTITY,客户端需要加密连接,并且还针对服务器 CA 证书和(使用 VERIFY_IDENTITY)针对其证书中的服务器主机名执行验证。

重要的

如果其他默认设置未更改, --ssl-mode=PREFERRED则默认设置 会生成加密连接。但是,为了帮助防止复杂的中间人攻击,客户端验证服务器的身份很重要。这些设置 是比默认设置更好的选择--ssl-mode=VERIFY_CA--ssl-mode=VERIFY_IDENTITY 有助于防止此类攻击。VERIFY_CA使客户端检查服务器的证书是否有效。 VERIFY_IDENTITY使客户端检查服务器证书是否有效,并使客户端检查客户端使用的主机名是否与服务器证书中的身份匹配。要实施这些设置之一,您必须首先确保服务器的 CA 证书对您环境中使用它的所有客户端可靠可用,否则将导致可用性问题。因此,它们不是默认设置。

require_secure_transport如果在服务器端启用系统变量导致服务器需要加密连接, 则尝试建立未加密的连接会失败 。请参阅 将加密连接配置为强制性的。

客户端的以下选项标识客户端在与服务器建立加密连接时使用的证书和密钥文件。它们类似于服务器端使用的 ssl_cassl_certssl_key系统变量,但 标识客户端公钥--ssl-cert--ssl-key私钥:

  • --ssl-ca:证书颁发机构 (CA) 证书文件的路径名。如果使用此选项,则必须指定服务器使用的相同证书。(--ssl-capath类似但指定了 CA 证书文件目录的路径名。)

  • --ssl-cert:客户端公钥证书文件的路径名。

  • --ssl-key: 客户端私钥文件的路径名。

为了相对于默认加密提供的额外安全性,客户端可以提供与服务器使用的证书相匹配的 CA 证书并启用主机名身份验证。通过这种方式,服务器和客户端信任同一个 CA 证书,并且客户端验证它连接到的主机是预期的主机:

笔记

主机名身份验证 VERIFY_IDENTITY不适用于由服务器自动创建或使用 mysql_ssl_rsa_setup手动创建的自签名证书(请参阅 第 6.3.3.1 节,“使用 MySQL 创建 SSL 和 RSA 证书和密钥”)。此类自签名证书不包含服务器名称作为 Common Name 值。

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

MySQL 还为客户端加密连接控制提供了这些选项:

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

假设您要使用没有特殊加密要求的帐户或使用 CREATE USER包含该REQUIRE SSL子句的语句创建的帐户进行连接。假设服务器支持加密连接,客户端可以使用不带 --ssl-mode选项或带显式--ssl-mode=PREFERRED 选项的加密连接:

mysql

或者:

mysql --ssl-mode=PREFERRED

对于使用REQUIRE SSL 子句创建的帐户,如果无法建立加密连接,则连接尝试失败。对于没有特殊加密要求的帐户,如果无法建立加密连接,则尝试回退到未加密的连接。为防止在无法获得加密连接时回退和失败,请像这样连接:

mysql --ssl-mode=REQUIRED

如果账户有更严格的安全要求,则必须指定其他选项来建立加密连接:

  • 对于使用REQUIRE X509 子句创建的帐户,客户必须至少指定 --ssl-cert--ssl-key。此外, 建议使用--ssl-ca(or --ssl-capath) 以便验证服务器提供的公共证书。例如(在一行中输入命令):

    mysql --ssl-ca=ca.pem
          --ssl-cert=client-cert.pem
          --ssl-key=client-key.pem
  • 对于使用REQUIRE ISSUERorREQUIRE SUBJECT 子句创建的帐户,加密要求与 相同 REQUIRE X509,但证书必须分别与帐户定义中指定的问题或主题相匹配。

有关该REQUIRE 子句的其他信息,请参阅第 13.7.1.2 节,“CREATE USER 语句”

MySQL 服务器可以生成客户端证书和密钥文件,客户端可以使用这些文件连接到 MySQL 服务器实例。请参阅 第 6.3.3 节,“创建 SSL 和 RSA 证书和密钥”

重要的

If a client connecting to a MySQL server instance uses an SSL certificate with the extendedKeyUsage extension (an X.509 v3 extension), the extended key usage must include client authentication (clientAuth). If the SSL certificate is only specified for server authentication (serverAuth) and other non-client certificate purposes, certificate verification fails and the client connection to the MySQL server instance fails. There is no extendedKeyUsage extension in SSL certificates generated by MySQL Server (as described in Section 6.3.3.1, “Creating SSL and RSA Certificates and Keys using MySQL”), and SSL certificates created using the openssl按照第 6.3.3.2 节“使用 openssl 创建 SSL 证书和密钥”中的说明执行命令。如果您使用以其他方式创建的自己的客户端证书,请确保任何extendedKeyUsage扩展都包含客户端身份验证。

要防止使用加密并覆盖其他 选项,请使用以下命令调用客户端程序 : --ssl-xxx--ssl-mode=DISABLED

mysql --ssl-mode=DISABLED

要确定当前与服务器的连接是否使用加密,请检查 Ssl_cipher状态变量的会话值。如果该值为空,则连接未加密。否则,连接被加密并且该值指示加密密码。例如:

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

对于mysql客户端,另一种方法是使用STATUSor\s 命令并检查该SSL行:

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

或者:

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

将加密连接配置为强制

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

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

  • 您可以调用单独的客户端程序来要求加密连接,即使服务器允许但不要求加密也是如此。

  • 您可以将单个 MySQL 帐户配置为仅可通过加密连接使用。

要要求客户端使用加密连接进行连接,请启用 require_secure_transport系统变量。例如,将这些行放在服务器 my.cnf文件中:

[mysqld]
require_secure_transport=ON

With require_secure_transport enabled, client connections to the server are required to use some form of secure transport, and the server permits only TCP/IP connections that use SSL, or connections that use a socket file (on Unix) or shared memory (on Windows). The server rejects nonsecure connection attempts, which fail with an ER_SECURE_TRANSPORT_REQUIRED error.

To invoke a client program such that it requires an encrypted connection whether or not the server requires encryption, use an --ssl-mode option value of REQUIRED, VERIFY_CA, or VERIFY_IDENTITY. For example:

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

要将 MySQL 帐户配置为仅可用于加密连接,请在创建帐户REQUIRE的语句中包含一个子句,并 在该子句中指定您需要的加密特征。CREATE USER例如,要要求加密连接和使用有效的 X.509 证书,请使用REQUIRE X509

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

有关该REQUIRE 子句的其他信息,请参阅第 13.7.1.2 节,“CREATE USER 语句”

要修改没有加密要求的现有帐户,请使用该ALTER USER 语句。