3.4. 在 MySQL 服务器上建立 TLS 加密


默认情况下,MySQL 使用未加密的连接。对于安全连接,请在 MySQL 服务器上启用 TLS 支持,并将您的客户端配置为建立加密连接。

3.4.1. 将 CA 证书、服务器证书和私钥放在 MySQL 服务器上

MySQL 服务器上启用 TLS 加密前,请将证书颁发机构(CA)证书、服务器证书和私钥存储在 MySQL 服务器上。

先决条件

  • 以下 Privacy Enhanced Mail(PEM)格式的文件已复制到服务器:

    • 服务器的私钥:server.example.com.key.pem
    • 服务器证书:server.example.com.crt.pem
    • 证书颁发机构(CA)证书:ca.crt.pem

    有关创建私钥和证书签名请求(CSR),以及从 CA 请求证书的详情,请查看您的 CA 文档。

流程

  1. 将 CA 和服务器证书存储在 /etc/pki/tls/certs/ 目录中:

    # mv <path>/server.example.com.crt.pem /etc/pki/tls/certs/
    # mv <path>/ca.crt.pem /etc/pki/tls/certs/
    Copy to Clipboard
  2. 在 CA 和服务器证书上设置权限,以使 MySQL 服务器能够读取文件:

    # chmod 644 /etc/pki/tls/certs/server.example.com.crt.pem /etc/pki/tls/certs/ca.crt.pem
    Copy to Clipboard

    由于证书是建立安全连接前通信的一部分,因此任何客户端都可以在不需要身份验证的情况下检索它们。因此,您不需要对 CA 和服务器证书文件设置严格的权限。

  3. 将服务器的私钥存储在 /etc/pki/tls/private/ 目录中:

    # mv <path>/server.example.com.key.pem /etc/pki/tls/private/
    Copy to Clipboard
  4. 对服务器的私钥设置安全权限:

    # chmod 640 /etc/pki/tls/private/server.example.com.key.pem
    # chgrp mysql /etc/pki/tls/private/server.example.com.key.pem
    Copy to Clipboard

    如果未授权的用户可以访问私钥,则到 MySQL 服务器的连接不再是安全的。

  5. 恢复 SELinux 上下文:

    # restorecon -Rv /etc/pki/tls/
    Copy to Clipboard

3.4.2. 在 MySQL 服务器上配置 TLS

要提高安全性,请在 MySQL 服务器上启用 TLS 支持。因此,客户端可以使用 TLS 加密与服务器传输数据。

先决条件

  • 您已安装了 MySQL 服务器。
  • mysqld 服务正在运行。
  • 服务器上存在 Privacy Enhanced Mail(PEM)格式的以下文件,并可由 mysql 用户读取:

    • 服务器的私钥:/etc/pki/tls/private/server.example.com.key.pem
    • 服务器证书:/etc/pki/tls/certs/server.example.com.crt.pem
    • 证书颁发机构(CA)证书 /etc/pki/tls/certs/ca.crt.pem
  • 主题可识别名称(DN)或服务器证书中的主题备用名称(SAN)字段与服务器的主机名相匹配。

流程

  1. 创建 /etc/my.cnf.d/mysql-server-tls.cnf 文件:

    1. 添加以下内容来配置到私钥、服务器和 CA 证书的路径:

      [mysqld]
      ssl_key = /etc/pki/tls/private/server.example.com.key.pem
      ssl_cert = /etc/pki/tls/certs/server.example.com.crt.pem
      ssl_ca = /etc/pki/tls/certs/ca.crt.pem
      Copy to Clipboard
    2. 如果您有证书撤销列表(CRL),请将 MySQL 服务器配置为使用它:

      ssl_crl = /etc/pki/tls/certs/example.crl.pem
      Copy to Clipboard
    3. 可选:拒绝未加密的连接尝试。要启用此功能,请附加:

      require_secure_transport = on
      Copy to Clipboard
    4. 可选:设置服务器应支持的 TLS 版本。例如,要只支持 TLS 1.3,请附加:

      tls_version = TLSv1.3
      Copy to Clipboard

      默认情况下,服务器支持 TLS 1.2 和 TLS 1.3。

  2. 重启 mysqld 服务:

    # systemctl restart mysqld.service
    Copy to Clipboard

