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