
爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
本文约 2200 字,预计阅读需要 8 分钟。

在搭建某些环境的时候,常常会遇到需要输入 SSL/TLS 相关文件的情况,例如:ssl-ca、ssl-cert、ssl-key 等,在不了解其内在逻辑的情况下,会对这些参数比较陌生。
本文以 MySQL 为例,了解创建安全连接的方式,以点入面了解这些安全方面的知识。
两端被冒充的解决方法是:签名。
Client 连接时提供证书和私钥,Server 端使用 CA 证书对 client 端提供的证书进行验证,确认 Client 端的真实性。Client 端对消息进行 hash 后,由私钥对 hash 值进行签名(加密),将消息和签名一起发送给 Server 端。Server 端使用公钥进行解签名(解密),并对消息进行 hash,将解签名得到的 hash 值和对随机串进行 hash 得到的 hash 值进行对比,以确认 Client 身份。
签名可以确认消息的完整性和验证发送方身份。
Server 端会向 Client 端发送其数字证书,这个证书包含了服务器的相关信息以及由证书颁发机构(CA)签发的签名,用于证明服务器的身份。
mysql.user 表中。mysql.user 表中。mysql.user 表中的结果也不同。mysql.user 表中。caching_sha2_password_digest_rounds 控制。mysql.user 表中的密码哈希进行对比,一致则密码正确,登录成功。通讯信息泄漏的解决方法是:SSL 安全连接。
SSL/TLS 为了生成会话密钥用于安全连接,客户端生成一个随机字符串作为预主密钥,并使用服务器的公钥对其进行加密,客户端将加密后的预主密钥发送给服务器。
服务器使用私钥解密接收到的信息,得到预主密钥。然后,客户端和服务器根据相同的算法和预主密钥独立计算出主密钥。双方根据之前交互的信息协商确定一个具体的加密套件(含对称加密算法、哈希算法等),并使用主密钥衍生出的密钥进行后续通信。
一旦建立了安全连接,所有传输的数据都将使用协商好的对称加密算法和密钥进行加密和解密。
我们只讨论 caching_sha2_password 密码插件生成的用户。
在非安全连接(非 SSL)时,使用 RSA 密钥对进行密码交换。
-- 确认账户不是强制使用 SSL
select user,host,plugin,ssl_type,ssl_cipher,x509_issuer,x509_subject
from mysql.user where user='mgr_user';

ssl_type 字段为空,表示用户不强制使用 SSL
当使用非 SSL 连接时,则需要使用 RSA 密钥进行密码交换,此时需要请求/指定 Server 端的公钥,使用公钥对密码进行加密。

非 SSL 连接
MySQL 5.7 开始,默认编译已经包含了对 SSL 的支持,我们查看下如何使用 SSL 创建安全连接。
-- 8.0.26 之前使用,YES 表示 server 提供 SSL 支持,DISABLED 表示不支持 SSL
show variables where variable_name in('have_openssl','have_ssl');
-- 8.0.26 及之后的版本,mysql_main 通道为 Yes 即可
select * from performance_schema.tls_channel_status where PROPERTY='Enabled';
ssl_type 字段值为 空 时表示不强制 SSL;ssl_type 字段值为 SSL 时表示强制 SSL;ssl_type 字段值为 X509 时表示强制 SSL,且要进行客户端身份验证;select user,host,plugin,ssl_type,ssl_cipher,x509_issuer,x509_subject from mysql.user where user='mgr_user';
当 \s 得到的结果中 SSL 不是 Not in use 时,则表示 SSL 连接。
mysql -uys -pxxxx -h10.186.65.6 -P8038 --ssl-mode=REQUIRED

SSL 连接
skip_ssl,禁用了 SSL;ssl_ca / ssl_cert / ssl_key 异常时(文件不存在、权限异常、内容不准确等),MySQL 开启支持 SSL 会失败(报错会打印到 MySQL 错误日志中);需要校验客户端身份时,需要--ssl-cert 指定客户端证书,--ssl-key 指定客户端私钥:
mysql -uys -pxxxx -h10.186.65.6 -P8038 \
--ssl-cert=~/client_ssl/client-cert.pem \
--ssl-key=~/client_ssl/client-key.pem
MySQL 设置强制用户使用 SSL 安全连接、X509 进行身份验证。
-- 强制用户使用 SSL 安全连接(会校验服务器身份)
alter user xxx require SSL ;
-- 强制用户使用 SSL 安全连接的同时校验客户端身份
alter user xxx require X509 ;
-- 不强制使用 SSL
alter user xxx require none ;
如果证书过期,可以直接替换证书,并重载 TLS 相关配置即可:
alter instance reload tls ;
通过 签名 可以校验通讯双方的身份,以及防止信息被篡改。
通过 RSA 密钥对 或者 SSL 安全链路 的方式实现密码的安全传递。
SSL 还可以用于创建安全连接。
本文关键字:#MySQL# #安全连接# #身份验证# #数字签名#