配置MySQL以使用加密连接
加密连接的服务器端启动配置
在服务器端,该--ssl
选项指定服务器允许但不要求加密连接。默认情况下启用此选项,因此无需明确指定。
要要求客户端使用加密连接进行连接,请启用require_secure_transport
系统变量。请参阅将加密连接配置为强制性。
服务器端的这些选项指定允许客户端建立加密连接时服务器使用的证书和密钥文件:
--ssl-c
:证书颁发机构(CA)证书文件的路径名。(--ssl-capath
类似,但指定CA证书文件目录的路径名。)--ssl-cert
:服务器公钥证书文件的路径名。该证书可以发送到客户端,并根据其拥有的CA证书进行身份验证。--ssl-key
:服务器私钥文件的路径名。
例如,要为服务器启用加密连接,请在my.cnf
文件中以以下几行启动它,并根据需要更改文件名:
[mysqld] ssl-c =ca.pem ssl-cert=server-cert.pem ssl-key=server-key.pem
要另外指定要求客户端使用加密连接,请启用require_secure_transport
系统变量:
[mysqld] ssl-c =ca.pem ssl-cert=server-cert.pem ssl-key=server-key.pem require_secure_transport=ON
每个证书和密钥选项均以PEM格式命名文件。如果需要创建所需的证书和密钥文件,请参见“创建SSL和RSA证书和密钥”。使用OpenSSL编译的MySQL服务器可以在启动时自动生成丢失的证书和密钥文件。请参见“创建SSL和RSA证书和密钥”。另外,如果您有MySQL源代码发行版,则可以使用演示证书和mysql-test/std_dat
目录中的密钥文件来测试设置。
服务器执行证书和密钥文件自动发现。如果--ssl
已启用(可能与一起启用--ssl-cipher
),并且未提供其他选项来显式配置加密连接,则服务器尝试在启动时自动启用加密连接支持:--ssl-xxx
- 如果服务器发现有效的证书和命名的密钥文件
ca.pem
,server-cert.pem
以及server-key.pem
在数据目录中,它能够通过客户端加密的连接支持。(不必自动生成文件;重要的是它们具有这些名称且有效。) - 如果服务器在数据目录中找不到有效的证书和密钥文件,它将继续执行,但不支持加密连接。
如果服务器自动启用加密连接支持,它将在错误日志中写入注释。如果服务器发现CA证书是自签名的,则它将警告写入错误日志。(如果证书是由服务器自动创建的,或者是使用mysql_ssl_rsa_setup手动创建的,则证书是自签名的。)
MySQL还为服务器端SSL控制提供了以下选项:
--ssl-cipher
:用于连接加密的允许密码列表。--ssl-crl
:包含证书吊销列表的文件的路径名。(--ssl-crlpath
类似,但指定证书吊销列表文件目录的路径名。)
值选项设置相应的系统变量的值(,,,等等)。--ssl-xxx
ssl_c
ssl_cert
ssl_key
要明确指定服务器允许进行加密连接的加密协议和密码套件,请使用tls_version
和tls_ciphersuites
系统变量;请参见“加密的连接TLS协议和密码”。例如,您可以设置tls_version
为阻止客户端使用安全性较低的协议。
加密连接的服务器端运行时配置
某些与加密相关的系统变量可以在运行时设置:require_secure_transport
和,(从MySQL 8.0.16开始)tls_version
和tls_ciphersuites
。如果使用进行更改SET GLOBAL
,则新值将应用于更改之后建立的连接,并且仅在服务器重启之前适用。如果使用更改SET PERSIST
,则新值还将应用于随后的服务器重新启动。请参见“变量分配的SET语法”。
另外,从MySQL 8.0.16开始,服务器用于新连接的SSL上下文可以在运行时重新配置。例如,此功能可能很有用,可避免重启已经运行了很长时间以至于其SSL证书已过期的MySQL服务器。
服务器从启动时上下文相关的系统变量具有的值创建初始SSL上下文。它还会初始化一组与上下文相关的状态变量,以指示上下文中使用的值。下表显示了定义SSL上下文的系统变量以及指示当前活动上下文值的相应状态变量。
表6.11与服务器SSL上下文相关的对应系统和状态变量
系统变量名称 | 状态变量名称 |
---|---|
ssl_c | Current_tls_c |
ssl_capath | Current_tls_capath |
ssl_cert | Current_tls_cert |
ssl_cipher | Current_tls_cipher |
ssl_crl | Current_tls_crl |
ssl_crlpath | Current_tls_crlpath |
ssl_key | Current_tls_key |
tls_ciphersuites | Current_tls_ciphersuites |
tls_version | Current_tls_version |
要在运行时重新配置SSL上下文,请使用以下过程:
- 将任何与SSL上下文相关的系统变量设置为新值。
- 执行
ALTER INSTANCE RELOAD TLS
。该语句根据与SSL上下文相关的系统变量的当前值重新配置活动的SSL上下文。它还设置了上下文相关的状态变量,以反映新的活动上下文值。该语句需要CONNECTION_ADMIN
特权。 ALTER INSTANCE RELOAD TLS
使用新的SSL上下文执行后建立的新连接。现有连接不受影响。如果应终止现有连接,请使用以下KILL
语句。
由于重新配置过程的工作方式,每对系统变量和状态变量的成员可能暂时具有不同的值:
- 之前更改系统变量
ALTER INSTANCE RELOAD TLS
不会更改SSL上下文。此时,这些更改对新连接没有影响,并且相应的上下文相关系统和状态变量可能具有不同的值。这使您可以对系统变量进行任何必要的更改,然后ALTER INSTANCE RELOAD TLS
在对所有系统变量进行更改之后以原子方式更新活动的SSL上下文。 - 之后
ALTER INSTANCE RELOAD TLS
,相应的系统变量和状态变量具有相同的值。在下一次更改系统变量之前,情况一直如此。
在某些情况下,ALTER INSTANCE RELOAD TLS
仅需重新配置SSL上下文即可,而无需更改任何系统变量。假设由命名的文件中的证书ssl_cert
已过期。用未过期的证书替换现有文件内容并执行ALTER INSTANCE RELOAD TLS
以使新文件内容被读取并用于新连接就足够了。
默认情况下,RELOAD TLS
如果配置值不允许创建新的SSL上下文,则该操作将以错误回滚,并且不起作用。先前的上下文值继续用于新连接。
如果NO ROLLBACK ON ERROR
给出了可选子句,并且无法创建新的上下文,则不会发生回滚。而是会生成警告,并为新连接禁用SSL。
服务器端--ssl
选项仅在服务器启动时才影响服务器是否接受SSL连接。被忽略,并且对的操作没有影响ALTER INSTANCE RELOAD TLS
。例如,您可以用来--ssl=0
在禁用SSL连接的情况下启动服务器,然后重新配置SSL并执行ALTER INSTANCE RELOAD TLS
以在运行时启用SSL连接。
ALTER INSTANCE RELOAD TLS
仅更改服务器本身用于新连接的SSL上下文。它不会影响其他启用的服务器插件或组件(例如X插件或组复制)使用的SSL上下文。如果要将重新配置应用于组复制的组通信连接(它们从服务器的SSL上下文相关的系统变量中获取它们的设置),则必须发出,STOP GROUP_REPLICATION
然后START GROUP_REPLICATION
停止并重新启动组复制。
注意在MySQL 8.0.16之前,与SSL上下文相关的系统变量不是动态的。可以在服务器启动时设置它们,但此后不能更改。因此,这些系统变量确定服务器用于所有新连接的SSL上下文值。
客户端的加密连接配置
默认情况下,如果服务器支持加密连接,则MySQL客户端程序会尝试建立加密连接,并通过以下--ssl-mode
选项提供进一步的控制:
- 在没有
--ssl-mode
选项的情况下,客户端尝试使用加密进行连接,如果无法建立加密连接,则会退回到未加密的连接。这也是具有显式--ssl-mode=PREFFERED
选项的行为。 - 使用
--ssl-mode=REQUIRED
,客户端需要加密的连接,如果无法建立连接,则客户端将失败。 - 使用
--ssl-mode=DISABLED
,客户端使用未加密的连接。 - 使用
--ssl-mode=VERIFY_CA
或--ssl-mode=VERIFY_IDENTITY
,客户端需要加密的连接,并且还针对服务器CA证书和(与VERIFY_IDENTITY
)针对其证书中的服务器主机名执行验证。
如果在require_secure_transport
服务器端启用了系统变量以导致服务器要求加密连接,则尝试建立未加密的连接将失败。请参阅将加密连接配置为强制性。
客户端上的以下选项标识在建立到服务器的加密连接时客户端使用的证书和密钥文件。它们类似于在服务器端使用的选项,但--ssl-cert
并--ssl-key
识别客户端公钥和私钥:
--ssl-c
:证书颁发机构(CA)证书文件的路径名。如果使用此选项,则必须指定服务器使用的相同证书。(--ssl-capath
类似,但指定CA证书文件目录的路径名。)--ssl-cert
:客户端公共密钥证书文件的路径名。--ssl-key
:客户端私钥文件的路径名。
为了获得相对于默认加密所提供的安全性更高的安全性,客户端可以提供与服务器使用的证书相匹配的CA证书,并启用主机名身份验证。通过这种方式,服务器和客户端将他们的信任放在相同的CA证书中,并且客户端验证其连接的主机是否是预期的主机:
- 要指定CA证书,请使用
--ssl-c
(或--ssl-capath
),然后指定--ssl-mode=VERIFY_CA
。 - 要同时启用主机名身份验证,请使用
--ssl-mode=VERIFY_IDENTITY
而不是--ssl-mode=VERIFY_CA
。
注意带有的主机名身份验证
VERIFY_IDENTITY
不适用于由服务器自动创建或使用mysql_ssl_rsa_setup手动创建的自签名证书(请参见“创建SSL和RSA证书和密钥”)。这种自签名证书不包含服务器名称作为“通用名称”值。主机名身份验证也不适用于使用通配符指定“公用名”的证书,因为该名会与服务器名进行逐字比较。
MySQL还为客户端SSL控制提供了以下选项:
--ssl-cipher
:用于连接加密的允许密码列表。--ssl-crl
:包含证书吊销列表的文件的路径名。(--ssl-crlpath
类似,但指定证书吊销列表文件目录的路径名。)--tls-version
,--tls-ciphersuites
:允许的加密协议和密码套件;请参见“加密的连接TLS协议和密码”。
根据客户端使用的MySQL帐户的加密要求,可能要求客户端指定某些选项以使用加密连接到MySQL服务器。
假设您要使用没有特殊加密要求或使用CREATE USER
包含该REQUIRE SSL
子句的语句创建的帐户进行连接。假设服务器支持加密连接,则客户端可以使用不带任何--ssl-mode
选项或具有显式--ssl-mode=PREFFERED
选项的加密进行连接:
mysql
要么:
mysql --ssl-mode=PREFERRED
对于使用REQUIRE SSL
子句创建的帐户,如果无法建立加密连接,则连接尝试将失败。对于没有特殊加密要求的帐户,如果无法建立加密连接,则尝试回退到未加密的连接。为防止回退并在无法获得加密连接的情况下失败,请按以下方式进行连接:
mysql --ssl-mode=REQUIRED
如果帐户对安全性有更严格的要求,则必须指定其他选项来建立加密连接:
对于使用
REQUIRE X509
子句创建的帐户,客户必须至少指定--ssl-cert
和--ssl-key
。另外,建议使用--ssl-c
(或--ssl-capath
),以便可以验证服务器提供的公共证书。例如:mysql --ssl-c =ca.pem \ --ssl-cert=client-cert.pem \ --ssl-key=client-key.pem
- 对于使用
REQUIRE ISSUER
or或REQUIRE SUBJECT
子句创建的帐户,加密要求与相同REQUIRE X509
,但是证书必须分别与帐户定义中指定的问题或主题匹配。
有关该REQUIRE
子句的更多信息,请参见“ CREATE USER语句”。
为了防止使用加密并覆盖其他选项,请使用以下命令调用客户端程序:--ssl-xxx
--ssl-mode=DISABLED
mysql --ssl-mode=DISABLED
要确定当前与服务器的连接是否使用加密,请检查Ssl_cipher
状态变量的会话值。如果该值为空,则不加密连接。否则,连接将被加密,并且该值指示加密密码。例如:
mysql>SHOW SESSION STATUS LIKE 'Ssl_cipher'; +--------------- +--------------------------- + | Variable_name | Value | +--------------- +--------------------------- + | Ssl_cipher | DHE -RSA -AES128 -GCM -SHA256 | +--------------- +--------------------------- +
对于mysql客户端,一种替代方法是使用STATUS
or \s
命令并检查以下SSL
行:
mysql> \s ...SSL : Notin use ...
要么:
mysql> \s ...SSL :Cipher in use is DHE-RSA-AES128-GCM-SHA256 ...
将加密连接配置为强制性
对于某些MySQL部署,使用加密连接(例如,满足法规要求)不仅是理想的,而且是强制性的。本节讨论使您能够执行此操作的配置设置。这些控制级别可用:
- 您可以配置服务器以要求客户端使用加密连接进行连接。
- 即使服务器允许但不需要加密,也可以调用各个客户端程序以要求加密连接。
- 您可以将单个MySQL帐户配置为仅在加密连接上可用。
要要求客户端使用加密连接进行连接,请启用require_secure_transport
系统变量。例如,将这些行放在服务器my.cnf
文件中:
[mysqld] require_secure_transport=ON
或者,要在运行时设置并保留该值,请使用以下语句:
SET PERSIST require_secure_transport=ON ;
SET PERSIST
设置正在运行的MySQL实例的值。它还保存该值,使该值可用于随后的服务器重新启动。请参见“变量分配的SET语法”。
与require_secure_transport
启用,到服务器的客户端连接都需要使用某种形式的安全传输,而服务器只允许TCP / IP连接,使用SSL,或使用一个套接字文件(在Unix)连接或共享内存(在Windows上)。服务器拒绝不安全的连接尝试,该尝试失败并显示ER_SECURE_TRANSPORT_REQUIRED
错误。
调用的客户端程序,使得它需要加密的连接的服务器是否需要加密,使用--ssl-mode
的选项值REQUIRED
,VERIFY_CA
或VERIFY_IDENTITY
。例如:
mysql --ssl-mode=REQUIRED mysqldump --ssl-mode=VERIFY_CA mysqladmin --ssl-mode=VERIFY_IDENTITY
要将MySQL帐户配置为仅可用于加密连接,请REQUIRE
在CREATE USER
创建帐户的语句中包括一个子句,在该子句中指定所需的加密特征。例如,要要求加密连接并使用有效的X.509证书,请使用REQUIRE X509
:
CREATE USER 'jeffrey'@'localhost'REQUIRE X509 ;
有关该REQUIRE
子句的更多信息,请参见“ CREATE USER语句”。
要修改没有加密要求的现有帐户,请使用以下ALTER USER
语句。