验证

要简化故障排除,请在将本地客户端配置为使用 TLS 加密前在 MySQL 服务器上执行以下步骤:

  1. 验证 MySQL 现在是否启用了 TLS 加密:

    # mysql -u root -p -h <MySQL_server_hostname> -e "SHOW session status LIKE 'Ssl_cipher';"
    +---------------+------------------------+
    | Variable_name | Value                  |
    +---------------+------------------------+
    | Ssl_cipher    | TLS_AES_256_GCM_SHA384 |
    +---------------+------------------------+
    Copy to Clipboard
  2. 如果您将 MySQL 服务器配置为只支持特定的 TLS 版本,请显示 tls_version 变量:

    # mysql -u root -p -e "SHOW GLOBAL VARIABLES LIKE 'tls_version';"
    +---------------+---------+
    | Variable_name | Value   |
    +---------------+---------+
    | tls_version   | TLSv1.3 |
    +---------------+---------+
    Copy to Clipboard
  3. 验证服务器是否使用正确的 CA 证书、服务器证书和私钥文件:

    # mysql -u root -e "SHOW GLOBAL VARIABLES WHERE Variable_name REGEXP '^ssl_ca|^ssl_cert|^ssl_key';"
    +-----------------+-------------------------------------------------+
    | Variable_name   | Value                                           |
    +-----------------+-------------------------------------------------+
    | ssl_ca          | /etc/pki/tls/certs/ca.crt.pem                   |
    | ssl_capath      |                                                 |
    | ssl_cert        | /etc/pki/tls/certs/server.example.com.crt.pem   |
    | ssl_key         | /etc/pki/tls/private/server.example.com.key.pem |
    +-----------------+-------------------------------------------------+
    Copy to Clipboard

3.4.3. 对特定的用户帐户需要 TLS 加密连接

可以访问敏感数据的用户应始终使用 TLS 加密连接,以避免通过网络发送未加密的数据。

如果您无法在服务器上配置所有连接都需要安全传输(require_secure_transport = on),请将单个用户帐户配置为需要 TLS 加密。

先决条件

  • MySQL 服务器启用了 TLS 支持。
  • 您配置为需要安全传输的用户已存在。
  • CA 证书存储在客户端上。

流程

  1. 以管理用户身份连接到 MySQL 服务器:

    # mysql -u root -p -h server.example.com
    Copy to Clipboard

    如果您的管理用户没有远程访问服务器的权限,请在 MySQL 服务器上执行命令并连接到 localhost

  2. 使用 REQUIRE SSL 子句强制用户必须使用 TLS 加密连接进行连接:

    MySQL [(none)]> ALTER USER 'example'@'%' REQUIRE SSL;
    Copy to Clipboard

验证

  1. 使用 TLS 加密,以 example 用户身份连接到服务器:

    # mysql -u example -p -h server.example.com
    ...
    MySQL [(none)]>
    Copy to Clipboard

    如果没有显示错误,且您可以访问交互式 MySQL 控制台,则与 TLS 的连接成功。

    默认情况下,如果服务器提供,客户端会自动使用 TLS 加密。因此,--ssl-ca=ca.crt.pem--ssl-mode=VERIFY_IDENTITY 选项不是必需的,但提高了安全性,因为使用这些选项,客户端可以验证服务器的身份。

  2. 尝试以禁用 TLS 的 example 用户身份进行连接:

    # mysql -u example -p -h server.example.com --ssl-mode=DISABLED
    ERROR 1045 (28000): Access denied for user 'example'@'server.example.com' (using password: YES)
    Copy to Clipboard

    服务器拒绝登录尝试,因为此用户需要 TLS,但禁用了(--ssl-mode=DISABLED)。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat