8.3.3.1 使用 MySQL 创建 SSL 和 RSA 证书和密钥
MySQL 提供了以下方式来创建使用 SSL 加密连接和安全密码交换的 SSL 证书和密钥文件和 RSA 密钥对文件,如果这些文件丢失:
-
服务器可以在启动时自动生成这些文件,适用于 MySQL 发行版。
服务器自动生成有助于降低使用 SSL 的障碍,但自动生成的证书可能不太安全。使用这些方法后,您考虑从注册证书权威机构获取证书和密钥材料。
如果客户端连接到 MySQL 服务器实例使用带有 extendedKeyUsage 扩展(X.509 v3 扩展)的 SSL 证书,扩展的密钥用途必须包括客户身份验证 (clientAuth)。如果 SSL 证书只用于服务器身份验证 (serverAuth) 和其他非客户证书用途,证书验证失败,客户端连接到 MySQL 服务器实例失败。MySQL 服务器生成的 SSL 证书中没有 extendedKeyUsage 扩展。如果您使用自己创建的客户证书,确保扩展中的密钥用途包括客户身份验证。
使用 OpenSSL 编译的 MySQL 发行版,MySQL 服务器在启动时可以自动生成缺少的 SSL 和 RSA 文件。控制这些文件自动生成的系统变量是 auto_generate_certs、sha256_password_auto_generate_rsa_keys 和 caching_sha2_password_auto_generate_rsa_keys。这些变量默认启用,但不能在运行时设置。
在启动时,服务器如果启用了 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)。
服务器自动创建的SSL和RSA文件具有这些特征:
-
SSL和RSA密钥大小为2048位。
-
SSL CA证书是自签名的。
-
SSL服务器和客户端证书使用CA证书和密钥,使用
sha256WithRSAEncryption签名算法签名。 -
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对于由服务器生成的文件,如果结果CN值超过64个字符,名称中的《
suffix -
SSL 文件的 Country (C)、State or Province (ST)、Organization (O) 和 Organization Unit Name (OU)、email 地址都为空。
-
服务器生成的 SSL 文件有效期为十年,从生成时间开始计算。
-
RSA 文件不失效。
-
SSL 文件每对证书/密钥对有不同的序列号(CA 为 1、Server 为 2、Client 为 3)。
-
服务器自动创建的文件由运行服务器的账户所有权。
-
在 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 |
+-----------------------+--------------------------+