MySQL 提供了创建 SSL 证书和密钥文件和 RSA 密钥对文件的方法,以支持使用 SSL 的加密连接和使用 RSA 的安全密码交换,如果这些文件不存在:
-
服务器可以在启动时自动生成这些文件,适用于 MySQL 发行版。
-
用户可以手动调用 mysql_ssl_rsa_setup 实用程序(已弃用)。
-
对于某些发行版类型,例如 RPM 和 DEB 包,mysql_ssl_rsa_setup 调用将在数据目录初始化期间发生。在这种情况下,MySQL 发行版不需要使用 OpenSSL 编译,只要 openssl 命令可用。
服务器自动生成和 mysql_ssl_rsa_setup 帮助降低使用 SSL 的门槛,使生成所需文件变得更容易。然而,由这些方法生成的证书是自签名的,这可能不是非常安全的。使用这些文件获得经验后,考虑从注册证书颁发机构获取证书/密钥材料。
如果客户端连接到 MySQL 服务器实例使用带有 extendedKeyUsage
扩展(X.509 v3 扩展)的 SSL 证书,则扩展密钥使用必须包括客户端身份验证 (clientAuth
)。如果 SSL 证书仅指定服务器身份验证 (serverAuth
) 和其他非客户端证书目的,证书验证将失败,客户端连接到 MySQL 服务器实例将失败。 MySQL 服务器生成的 SSL 证书中没有 extendedKeyUsage
扩展。如果您使用其他方式创建的客户端证书,请确保任何 extendedKeyUsage
扩展包括客户端身份验证。
对于使用OpenSSL编译的MySQL发行版,MySQL服务器在启动时具有自动生成缺失的SSL和RSA文件的能力。auto_generate_certs
、sha256_password_auto_generate_rsa_keys
和caching_sha2_password_auto_generate_rsa_keys
系统变量控制自动生成这些文件。这些变量默认启用。它们可以在启动时启用,并在运行时检查但不能设置。
在启动时,服务器自动在数据目录中生成服务器端和客户端SSL证书和密钥文件,如果auto_generate_certs
系统变量启用,未指定除--ssl
以外的SSL选项,并且服务器端SSL文件缺失于数据目录中。这些文件启用使用SSL的加密客户端连接;见第8.3.1节,“配置MySQL以使用加密连接”。
-
服务器检查数据目录中的SSL文件,名称如下:
ca.pem server-cert.pem server-key.pem
-
如果存在任何这些文件,服务器将不创建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
-
如果服务器自动生成SSL文件,它将使用
ca.pem
、server-cert.pem
和server-key.pem
文件的名称来设置相应的系统变量(ssl_ca
、ssl_cert
、ssl_key
)。
在启动时,如果满足以下所有条件,服务器将自动在数据目录中生成RSA私钥/公钥文件:sha256_password_auto_generate_rsa_keys
或 caching_sha2_password_auto_generate_rsa_keys
系统变量启用;没有指定RSA选项;数据目录中缺少RSA文件。这些密钥文件启用了使用RSA在未加密连接上安全地交换密码的功能,为使用 sha256_password
或 caching_sha2_password
插件认证的账户;见 第 8.4.1.3 节,“SHA-256 可插拔认证”,和 第 8.4.1.2 节,“Caching SHA-2 可插拔认证”。
-
服务器检查数据目录中的以下 RSA 文件:
private_key.pem Private member of private/public key pair public_key.pem Public member of private/public key pair
-
如果存在这些文件中的任何一个,服务器将不生成 RSA 文件。否则,它将生成它们。
-
如果服务器自动生成 RSA 文件,它将使用它们的名称设置相应的系统变量 (
sha256_password_private_key_path
和sha256_password_public_key_path
;caching_sha2_password_private_key_path
和caching_sha2_password_public_key_path
)。
MySQL 发行版包括一个 mysql_ssl_rsa_setup 实用程序(已弃用),可以手动调用以生成 SSL 和 RSA 文件。该实用程序与所有 MySQL 发行版一起提供,但它需要 openssl 命令可用。有关使用说明,请参阅 第 6.4.3 节,“mysql_ssl_rsa_setup — 创建 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 |
+-----------------------+--------------------------+