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

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

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

  • 用户可以手动调用mysql_ssl_rsa_setupUtil。

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

Important

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

自动生成 SSL 和 RSA 文件

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

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

在启动时,如果满足以下所有条件,则服务器会自动在数据目录中生成 RSA 私钥/公钥对文件:启用了sha256_password_auto_generate_rsa_keys系统变量;未指定 RSA 选项;数据目录中缺少 RSA 文件。这些密钥对文件通过sha256_password插件认证的帐户,可以通过未加密的连接使用 RSA 使用安全的密码交换;参见第 6.4.1.5 节“ SHA-256 可插拔身份验证”

  • 服务器在数据目录中检查具有以下名称的 RSA 文件:
private_key.pem      Private member of private/public key pair
public_key.pem       Public member of private/public key pair
使用 mysql_ssl_rsa_setup 手动生成 SSL 和 RSA 文件

MySQL 发行版包含mysql_ssl_rsa_setupUtil,可以手动调用该 Util 以生成 SSL 和 RSA 文件。该 Util 包含在所有 MySQL 发行版中,但是它确实要求 openssl 命令可用。有关使用说明,请参见第 4.4.5 节“ mysql_ssl_rsa_setup-创建 SSL/RSA 文件”

SSL 和 RSA 文件 Feature

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

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

  • SSL CA 证书是自签名的。

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

  • SSL 证书使用以下通用名称(CN)值以及相应的证书类型(CA,服务器,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

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

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

  • 由服务器或mysql_ssl_rsa_setup创建的 SSL 文件从生成之日起有效期为十年。

  • RSA 文件不会过期。

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

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

  • 在 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 |
+-----------------------+--------------------------+