Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Creating SSL and RSA Certificates and Keys using MySQL

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

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

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

  • 用户可以手动调用 mysql_ssl_rsa_setup 实用程序(已弃用)。

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

Important

服务器自动生成和 mysql_ssl_rsa_setup 帮助降低使用 SSL 的门槛,使生成所需文件变得更容易。然而,由这些方法生成的证书是自签名的,这可能不是非常安全的。使用这些文件获得经验后,考虑从注册证书颁发机构获取证书/密钥材料。

Important

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

自动SSL和RSA文件生成

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

在启动时,服务器自动在数据目录中生成服务器端和客户端SSL证书和密钥文件,如果auto_generate_certs系统变量启用,未指定除--ssl以外的SSL选项,并且服务器端SSL文件缺失于数据目录中。这些文件启用使用SSL的加密客户端连接;见第8.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.pemserver-key.pem文件的名称来设置相应的系统变量(ssl_cassl_certssl_key)。

在启动时,如果满足以下所有条件,服务器将自动在数据目录中生成RSA私钥/公钥文件:sha256_password_auto_generate_rsa_keyscaching_sha2_password_auto_generate_rsa_keys 系统变量启用;没有指定RSA选项;数据目录中缺少RSA文件。这些密钥文件启用了使用RSA在未加密连接上安全地交换密码的功能,为使用 sha256_passwordcaching_sha2_password 插件认证的账户;见 第 8.4.1.3 节,“SHA-256 可插拔认证”,和 第 8.4.1.2 节,“Caching 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_pathcaching_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 命令可用。有关使用说明,请参阅 第 6.4.3 节,“mysql_ssl_rsa_setup — 创建 SSL/RSA 文件”

SSL 和 RSA 文件特征

由服务器或使用 mysql_ssl_rsa_setup 自动生成的 SSL 和 RSA 文件具有以下特征:

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

  • SSL CA 证书是自签名的。

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

  • SSL 证书使用以下 Common Name (CN) 值,带有适当的证书类型 (CA、Server、Client):

    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 文件的序列号对于每个证书/密钥对不同 (CA 为 1,Server 为 2,Client 为 3)。

  • 服务器生成的文件由运行服务器的帐户拥有。使用 mysql_ssl_rsa_setup 生成的文件由调用该程序的用户拥有。可以在支持 chown() 系统调用的系统上更改所有权,如果以 root 身份调用该程序,并使用 --uid 选项指定文件所有者。

  • 在 Unix 和 Unix-like 系统上,证书文件的访问模式为 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 |
+-----------------------+--------------------------+