有几个配置参数可用于指示是否使用加密连接,以及指定适当的证书和密钥文件。本节提供了配置加密连接的服务器和客户端的一般指导:
加密连接也可以在其他上下文中使用,详见以下附加部分:
在源复制服务器和复制复制服务器之间。看到第17.3.1节“设置复制以使用加密连接”.
组复制服务器之间。看到第18.6.2节,“使用安全套接字层(SSL)保护组通信连接”.
通过基于MySQL C API的客户端程序。看到支持加密连接.
有关创建所需证书和密钥文件的说明可在第6.3.3节“创建SSL和RSA证书和密钥”.
在服务器端——ssl
选项指定服务器允许但不要求加密连接。默认情况下该选项是启用的,因此不需要显式指定它。
若要要求客户端使用加密连接进行连接,请启用require_secure_transport
系统变量。看到配置加密连接为必选项.
服务器端的这些系统变量指定了当允许客户端建立加密连接时服务器使用的证书和密钥文件:
ssl_ca
: CA证书文件的路径名称。(ssl_capath
类似,但指定CA证书文件目录的路径名称。)ssl_cert
:服务器公钥证书文件的路径名称。可以将该证书发送到客户机,并根据它所拥有的CA证书进行身份验证。ssl_key
:服务器私钥文件的路径名称。
例如,要启用加密连接的服务器,请使用my.cnf
文件,根据需要更改文件名:
(mysqld) ssl_ca = ca。pem ssl_cert = server-cert。pem ssl_key =服务器密钥。pem
若要指定要求客户端使用加密连接,请启用require_secure_transport
系统变量:
(mysqld) ssl_ca = ca。pem ssl_cert = server-cert。pem ssl_key =服务器密钥。pem require_secure_transport =对
每个证书和密钥系统变量以PEM格式命名一个文件。您是否需要创建所需的证书和密钥文件,请参见第6.3.3节“创建SSL和RSA证书和密钥”.使用OpenSSL编译的MySQL服务器可以在启动时自动生成丢失的证书和密钥文件。看到第6.3.3.1节“使用MySQL创建SSL和RSA证书和密钥”.或者,如果您有一个MySQL源发行版,您可以使用演示证书和其中的密钥文件来测试您的设置mysql-test / std_data
目录中。
服务器自动发现证书和密钥文件。如果没有给出除。以外的显式加密连接选项——ssl
(可能还有ssl_cipher
)来配置加密连接,服务器会尝试在启动时自动启用加密连接支持:
如果服务器发现有效的证书和密钥文件命名为
ca.pem
,server-cert.pem
,server-key.pem
在data目录中,它支持客户端加密连接。(文件不必是自动生成的;重要的是它们有这些名称并且是有效的。)如果服务器在数据目录中没有找到有效的证书和密钥文件,它将继续执行,但不支持加密连接。
如果服务器自动启用加密连接支持,它将向错误日志写入一个注释。如果服务器发现CA证书是自签名的,它将向错误日志写入警告。证书是自签名的,如果是由服务器自动创建或手动使用mysql_ssl_rsa_setup.)
MySQL还为服务器端加密连接控制提供了以下系统变量:
ssl_cipher
:用于连接加密的允许密码列表。ssl_crl
:包含证书吊销列表的文件路径名称。(ssl_crlpath
类似,但指定证书撤销列表文件目录的路径名。)tls_version
,tls_ciphersuites
:服务器允许使用哪种加密协议和密码套件进行加密连接;看到第6.3.2节“加密连接TLS协议和密码”.例如,您可以配置tls_version
防止客户端使用不安全的协议。
如果服务器不能从系统变量为服务器端加密连接控制创建有效的TLS上下文,则服务器将在不支持加密连接的情况下执行。
在MySQL 8.0.16之前,tls_
而且xxx
ssl_
配置加密连接支持的系统变量只能在服务器启动时设置。因此,这些系统变量决定了服务器用于所有新连接的TLS上下文。xxx
从MySQL 8.0.16开始,tls_
而且xxx
ssl_
系统变量是动态的,可以在运行时设置,而不仅仅是在启动时。如果改变了xxx
集全球
,新值只适用于服务器重新启动之前。如果改变了设置保存
,新值也会延续到后续的服务器重启中。看到第13.7.6.1节“变量赋值的SET语法”.然而,对这些变量的运行时更改不会立即影响新连接的TLS上下文,这将在本节后面解释。
除了MySQL 8.0.16中支持对TLS上下文相关的系统变量进行运行时更改之外,服务器还支持对用于新连接的实际TLS上下文进行运行时更新。这个功能可能是有用的,例如,避免重新启动一个MySQL服务器,它已经运行了很长时间,以致于它的SSL证书已经过期。
为了创建初始TLS上下文,服务器使用与上下文相关的系统变量在启动时具有的值。为了公开上下文值,服务器还初始化一组相应的状态变量。下表显示了定义TLS上下文的系统变量,以及公开当前活动上下文值的相应状态变量。
从MySQL 8.0.21开始,这些活动的TLS上下文值也作为性能模式中的属性公开tls_channel_status
表,以及任何其他活动TLS上下文的属性。
要在运行时重新配置TLS上下文,请使用以下过程:
将每个与TLS上下文相关的系统变量设置为其新值。
执行
更改实例重新加载TLS
.该语句根据与TLS上下文相关的系统变量的当前值重新配置活动的TLS上下文。它还设置与上下文相关的状态变量,以反映新的活动上下文值。该声明要求CONNECTION_ADMIN
特权。的执行后建立的新连接
更改实例重新加载TLS
使用新的TLS上下文。现有连接不受影响。如果要终止现有连接,请使用杀了
声明。
由于重新配置过程的工作方式不同,每一对系统变量和状态变量的成员可能临时有不同的值:
更改之前的系统变量
更改实例重新加载TLS
不要更改TLS上下文。此时,这些更改对新连接没有影响,相应的与上下文相关的系统和状态变量可能具有不同的值。这使您能够对各个系统变量进行所需的任何更改,然后使用原子地更新活动TLS上下文更改实例重新加载TLS
在所有系统变量更改完成后。后
更改实例重新加载TLS
,对应的系统变量和状态变量值相同。在下一次更改系统变量之前,这一直是正确的。
在某些情况下,更改实例重新加载TLS
它本身就足以重新配置TLS上下文,而不需要更改任何系统变量。假设文件中的证书名为ssl_cert
已经过期。用一个未过期的证书替换现有文件内容并执行就足够了更改实例重新加载TLS
使新的文件内容被读取并用于新的连接。
从MySQL 8.0.21开始,服务器为管理连接接口实现独立的连接加密配置。看到对加密连接的管理接口支持.此外,更改实例重新加载TLS
扩展为为通道
子句,用于指定要为其重新加载TLS上下文的通道(接口)。看到第13.1.5节,“ALTER INSTANCE语句”.没有用于公开管理接口TLS上下文的状态变量,只有Performance Schematls_channel_status
表公开主接口和管理接口的TLS属性。看到第27.12.21.7节“tls_channel_status表”.
更新主接口TLS上下文有以下影响:
更新更改了主连接接口上用于新连接的TLS上下文。
更新还会更改管理接口上用于新连接的TLS上下文,除非为该接口配置了一些非默认的TLS参数值。
更新不会影响其他已启用的服务器插件或组件(如组复制或X插件)使用的TLS上下文:
要将主接口重新配置应用于Group Replication的组通信连接(组通信连接的设置来自服务器的TLS上下文相关的系统变量),您必须执行
停止GROUP_REPLICATION
紧随其后的是开始GROUP_REPLICATION
命令,停止并重新启动组复制。X插件在插件初始化时初始化它的TLS上下文第20.5.3节,“使用X插件加密连接”.此上下文此后不会更改。
默认情况下,重载TLS
动作回滚并出现错误,如果配置值不允许创建新的TLS上下文,则该动作将不起作用。新的连接将继续使用以前的上下文值。如果可选错误时没有回滚
子句时,如果不能创建新上下文,则不会发生回滚。相反,会生成一个警告,并且对应用该语句的接口上的新连接禁用加密。
在连接接口上启用或禁用加密连接的选项仅在启动时生效。例如,——ssl
而且——admin-ssl
选项只在启动时影响主接口和管理接口是否支持加密连接。的操作将忽略这些选项,对的操作没有影响更改实例重新加载TLS
在运行时。例如,你可以用——ssl =了
在主界面禁用加密连接的情况下启动服务器,然后重新配置TLS并执行更改实例重新加载TLS
在运行时启用加密连接。
有关与建立加密连接相关的客户端选项的完整列表,请参见加密连接的命令选项.
默认情况下,如果服务器支持加密连接,MySQL客户端程序会尝试建立加密连接,并通过——ssl-mode
选择:
在没有
——ssl-mode
选项,客户端尝试使用加密连接,如果无法建立加密连接,则退回到未加密连接。这也是带有显式的行为——ssl-mode =球迷们
选择。与
——ssl-mode =要求
,客户端需要加密连接,如果无法建立连接则失败。与
——ssl-mode =禁用
,客户端使用未加密连接。与
——ssl-mode = VERIFY_CA
或——ssl-mode = VERIFY_IDENTITY
,客户端需要加密连接,并对服务器CA证书执行验证VERIFY_IDENTITY
)对应其证书中的服务器主机名。
,则建立未加密连接的尝试失败require_secure_transport
在服务器端启用系统变量,导致服务器需要加密连接。看到配置加密连接为必选项.
客户端上的下列选项标识客户端在建立到服务器的加密连接时使用的证书和密钥文件。它们类似于ssl_ca
,ssl_cert
,ssl_key
服务器端使用的系统变量,但是——ssl-cert
而且——ssl密钥
识别客户端公钥和私钥:
——ssl-ca
: CA证书文件的路径名称。如果使用此选项,则必须指定服务器使用的相同证书。(——ssl-capath
类似,但指定CA证书文件目录的路径名称。)——ssl-cert
:客户端公钥证书文件的路径名称。——ssl密钥
:客户端私钥文件的路径名称。
对于相对于默认加密提供的额外安全性,客户端可以提供与服务器使用的证书匹配的CA证书,并启用主机名身份验证。通过这种方式,服务器和客户端将它们的信任放在同一个CA证书中,客户端验证它连接到的主机是否为预期的主机:
要指定CA证书,请使用
——ssl-ca
(或——ssl-capath
),并指定——ssl-mode = VERIFY_CA
.要启用主机名身份验证,请使用
——ssl-mode = VERIFY_IDENTITY
而不是——ssl-mode = VERIFY_CA
.
主机名身份验证VERIFY_IDENTITY
不能使用由服务器自动创建或手动创建的自签名证书mysql_ssl_rsa_setup(见第6.3.3.1节“使用MySQL创建SSL和RSA证书和密钥”).这种自签名证书不包含作为Common name值的服务器名。
在MySQL 8.0.12之前,主机名身份验证也不能用于使用通配符指定Common name的证书,因为该名称是与服务器名称一字不差地比较的。
MySQL还为客户端加密连接控制提供了以下选项:
——ssl cipher
:用于连接加密的允许密码列表。——ssl-crl
:包含证书吊销列表的文件路径名称。(——ssl-crlpath
类似,但指定证书撤销列表文件目录的路径名。)——tls版本
,——tls-ciphersuites
:允许使用的加密协议及密码套件;看到第6.3.2节“加密连接TLS协议和密码”.
根据客户端使用的MySQL帐户的加密要求,客户端可能需要指定某些选项来使用加密连接到MySQL服务器。
假设您希望使用一个没有特殊加密要求的帐户进行连接,或者使用创建用户
声明中包含需要SSL
条款。假设服务器支持加密连接,客户机可以使用加密连接——ssl-mode
选项或带有显式的——ssl-mode =球迷们
选择:
mysql
或者:
mysql——ssl-mode =优先
创建的帐户需要SSL
子句,如果无法建立加密连接,则连接尝试失败。对于没有特殊加密要求的帐户,如果无法建立加密连接,则尝试退回到未加密连接。为了防止回退并在无法获得加密连接时失败,请像这样连接:
mysql——ssl-mode =
如果帐户有更严格的安全要求,则必须指定其他选项以建立加密连接:
创建的帐户
需要X509
子句,客户端必须至少指定——ssl-cert
而且——ssl密钥
.此外,——ssl-ca
(或——ssl-capath
),以便验证服务器提供的公共证书。例如(在单行中输入命令):mysql——ssl-ca = ca。pem - ssl-cert = client-cert。pem - ssl密钥= client-key.pem
创建的帐户
要求发行人
或要求主题
子句时,加密要求与for相同需要X509
,但证书必须分别与帐户定义中指定的问题或主题相匹配。
有关的更多信息需要
条款,请参阅第13.7.1.3节,“CREATE USER语句”.
防止使用加密和覆盖其他——ssl
选项,调用客户机程序xxx
——ssl-mode =禁用
:
mysql——ssl-mode =禁用
文件的会话值,以确定当前与服务器的连接是否使用加密Ssl_cipher
状态变量。如果该值为空,则表示未加密连接。否则表示加密连接,取值为加密密码。例如:
显示会话状态为Ssl_cipher;+---------------+---------------------------+ | Variable_name |值 | +---------------+---------------------------+ | Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 | +---------------+---------------------------+
为mysql客户端,另一种选择是使用状态
或\ s
命令并检查SSL
线:
mysql > \ s…SSL:未使用…
或者:
mysql > \ s…SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256…
对于某些MySQL部署来说,使用加密连接可能不仅是必要的,而且是必须的(例如,为了满足法规要求)。本节讨论使您能够做到这一点的配置设置。以下是控制级别:
您可以将服务器配置为要求客户端使用加密连接进行连接。
您可以调用各个客户机程序来要求加密连接,即使服务器允许但不要求加密。
您可以将单个MySQL帐户配置为只能在加密连接上使用。
若要要求客户端使用加密连接进行连接,请启用require_secure_transport
系统变量。例如,将这些行放在服务器中my.cnf
文件:
(mysqld) require_secure_transport =
或者,要在运行时设置并保存该值,使用以下语句:
设置保存require_secure_transport =;
设置保存
为正在运行的MySQL实例设置一个值。它还保存该值,使其可用于后续的服务器重启。看到第13.7.6.1节“变量赋值的SET语法”.
与require_secure_transport
如果启用了,则客户机到服务器的连接需要使用某种形式的安全传输,并且服务器只允许使用SSL的TCP/IP连接,或者使用套接字文件(在Unix上)或共享内存(在Windows上)的连接。服务器拒绝不安全的连接尝试ER_SECURE_TRANSPORT_REQUIRED
错误。
若要调用客户端程序,使其需要加密连接,无论服务器是否需要加密,请使用——ssl-mode
期权的价值要求
,VERIFY_CA
,或VERIFY_IDENTITY
.例如:
mysql——ssl-mode=REQUIRED mysqldump——ssl-mode=VERIFY_CA mysqladmin——ssl-mode=VERIFY_IDENTITY
要将MySQL帐户配置为只能在加密连接上使用,需要包含需要
条款的创建用户
语句,创建帐户,并在该子句中指定所需的加密特征。例如,要要求加密连接并使用有效的X.509证书,请使用需要X509
:
CREATE USER 'jeffrey'@'localhost'
有关的更多信息需要
条款,请参阅第13.7.1.3节,“CREATE USER语句”.
若要修改没有加密要求的现有帐户,请使用改变用户
声明。