首页 > 数据库 > > 6.4 使用加密的连接
参考官方文档:
https://dev.mysql.com/doc/refman/5.7/en/encrypted-connections.html
通过MySQL客户端和服务器之间的未加密连接,有权访问网络的人员可以监视所有流量并检查客户端和服务器之间发送或接收的数据。
当您必须以安全的方式通过网络传输信息时,未加密的连接是不可接受的。 要使任何类型的数据不可读,请使用加密。 加密算法必须包含安全元素以抵御多种已知的攻击,例如更改加密消息的顺序或重放数据
MySQL支持使用TLS(传输层安全性)协议的客户端和服务器之间的加密连接。 TLS有时被称为SSL(安全套接字层),但MySQL实际上并未将SSL协议用于加密连接,因为其加密功能较弱(请参见第6.4.6节“加密连接协议和密码”)。
TLS使用加密算法来确保通过公共网络接收的数据可以被信任。 它具有检测数据更改,丢失或重放的机制。 TLS还包含了使用X509标准提供身份验证的算法。
X509可以识别互联网上的某个人。 基本而言,应该有一个实体称为“证书颁发机构”(或CA),它将电子证书分配给需要它们的任何人。 证书依赖于具有两个加密密钥(公钥和秘密密钥)的非对称加密算法。 证书所有者可以将证书呈现给另一方作为身份证明。 证书由其所有者的公钥组成。 使用该公钥加密的任何数据只能使用由证书所有者持有的相应密钥进行解密。
MySQL可以编译为支持使用OpenSSL或yaSSL的加密连接。 有关这两个软件包的比较,请参见第6.4.4节“OpenSSL与yaSSL”有关每个软件包支持的加密协议和密码的信息,请参见第6.4.6节“加密连接协议和密码”。
默认情况下,如果服务器支持加密连接,则MySQL程序尝试使用加密进行连接,如果无法建立加密连接,则会退回到未加密连接。
MySQL在每个连接的基础上执行加密,并且对给定用户使用加密可以是可选的或强制的。 这使您可以根据各个应用程序的要求选择加密或未加密的连接。 有关如何要求用户使用加密连接的信息,请参见第13.7.1.2节“CREATE USER语法”中关于CREATE USER语句的REQUIRE子句的讨论。 另请参见第5.1.5节“服务器系统变量”中对require_secure_transport系统变量的描述。
被加密的连接可以被用在复制服务器的master和slave之间。
也可以使用SSH连接内的加密连接到MySQL服务器主机。
在MySQL 5.7中对加密连接支持进行了一些改进。 以下时间表总结了这些变化:
对于使用OpenSSL编译的服务器,auto_generate_certs和sha256_password_auto_generate_rsa_keys系统变量可用于在启动时启用SSL / RSA证书和密钥文件的自动生成和自动发现。 对于证书和密钥自动搜索,如果启用--ssl并且未提供其他--ssl-xxx选项来明确配置加密连接,如果它在数据目录会发现必需的证书和密钥文件,则服务器会在启动时自动启用对加密连接的支持。
如果服务器在启动时发现CA证书是自签名的,则会向错误日志写入警告。 (如果服务器自动创建证书,或手动使用mysql_ssl_rsa_setup,则证书是自签名的。)
此更改还会影响基于C客户端库的后续版本的MySQL连接器:连接器/ C,连接器/ C ++和连接器/ ODBC。
6.4.1 配置MYSQL 使用加密的连接
有几个选项可用于指示是否使用加密连接,并指定适当的证书和密钥文件。 本节提供有关为加密连接配置服务器和客户端的一般指导:
加密连接的服务器端配置
在服务器端,--ssl选项指定服务器允许但不需要加密连接。 该选项默认启用。
服务器端的这些选项可识别服务器在允许客户端建立加密连接时使用的证书和密钥文件:
例如,要启用加密连接的服务器,请使用my.cnf文件中的这些行启动它,根据需要更改文件名:
[mysqld]
ssl-ca=ca.pem
ssl-cert=server-cert.pem
ssl-key=server-key.pem
每个选项都以PEM格式命名文件。 如果您需要创建所需的证书和密钥文件,请参见第6.4.3节“创建SSL和RSA证书和密钥”。 或者,如果您拥有MySQL源代码发行版,则可以使用演示证书和密钥文件在其mysql-test/std_data目录中测试您的设置。
使用OpenSSL编译的MySQL服务器可以在启动时自动生成缺少的证书和密钥文件。
服务器执行证书和密钥文件自动发现。 如果未启用--ssl(可能与--ssl-cipher一起)以及其他--ssl-xxx选项未明确配置加密连接,则服务器会尝试在启动时自动启用对加密连接的支持:
如果服务器自动启用对加密连接的支持,则会向错误日志中写入注释。 如果服务器发现CA证书是自签名的,则会向错误日志写入警告。 (如果服务器自动创建证书,或手动使用mysql_ssl_rsa_setup,则证书是自签名的。)
服务器使用任何自动发现和使用的证书和密钥文件的名称来设置相应的系统变量(ssl_ca,ssl_cert,ssl_key)。
为了进一步控制客户端是否必须使用加密进行连接,请使用require_secure_transport系统变量; 请参见第5.1.5节“服务器系统变量”。 要明确指定允许的加密协议,请使用tls_version系统变量; 参见第6.4.6节“加密连接协议和密码”。
为加密连接的客户端配置
默认情况下,如果服务器支持加密连接,则MySQL客户端程序将尝试建立加密连接,并通过--ssl-mode选项提供进一步控制:
客户端上的以下选项标识客户端在建立与服务器的加密连接时使用的证书和密钥文件。 它们与服务器端使用的选项类似,但--ssl-cert和--ssl-key标识客户端的公钥和私钥:
相对于默认加密提供的安全性,客户端可以提供与服务器使用的证书相匹配的CA证书并启用主机名身份验证。 通过这种方式,服务器和客户端将他们的信任置于相同的CA证书中,并且客户端验证其连接的主机是否是预期的主机:
注意:
主机名身份验证不适用于由服务器自动创建的自签名证书,或手动使用mysql_ssl_rsa_setup(请参见第6.4.3.1节“使用MySQL创建SSL和RSA证书和密钥”)。 这些自签名证书不包含作为通用名称值的服务器名称。
根据客户端使用的MySQL帐户的加密要求,可能需要客户端指定某些选项以使用加密连接到支持加密连接的MySQL服务器。
假设您要使用无特殊加密要求的帐户进行连接,或者使用包含REQUIRE SSL选项的CREATE USER语句创建该帐户。 假设服务器支持加密连接,则客户端可以使用不带-ssl-mode选项的加密连接或使用显式--ssl-mode = PREFFERED选项进行连接:
mysql
或:
mysql --ssl-mode=PREFERRED
对于使用REQUIRE SSL的帐户,如果无法建立加密连接,则连接尝试失败。 对于没有特殊加密要求的帐户,如果无法建立加密连接,则尝试回退到未加密连接。 如果无法获得加密连接,要防止回退并失败,请如下连接:
mysql --ssl-mode=REQUIRED
如果帐户有更严格的安全要求,则必须指定其他选项来建立加密连接:
mysql --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
要防止使用加密并覆盖其他--ssl-xxx选项,请使用--ssl-mode = DISABLED调用客户端程序:
mysql --ssl-mode=DISABLED
要明确指定允许的加密协议,请使用--tls-version选项;小号
要确定当前与服务器的连接是否使用加密,请检查Ssl_cipher状态变量的值。 如果该值为空,则连接未加密。 否则,连接将被加密,并且该值指示加密密码。 例如:
mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher'; +---------------+---------------------------+ | Variable_name | Value | +---------------+---------------------------+ | Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 | +---------------+---------------------------+
对于mysql客户端,另一种方法是使用STATUS或\ s命令并检查SSL线路:
mysql> \s
...
SSL: Not in use
...
或:
mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256
...
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3152673/ ,如需转载,请注明出处,否则将追究法律责任。