Documentation Home
MySQL 8.0 参考手册  / 第 6 章 安全  / 6.3 使用加密连接  / 6.3.3 创建 SSL 和 RSA 证书和密钥  /  6.3.3.1 使用 MySQL 创建 SSL 和 RSA 证书和密钥

6.3.3.1 使用 MySQL 创建 SSL 和 RSA 证书和密钥

MySQL 提供了这些方法来创建 SSL 证书和密钥文件以及 RSA 密钥对文件,以支持使用 SSL 的加密连接和在未加密的连接上使用 RSA 的安全密码交换,如果这些文件丢失:

  • 服务器可以在启动时为 MySQL 发行版自动生成这些文件。

  • 用户可以手动调用mysql_ssl_rsa_setup 实用程序。

  • 对于某些分发类型,例如 RPM 和 DEB 包, mysql_ssl_rsa_setup调用发生在数据目录初始化期间。在这种情况下,只要openssl命令可用,就不需要使用 OpenSSL 编译 MySQL 发行版。

重要的

服务器自动生成和 mysql_ssl_rsa_setup使生成所需文件变得更容易,从而有助于降低使用 SSL 的障碍。但是,这些方法生成的证书是自签名的,可能不是很安全。在获得使用此类文件的经验后,请考虑从已注册的证书颁发机构获取证书/密钥材料。

重要的

如果连接到 MySQL 服务器实例的客户端使用带有extendedKeyUsage 扩展名(X.509 v3 扩展名)的 SSL 证书,则扩展密钥用法必须包括客户端身份验证 ( clientAuth)。如果指定SSL证书仅用于服务器端认证(serverAuth)等非客户端证书用途,则证书校验失败,客户端连接MySQL服务器实例失败。extendedKeyUsage MySQL 服务器生成的 SSL 证书中没有扩展名。如果您使用以其他方式创建的自己的客户端证书,请确保任何extendedKeyUsage扩展都包含客户端身份验证。

自动生成 SSL 和 RSA 文件

对于使用 OpenSSL 编译的 MySQL 发行版,MySQL 服务器具有在启动时自动生成丢失的 SSL 和 RSA 文件的能力。、 auto_generate_certs和 系统变量控制这些文件sha256_password_auto_generate_rsa_keyscaching_sha2_password_auto_generate_rsa_keys 自动生成。默认情况下启用这些变量。它们可以在启动时启用和检查,但不能在运行时设置。

在启动时,如果启用了系统变量,服务器会自动在数据目录中生成服务器端和客户端 SSL 证书和密钥文件, 除指定auto_generate_certs之外 --ssl没有指定任何 SSL 选项,并且数据中缺少服务器端 SSL 文件目录。这些文件启用使用 SSL 的加密客户端连接;参见 第 6.3.1 节,“配置 MySQL 以使用加密连接”

  1. 服务器使用以下名称检查数据目录中的 SSL 文件:

    ca.pem
    server-cert.pem
    server-key.pem
  2. 如果存在任何这些文件,则服务器不会创建 SSL 文件。否则,它会创建它们以及一些额外的文件:

    ca.pem               Self-signed CA certificate
    ca-key.pem           CA private key
    server-cert.pem      Server certificate
    server-key.pem       Server private key
    client-cert.pem      Client certificate
    client-key.pem       Client private key
  3. 如果服务器自动生成 SSL 文件,它会使用 、 和 文件的名称ca.pemserver-cert.pem设置 server-key.pem相应的系统变量(ssl_cassl_certssl_key)。

