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

6.3.1 配置 MySQL 使用加密连接

要启用加密连接,您的 MySQL 发行版必须构建有 SSL 支持,如 第 2.9.6 节“配置 SSL 库支持”中所述。此外,还有几个配置参数可用于指示是否使用加密连接,以及指定适当的证书和密钥文件。本节提供有关为加密连接配置服务器和客户端的一般指导:

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

笔记

如果服务器是针对 OpenSSL 编译的,如果客户端库是使用 yaSSL 编译的,则 MySQL 5.6 版本早于 5.6.17 的客户端无法使用加密连接连接到服务器。使用使用相同 SSL 包编译的客户端和服务器,或者升级到针对 MySQL 5.6.17 或更高版本的客户端库版本编译的客户端。

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

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

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

  • 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

每个证书和密钥系统变量以 PEM 格式命名一个文件。如果您有 MySQL 源代码分发版,则可以使用其mysql-test/std_data目录中的演示证书和密钥文件来测试您的设置。

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

  • ssl_cipher:用于连接加密的允许密码列表。

  • ssl_crl:包含证书吊销列表的文件的路径名。(ssl_crlpath类似但指定了证书吊销列表文件目录的路径名。)

加密连接的客户端配置

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

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

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

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

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

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

重要的

--ssl-mode=REQUIRED产生加密连接。但是,为了帮助防止复杂的中间人攻击,客户端验证服务器的身份也很重要。添加 --ssl-verify-server-cert 选项可以实现这一点。要实施该附加选项,您必须首先确保服务器的 CA 证书对您环境中使用它的所有客户端可靠可用,否则将导致可用性问题。

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

假设您要使用没有特殊加密要求的帐户或使用 GRANT包含该 REQUIRE SSL子句的语句创建的帐户进行连接。作为一组推荐的加密连接选项,至少使用 ssl_certssl_key系统变量集启动服务器,并使用 --ssl-ca(或 --ssl-capath)选项调用客户端。客户端可以像这样使用加密连接:

mysql --ssl-ca=ca.pem

要要求还指定客户端证书,请使用REQUIRE X509子句创建帐户。然后客户端还必须指定正确的客户端密钥和证书文件,否则服务器将拒绝连接(在单行中输入命令):

mysql --ssl-ca=ca.pem
      --ssl-cert=client-cert.pem
      --ssl-key=client-key.pem

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

要防止使用加密并覆盖其他 选项,请使用或同义词 ( , )调用客户端程序 : --ssl-xxx--ssl=0--skip-ssl--disable-ssl

mysql --ssl=0

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

mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
+---------------+--------------------+
| Variable_name | Value              |
+---------------+--------------------+
| Ssl_cipher    | DHE-RSA-AES256-SHA |
+---------------+--------------------+

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

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

或者:

mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES256-SHA
...