(一)OpenSSL与yaSSL
MySQL可以使用OpenSSL或yaSSL进行编译,这两者都基于OpenSSL API实现安全连接:
-
MySQL企业版二进制发行版是使用OpenSSL编译的。使用MySQL企业版的yaSSL是不可能的。
-
MySQL社区版二进制发行版是使用yaSSL编译的。
-
MySQL社区版源码发行版可以使用OpenSSL或yaSSL进行编译(参见 第6.4.2节“构建支持安全连接的MySQL”)
要确定您的服务器是否使用OpenSSL编译,请测试这些变量中是否存在任何变量。例如,如果使用OpenSSL,则此语句返回一行,如果使用yaSSL,则返回空结果:
SHOW STATUS LIKE 'Rsa_public_key';
要检查mysqld服务器是否支持安全连接,请检查have_ssl
系统变量的值 :
mysql> SHOW VARIABLES LIKE 'have_ssl';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_ssl | YES |
+---------------+-------+
如果值为YES
,则服务器支持安全连接。如果值为DISABLED
,则服务器能够支持安全连接,但没有启动适当的 选项以启用安全连接;
(二)安全连接协议和密码
要确定哪个加密协议和密码在加密连接中使用,请使用以下语句来检查Ssl_version
和 Ssl_cipher
状态变量的值:
mysql> SHOW SESSION STATUS LIKE 'Ssl_version';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Ssl_version | TLSv1 |
+---------------+-------+
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
+---------------+---------------------------+
| Variable_name | Value |
+---------------+---------------------------+
| Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 |
+---------------+---------------------------+
如果连接未加密,则两个变量都将为空值。
MySQL支持使用TLS协议的加密连接:
-
当使用OpenSSL 1.0.1或更高版本编译时,MySQL支持TLSv1,TLSv1.1和TLSv1.2协议。
-
当使用捆绑版本的yaSSL进行编译时,MySQL支持TLSv1和TLSv1.1协议。
tls_version
系统变量 的值确定服务器允许使用哪些协议从可用的协议。该 tls_version
值是以逗号分隔的列表,其中包含一个或多个这些协议(不区分大小写):TLSv1,TLSv1.1,TLSv1.2。默认情况下,此变量列出了用于编译MySQL的SSL库支持的所有协议(TLSv1,TLSv1.1,TLSv1.2
对于OpenSSL,TLSv1,TLSv1.1
用于yaSSL)。要确定tls_version
运行时的值,请使用以下语句:
mysql> SHOW GLOBAL VARIABLES LIKE 'tls_version';
+---------------+-----------------------+
| Variable_name | Value |
+---------------+-----------------------+
| tls_version | TLSv1,TLSv1.1,TLSv1.2 |
+---------------+-----------------------+
要更改值 tls_version
,请在服务器启动时进行设置。例如,要禁止使用较不安全的TLSv1协议的连接,请在服务器my.cnf
文件中使用这些行 :
[mysqld]
tls_version=TLSv1.1,TLSv1.2
要更加限制,只允许TLSv1.2连接,这样设置 tls_version
(假设您的服务器使用OpenSSL进行编译,因为yaSSL不支持TLSv1.2):
[mysqld]
tls_version=TLSv1.2
对于客户端程序,该 --tls-version
选项可以指定每个客户机调用允许的TLS协议
(三)使用MySQL创建SSL和RSA证书和密钥
方法一:
MySQL提供了这些方法来创建SSL证书,密钥文件和RSA密钥对文件,以支持使用SSL的安全连接和使用RSA通过未加密的连接进行安全密码交换(如果这些文件丢失):
-
服务器可以在启动时自动生成这些文件,对于使用OpenSSL编译的MySQL发行版。
-
MySQL服务器能够在启动时自动生成缺少的SSL和RSA文件,对于使用OpenSSL编译的MySQL发行版。该
auto_generate_certs
和sha256_password_auto_generate_rsa_keys
系统变量控制自动生成这些文件。两个变量都默认启用。它们可以在启动时启用并被检查,但不能在运行时设置。启动时,如果
在Unix和Unix系统上,证书文件的文件访问模式为644(即全世界可读),密钥文件的文件访问模式为600(即只能由运行服务器的帐户访问)。auto_generate_certs
启用了系统变量,服务器端和客户端SSL证书和密钥文件将自动生成 ,除非--ssl
指定了SSL选项 ,并且数据中缺少服务器端SSL文件目录。这些文件启用使用SSL的安全客户端连接;
-
用户可以 手动调用mysql_ssl_rsa_setup实用程序。
-
MySQL发行版包括可以手动调用以生成SSL和RSA文件的 mysql_ssl_rsa_setup实用程序
-
对于某些分发类型,如RPM包, mysql_ssl_rsa_setup调用发生在数据目录初始化期间。在这种情况下,只要openssl命令可用,MySQL分发就不需要使用OpenSSL进行编译。
-
要查看SSL证书的内容(例如,要检查其有效的日期范围),请直接调用 openssl:
shell> openssl x509 -text -in ca.pem shell> openssl x509 -text -in server-cert.pem shell> 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 2025 GMT | | Ssl_server_not_before | May 1 14:16:39 2015 GMT
方法二
openssl 创建SSL和RSA证书和密钥
示例1:从Unix上的命令行创建SSL文件
以下示例显示了一组用于创建MySQL服务器和客户端证书和密钥文件的命令。您将需要通过openssl 命令响应几个提示。要生成测试文件,可以按Enter键进入所有提示。要生成用于生产的文件,您应该提供非空的响应。
# Create clean environment shell> rm -rf newcerts shell> mkdir newcerts && cd newcerts # Create CA certificate shell> openssl genrsa 2048 > ca-key.pem shell> openssl req -new -x509 -nodes -days 3600 \ -key ca-key.pem -out ca.pem # Create server certificate, remove passphrase, and sign it # server-cert.pem = public key, server-key.pem = private key shell> openssl req -newkey rsa:2048 -days 3600 \ -nodes -keyout server-key.pem -out server-req.pem shell> openssl rsa -in server-key.pem -out server-key.pem shell> openssl x509 -req -in server-req.pem -days 3600 \ -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem # Create client certificate, remove passphrase, and sign it # client-cert.pem = public key, client-key.pem = private key shell> openssl req -newkey rsa:2048 -days 3600 \ -nodes -keyout client-key.pem -out client-req.pem shell> openssl rsa -in client-key.pem -out client-key.pem shell> openssl x509 -req -in client-req.pem -days 3600 \ -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
生成证书后,验证它们:
shell> openssl verify -CAfile ca.pem server-cert.pem client-cert.pem server-cert.pem: OK client-cert.pem: OK
要查看证书的内容(例如,检查证书有效的日期范围),请调用 openssl,如下所示:
shell> openssl x509 -text -in ca.pem shell> openssl x509 -text -in server-cert.pem shell> openssl x509 -text -in client-cert.pem
使用openssl创建RSA密钥
然后设置密钥文件的访问模式。私钥只能由服务器读取,而公钥可以免费分发给客户端用户:
chmod 400 private_key.pem chmod 444 public_key.pem
-
使用openssl创建SSL证书和密钥
-
要创建RSA私钥和公钥对文件,请在登录到用于运行MySQL服务器的系统帐户中运行这些命令,以便该文件由该帐户拥有:
openssl genrsa -out private_key.pem 2048 openssl rsa -in private_key.pem -pubout -out public_key.pem
安全连接的服务器端配置要启动MySQL服务器,以便客户端可以安全地连接,请使用用于标识服务器在建立安全连接时使用的证书和密钥文件的选项:
-
--ssl-ca
标识证书颁发机构(CA)证书。 -
--ssl-cert
标识服务器公钥证书。这可以发送到客户端,并根据其具有的CA证书进行身份验证。 -
--ssl-key
标识服务器私钥。
例如,在
my.cnf
文件中启动具有这些行的服务器, 根据需要更改文件名:[mysqld] ssl-ca=ca.pem ssl-cert=server-cert.pem ssl-key=server-key.pem
每个选项以PEM格式命名文件。如果您有MySQL源代码发行版,则可以使用其
mysql-test/std_data
目录中的演示证书和密钥文件来测试您的设置 。--ssl
默认情况下启用 服务器端选项值-
如果服务器发现有效的证书和密钥文件命名为
ca.pem
,server-cert.pem
并且server-key.pem
在数据目录中,它可以支持客户端的安全连接。(这些文件不需要自动生成;重要的是它们具有指定的名称并且是有效的。) -
如果服务器在数据目录中找不到有效的证书和密钥文件,它将继续执行,但不启用安全连接
安全连接的客户端配置
对于客户端程序,用于安全连接选项类似于那些在服务器端使用,但
--ssl-cert
并--ssl-key
识别客户端公钥和私钥:-
--ssl-ca
标识证书颁发机构(CA)证书。此选项(如果使用)必须指定服务器使用的相同证书。 -
--ssl-cert
标识客户端公钥证书。 -
--ssl-key
标识客户端私钥。
要安全地连接到支持安全连接的MySQL服务器,客户端必须指定的选项取决于客户端使用的MySQL帐户的加密要求。(请参见第13.7.1.2节“CREATE USER语法”中的
REQUIRE
子句的讨论。)假设您想使用不具有特殊加密要求的帐户进行连接,或者使用
CREATE USER
包含该REQUIRE SSL
选项的语句创建 。作为组推荐的安全连接选项,启动服务器,至少--ssl-cert
和--ssl-key
,并与调用客户端--ssl-ca
。客户端可以像这样安全地连接:shell> mysql --ssl-ca=ca.pem
要求还要指定客户端证书,请使用该
REQUIRE X509
选项创建该帐户。然后客户端还必须指定正确的客户端密钥和证书文件,否则服务器将拒绝连接:shell> mysql --ssl-ca=ca.pem \ --ssl-cert=client-cert.pem \ --ssl-key=client-key.pem
为了防止使用加密和覆盖其他 选项,以调用客户端程序 , 或同义词(, ):
--ssl-
xxx
--ssl-mode=DISABLED
--ssl=0
--skip-ssl
--disable-ssl
shell> mysql --ssl-mode=DISABLED
客户端程序在服务器支持安全连接时尝试默认建立安全连接:
-
在没有
--ssl-mode
或--ssl
选项的情况下, 如果无法建立安全连接,客户端将返回到未加密的连接。 -
要求安全连接,如果无法建立连接失败
--ssl-mode=REQUIRED
,请使用--ssl
(或)同义词(--ssl=1
,--enable-ssl
)调用客户端 。 -
使用未加密的连接,调用客户端与
--ssl-mode=DISABLED
,--ssl=0
,或的同义词(--skip-ssl
,--disable-ssl
)。
有关允许的加密协议和密码的信息,请参见 第6.4.3节“安全连接协议和密码”。
客户端可以通过检查
Ssl_cipher
状态变量的值来确定当前与服务器的连接是否使用加密 。如果该值为空,则该连接未加密。否则,连接被加密,该值表示加密密码。例如:mysql> SHOW STATUS LIKE 'Ssl_cipher'; +---------------+--------------------+ | Variable_name | Value | +---------------+--------------------+ | Ssl_cipher | DHE-RSA-AES256-SHA | +---------------+--------------------+
对于mysql客户端,另一种方法是使用
STATUS
or\s
命令并检查SSL
行:mysql> \s ... SSL: Cipher in use is DHE-RSA-AES256-SHA ...
要么:
mysql> \s ... SSL: Not in use
(五) 安全连接的命令选项Table 6.8 Secure-Connection Option Summary
Format Description Introduced --skip-ssl Do not use secure connection --ssl Enable secure connection --ssl-ca Path of file that contains list of trusted SSL CAs --ssl-capath Path of directory that contains trusted SSL CA certificates in PEM format --ssl-cert Path of file that contains X509 certificate in PEM format --ssl-cipher List of permitted ciphers to use for connection encryption --ssl-crl Path of file that contains certificate revocation lists --ssl-crlpath Path of directory that contains certificate revocation list files --ssl-key Path of file that contains X509 key in PEM format --ssl-mode Security state of connection to server 5.7.11 --ssl-verify-server-cert Verify server certificate Common Name value against host name used when connecting to server --tls-version Protocols permitted for secure connections 5.7.10 -
此选项对服务器端和客户端都有不同的影响。
注意客户端
--ssl
选项自MySQL 5.7.11起已被弃用,并在MySQL 8.0中被删除。对于客户端程序,最好使用--ssl-mode
:-
没有显式
--ssl-mode
选项相当于没有明确的--ssl
选项。
服务器端
--ssl
选项不被弃用。对于MySQL服务器,此选项指定服务器允许但不需要安全连接。默认情况下,服务器端启用该选项。
使用OpenSSL编译的MySQL服务器可以在启动时自动生成缺少的证书和密钥文件。请参见 第6.4.6.1节“使用MySQL创建SSL和RSA证书和密钥”。
服务器执行证书和密钥文件自动发现。如果
--ssl
启用(可能还有--ssl-cipher
),并且 没有给出其他选项来显式配置安全连接,服务器将尝试在启动时自动启用对安全连接的支持:--ssl-
xxx
-
如果服务器发现有效的证书和密钥文件命名为
ca.pem
,server-cert.pem
并且server-key.pem
在数据目录中,它可以支持客户端的安全连接。(这些文件不需要自动生成;重要的是它们具有指定的名称并且是有效的。) -
如果服务器在数据目录中找不到有效的证书和密钥文件,它将继续执行,但不启用安全连接。
客户端程序在服务器支持安全连接时,尝试默认建立安全连接。客户端
--ssl
选项的使用方法如下:-
在没有
--ssl
选项的情况下,如果无法建立安全连接,客户端将返回到未加密的连接。 -
要求安全连接,如果无法建立连接失败,请使用
--ssl
或同义词(--ssl=1
,--enable-ssl
)调用客户端 。 -
要使用未加密的连接,请使用
--ssl=0
或同义词(--skip-ssl
,--disable-ssl
)调用客户端 。
如果没有其他 选项,客户端将尝试连接安全。如果服务器配置为支持安全连接,则如果无法建立安全连接,连接尝试将失败。如果服务器未配置为安全连接,客户端将恢复为未加密的连接。
--ssl-
xxx
--ssl
作为选项的建议设置为启用安全连接,至少使用
--ssl-cert
和--ssl-key
在服务器端和--ssl-ca
客户端上。请参见第6.4.4节“配置MySQL以使用安全连接”。--ssl
被其他选项所暗示 ,如这些选项的说明所示。--ssl-
xxx
在
--ssl
以否定的形式选项覆盖其他 选项,并表示加密应该不 使用。为此,请将该选项指定为 同义词(, )。例如,当您调用MySQL客户端程序时,您可能选择文件组中指定的选项在 默认情况下使用安全连接。要使用未加密的连接,请使用命令行调用客户端程序 来覆盖选项文件中的选项。--ssl-
xxx
--ssl=0
--skip-ssl
--disable-ssl
[client]
--ssl=0
要使用MySQL帐户的安全连接,请使用
CREATE USER
至少一个REQUIRE SSL
子句创建该帐户,或者使用ALTER USER
现有帐户添加一个REQUIRE
子句。除非MySQL支持安全连接,并且服务器和客户端已经通过正确的安全连接选项启动,否则该帐户的连接将被拒绝。该
REQUIRE
条款允许其他加密相关选项,可用于执行比更严格的要求REQUIRE SSL
。有关其他详细信息有关哪些选项可以或必须由连接使用使用各种配置的帐户的客户来指定命令REQUIRE
选项,见描述REQUIRE
在 第13.7.1.2,“CREATE USER语法”。 -
PEM格式的文件的路径,其中包含受信任的SSL证书颁发机构的列表。在服务器端,这个选项意味着
--ssl
。如果在建立客户端连接时使用加密,告诉客户端不对服务器证书进行身份验证,请
--ssl-ca
不要 指定--ssl-capath
。服务器仍然根据为客户端帐户建立的任何适用要求来验证客户端,并且仍然使用在服务器启动时指定的任何 值--ssl-ca
或--ssl-capath
选项值。 -
包含PEM格式的受信任SSL证书颁发机构证书的目录的路径。在服务器端,这个选项意味着
--ssl
。如果在建立客户端连接时使用加密,告诉客户端不对服务器证书进行身份验证,请
--ssl-ca
不要 指定--ssl-capath
。服务器仍然根据为客户端帐户建立的任何适用要求来验证客户端,并且仍然使用在服务器启动时指定的任何 值--ssl-ca
或--ssl-capath
选项值。使用OpenSSL编译的MySQL发行版支持该
--ssl-capath
选项(参见 第6.4.1节“OpenSSL与yaSSL”)。使用yaSSL编译的分发并不是因为yaSSL不在任何目录中,并且不遵循链接的证书树。yaSSL要求CA证书树的所有组件都包含在单个CA证书树中,并且文件中的每个证书都具有唯一的SubjectName值。要解决此yaSSL限制,请将包含证书树的各个证书文件连接到一个新文件中,并将该文件指定为该--ssl-ca
选项的值 。 -
用于建立安全连接的PEM格式的SSL证书文件的名称。在服务器端,这个选项意味着
--ssl
。 -
用于连接加密的允许密码列表。如果列表中没有密码被支持,则加密的连接将不起作用。在服务器端,这个选项意味着
--ssl
。为了最大的可移植性,
cipher_list
应该是一个或多个密码的列表,用冒号分隔。这种格式是由OpenSSL和yaSSL所理解的。例子:--ssl-cipher=AES128-SHA --ssl-cipher=DHE-RSA-AES256-SHA:AES128-SHA
OpenSSL支持更灵活的语法来指定密码,如OpenSSL文档 https://www.openssl.org/docs/manmaster/man1/ciphers.html所述。yaSSL没有,所以尝试使用这种扩展语法对使用yaSSL编译的MySQL分发失败。
有关MySQL支持的加密密码的信息,请参见第6.4.3节“安全连接协议和密码”。
-
包含PEM格式的证书撤销列表的文件的路径。在服务器端,这个选项意味着
--ssl
。如果既不给出
--ssl-crl
也不--ssl-crlpath
给出CRL检查,即使CA路径包含证书吊销列表。使用OpenSSL编译的MySQL发行版支持该
--ssl-crl
选项(参见 第6.4.1节“OpenSSL与yaSSL”)。使用yaSSL编译的分发不是因为撤销列表不适用于yaSSL。 -
包含PEM格式的包含证书吊销列表的文件的目录的路径。在服务器端,这个选项意味着
--ssl
。如果既不给出
--ssl-crl
也不--ssl-crlpath
给出CRL检查,即使CA路径包含证书吊销列表。使用OpenSSL编译的MySQL发行版支持该
--ssl-crlpath
选项(参见 第6.4.1节“OpenSSL与yaSSL”)。使用yaSSL编译的分发不是因为撤销列表不适用于yaSSL。 -
用于建立安全连接的PEM格式的SSL密钥文件的名称。在服务器端,这个选项意味着
--ssl
。如果密钥文件受密码保护,程序将提示用户输入密码。必须交互地给出密码; 它不能存储在文件中。如果密码不正确,程序会继续,因为无法读取密钥。
为了更好的安全性,请使用RSA密钥大小为2048位或更多的证书。
-
此选项仅适用于客户端程序,而不适用于服务器。它指定与服务器的连接的安全状态。允许使用以下选项值:
-
PREFERRED
:如果服务器支持安全连接,请建立安全(加密)连接。否则退回到未加密的连接。如果--ssl-mode
未指定,则为默认值 。 -
DISABLED
:建立一个未加密的连接。这就像旧--ssl=0
选项或其同义词(--skip-ssl
,--disable-ssl
)。 -
REQUIRED
:如果服务器支持安全连接,请建立安全连接。如果无法建立安全连接,连接尝试将失败。 -
VERIFY_CA
:LikeREQUIRED
,但另外根据配置的证书颁发机构(CA)证书验证服务器TLS证书。如果找不到有效的匹配CA证书,连接尝试失败。 -
VERIFY_IDENTITY
:LikeVERIFY_CA
,但另外验证服务器证书是否与尝试连接的主机匹配。这就像传统--ssl-verify-server-cert
选项。
使用
--ssl-ca
或--ssl-capath
选项意味着--ssl-mode=VERIFY_CA
,如果--ssl-mode
没有明确设置否则。如果
--ssl-mode
是明确的,使用比其他的值VERIFY_CA
或VERIFY_IDENTITY
使用显式--ssl-ca
或--ssl-capath
选项产生,没有服务器证书验证将进行警告,尽管被指定CA证书的选项。该
--ssl-mode
选项已添加到MySQL 5.7.11中。要使用MySQL帐户的安全连接,请使用
CREATE USER
至少一个REQUIRE SSL
子句创建该帐户,或者使用ALTER USER
现有帐户添加一个REQUIRE
子句。除非MySQL支持安全连接,并且服务器和客户端已经通过正确的安全连接选项启动,否则该帐户的连接将被拒绝。该
REQUIRE
条款允许其他加密相关选项,可用于执行比更严格的要求REQUIRE SSL
。有关其他详细信息有关哪些选项可以或必须由连接使用使用各种配置的帐户的客户来指定命令REQUIRE
选项,见描述REQUIRE
在 第13.7.1.2,“CREATE USER语法”。 -
-
注意
此选项自MySQL 5.7.11起已弃用,并在MySQL 8.0中被删除。优选使用
--ssl-mode=VERIFY_IDENTITY
。此选项仅适用于客户端程序,而不适用于服务器。它使客户端检查服务器发送给客户端的证书中的服务器的公用名称值。客户端根据客户端用于连接到服务器的主机名来验证该名称,如果存在不匹配,则连接将失败。对于加密连接,此选项有助于防止中间人攻击。默认情况下禁用验证。
-
对于客户端程序,客户端允许的协议用于加密连接。该值是包含一个或多个协议名称的逗号分隔列表。可以为此选项命名的协议取决于用于编译MySQL的SSL库。有关详细信息,请参见 第6.4.3节“安全连接协议和密码”。
此选项已添加到MySQL 5.7.10中。
在服务器端,
tls_version
可以使用系统变量。 -
-