在启动时,如果所有这些条件都为真,服务器会自动在数据目录中生成 RSA 私钥/公钥对文件: sha256_password_auto_generate_rsa_keys or caching_sha2_password_auto_generate_rsa_keys 系统变量已启用;没有指定 RSA 选项;数据目录中缺少 RSA 文件。这些密钥对文件允许使用 RSA 在未加密的连接上为由 sha256_passwordcaching_sha2_password插件验证的帐户安全交换密码;请参阅 第 6.4.1.3 节,“SHA-256 可插入身份验证”第 6.4.1.2 节,“缓存 SHA-2 可插入身份验证”

  1. 服务器检查具有以下名称的 RSA 文件的数据目录:

    private_key.pem      Private member of private/public key pair
    public_key.pem       Public member of private/public key pair
  2. 如果存在这些文件中的任何一个,则服务器不会创建 RSA 文件。否则,它会创建它们。

  3. 如果服务器自动生成 RSA 文件,它会使用它们的名称来设置相应的系统变量(sha256_password_private_key_pathsha256_password_public_key_path; caching_sha2_password_private_key_pathcaching_sha2_password_public_key_path)。

使用 mysql_ssl_rsa_setup 手动生成 SSL 和 RSA 文件

MySQL 发行版包括一个 mysql_ssl_rsa_setup实用程序,可以手动调用它来生成 SSL 和 RSA 文件。此实用程序包含在所有 MySQL 发行版中,但它确实需要openssl命令可用。有关使用说明,请参阅第 4.4.3 节,“mysql_ssl_rsa_setup — 创建 SSL/RSA 文件”

SSL 和 RSA 文件特征

由服务器或通过调用mysql_ssl_rsa_setup自动创建的 SSL 和 RSA 文件具有以下特征:

  • SSL 和 RSA 密钥的大小为 2048 位。

  • SSL CA 证书是自签名的。

  • SSL 服务器和客户端证书使用 sha256WithRSAEncryption签名算法使用 CA 证书和密钥进行签名。

  • SSL 证书使用这些通用名称 (CN) 值和适当的证书类型(CA、服务器、客户端):

    ca.pem:         MySQL_Server_suffix_Auto_Generated_CA_Certificate
    server-cert.pm: MySQL_Server_suffix_Auto_Generated_Server_Certificate
    client-cert.pm: MySQL_Server_suffix_Auto_Generated_Client_Certificate

    suffix值基于 MySQL 版本号。对于 mysql_ssl_rsa_setup生成的文件,可以使用该 --suffix 选项明确指定后缀。

    对于服务器生成的文件,如果生成的 CN 值超过 64 个字符, 则省略名称部分。 _suffix

  • SSL 文件的国家 (C)、州或省 (ST)、组织 (O)、组织单位名称 (OU) 和电子邮件地址的值为空。

  • 服务器或mysql_ssl_rsa_setup 创建的 SSL 文件 自生成之日起十年内有效。

  • RSA 文件不会过期。

  • SSL 文件的每个证书/密钥对都有不同的序列号(1 个用于 CA,2 个用于服务器,3 个用于客户端)。

  • 服务器自动创建的文件归运行服务器的帐户所有。使用 mysql_ssl_rsa_setup创建的文件归调用该程序的用户所有。这可以在支持chown()系统调用的系统上更改,如果程序被调用root 并且--uid 提供了指定应该拥有文件的用户的选项。

  • 在 Unix 和类 Unix 系统上,证书文件的文件访问模式为 644(即世界可读),密钥文件为 600(即只能由运行服务器的帐户访问)。

要查看 SSL 证书的内容(例如,检查其有效日期范围),请直接调用 openssl

openssl x509 -text -in ca.pem
openssl x509 -text -in server-cert.pem
openssl x509 -text -in client-cert.pem

也可以使用以下 SQL 语句检查 SSL 证书过期信息:

mysql> SHOW STATUS LIKE 'Ssl_server_not%';
+-----------------------+--------------------------+
| Variable_name         | Value                    |
+-----------------------+--------------------------+
| Ssl_server_not_after  | Apr 28 14:16:39 2027 GMT |
| Ssl_server_not_before | May  1 14:16:39 2017 GMT |
+-----------------------+--------------------------+