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

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

加密的连接也可以在以下情况下使用:

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

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

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

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

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

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

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

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

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

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

要另外指定要求 Client 端使用加密连接,请启用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.pemserver-cert.pemserver-key.pem的有效证书和密钥文件,则它将启用 Client 端对加密连接的支持。 (文件不必自动生成;重要的是它们具有这些名称并且是有效的.)

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

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

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

加密连接的 Client 端配置

有关与构建加密连接有关的 Client 端选项的完整列 table,请参见加密连接的命令选项

默认情况下,如果服务器支持加密连接,则 MySQLClient 端程序会尝试构建加密连接,并通过--ssl-mode选项提供进一步的控制:

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

  • 使用--ssl-mode=REQUIRED时,Client 端需要加密连接,如果无法构建连接,则 Client 端将失败。

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

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

如果在服务器端启用了require_secure_transport系统变量以导致服务器要求加密连接,则尝试构建未加密的连接将失败。参见将加密连接配置为强制性

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

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

  • --ssl-cert:Client 端公共密钥证书文件的路径名。

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

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

Note

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

主机名身份验证也不适用于使用通配符指定“公用名”的证书,因为该名会与服务器名进行逐字比较。

MySQL 还为 Client 端 SSL 控制提供以下选项:

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

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

mysql

Or:

mysql --ssl-mode=PREFERRED

对于使用REQUIRE SSL子句创建的帐户,如果无法构建加密连接,则连接尝试将失败。对于没有特殊加密要求的帐户,如果无法构建加密连接,则尝试回退到未加密的连接。为防止回退并在无法获得加密连接的情况下失败,请按以下方式连接:

mysql --ssl-mode=REQUIRED

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

  • 对于使用REQUIRE X509子句创建的帐户,Client 必须至少指定--ssl-cert--ssl-key。另外,建议使用--ssl-ca(或--ssl-capath),以便可以验证服务器提供的公共证书。例如(单行 Importing 命令):
mysql --ssl-ca=ca.pem
      --ssl-cert=client-cert.pem
      --ssl-key=client-key.pem
  • 对于使用REQUIRE ISSUERREQUIRE SUBJECT子句创建的帐户,加密要求与REQUIRE X509相同,但是证书必须分别与帐户定义中指定的问题或主题匹配。

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

为防止使用加密并覆盖其他--ssl-xxx选项,请使用--ssl-mode=DISABLED调用 Client 端程序:

mysql --ssl-mode=DISABLED

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

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

对于mysqlClient 端,替代方法是使用STATUS\s命令并检查SSL行:

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

Or:

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

将加密连接配置为强制性

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

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

  • 即使服务器允许但不需要加密,也可以调用单个 Client 端程序以要求加密连接。

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

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

[mysqld]
require_secure_transport=ON

启用require_secure_transport时,要求与服务器的 Client 端连接使用某种形式的安全传输,并且服务器仅允许使用 SSL 的 TCP/IP 连接或使用套接字文件(在 Unix 上)或共享内存(在 Windows 上)的连接。 。服务器拒绝非安全连接尝试,该尝试失败并显示ER_SECURE_TRANSPORT_REQUIRED错误。

若要调用 Client 端程序,无论服务器是否需要加密,都需要加密连接,请使用--ssl-mode选项值REQUIREDVERIFY_CAVERIFY_IDENTITY。例如:

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

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

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

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

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