MySQL运维实战(2.4) SSL认证在MySQL中的应用
nanshan 2024-10-31 13:41 26 浏览 0 评论
作者:俊达
引言
MySQL支持使用TLS协议进行通信,该协议在数据库通信中具有关键作用。首先,TLS能够加密客户端与服务端之间的通信数据,涵盖了客户端发送至服务端的SQL请求以及服务端返回给客户端的数据,从而确保敏感信息的保密性和完整性。除此之外,TLS还允许客户端验证服务端的身份,确保安全连接。同时,TLS还使得服务端能够验证客户端的身份,实现双向认证,从而进一步增强了通信安全性和互信性。这些TLS功能在MySQL通信中发挥着重要作用,为数据传输提供了必要的保护和验证机制。
1 Server端开启SSL
服务端默认已经开启SSL,可以通过如下命令查看是否支持SSL:
参数have_ssl为 YES
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | ca.pem |
| ssl_capath | |
| ssl_cert | server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | server-key.pem |
参数说明:
参数 | 说明 |
have_openssl | 和have_ssl一样 |
have_ssl | YES: 启用SSL |
DISABLED: 已经编译了SSL功能,但是没有开启 | |
ssl_ca | CA文件,默认是ca.pem |
ssl_capath | CA文件路径,默认为空。mysqld会从datadir查找ca.pem |
ssl_cert | 服务端证书,默认server-cert.pem. |
ssl_cipher | SSL加密方式,默认为空 |
ssl_crl | certificate revocation lists文件,默认为空 |
ssl_crlpath | certificate revocation lists文件路径,默认为空 |
ssl_key | 服务端证书私钥,默认server-key.pem. |
server端启用SSL,需要ca.pem, server-cert.pem, server-key.pem 3个文件。
客户端需要有ca.pem, client-cert.pem, client-key.pem 3个文件。
2 客户端SSL
使用mysql客户端连接到服务端时,默认会使用加密通信,
登陆后输入 \s, 或者show status like ‘ssl_cipher’,如果看Cipher信息,说明连接已经开启加密通信
[root@box1 mysql]# mysql -uroot -h127.0.0.1 -P3306 -phello
Server version: 5.7.32 MySQL Community Server (GPL)
...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using EditLine wrapper
Connection id: 23
Current database:
Current user: root@localhost
SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.7.32 MySQL Community Server (GPL)
Protocol version: 10
Connection: 127.0.0.1 via TCP/IP
Server characterset: latin1
mysql> show status like 'ssl_cipher';
+---------------+-----------------------------+
| Variable_name | Value |
+---------------+-----------------------------+
| Ssl_cipher | ECDHE-RSA-AES128-GCM-SHA256 |
2.1 客户端禁用ssl通信
mysql客户端登陆时加上 --ssl-mode=disabled禁用TLS通信
mysql -uroot -h127.0.0.1 -P3306 -phello --ssl-mode=disabled
mysql> \s
--------------
mysql Ver 14.14 Distrib 5.7.32, for Linux (x86_64) using EditLine wrapper
Connection id: 25
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
mysql> show status like 'ssl_cipher';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Ssl_cipher | |
+---------------+-------+
2.2客户端要求验证服务端证书
客户端可以要求验证服务端的证书。
mysql客户端将ssl-mode参数设置为verify_ca或verify_identity, 同时需要提供用来签名的ca证书。
verify_ca的作用,是为了让服务端证明,他的证书是客户端参数中的指定的ca签名的。其他服务器无法冒充。
mysql -uroot -h127.0.0.1 -P3306 -phello --ssl-mode=verify_ca --ssl-ca=ca.pem
show status like 'ssl_cipher';
+---------------+-----------------------------+
| Variable_name | Value |
+---------------+-----------------------------+
| Ssl_cipher | ECDHE-RSA-AES128-GCM-SHA256 |
如果证书验证不通过,客户端连接会报错。服务端日志中也能看到相关报错信息。
### client
root@box1 mysql]# mysql -uroot -h127.0.0.1 -P3306 -phello --ssl-mode=verify_ca --ssl-ca=/data/mysql01/data/ca.pem
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)
### server
[root@box1 mysql]# tail -1 /var/log/mysqld.log
2021-03-31T23:34:20.461350Z 28 [Note] Bad handshake
3 服务端要求验证客户端使用SSL登录
虽然服务端开启了SSL,但是默认情况下用户可以选择启用或不启用加密通信。
服务端可以强制要求客户端使用加密通信,也可以要求客户端证明自己的身份。
这可以在创建用户的时候指定。
CREATE USER 'user_1'@'%' identified by 'hello' require ssl;
CREATE USER 'user_2'@'%' identified by 'hello' require x509;
CREATE USER 'user_3'@'%' identified by 'hello' require cipher 'ECDHE-RSA-AES256-GCM-SHA384';
CREATE USER 'user_4'@'%' identified by 'hello' require cipher 'ECDHE-ECDSA-AES256-GCM-SHA384';
CREATE USER 'user_5'@'%' identified by 'hello' require issuer 'www.dtstack.com' ;
CREATE USER 'user_6'@'%' identified by 'hello' require subject '/CN=client.dtstack.com';
上面创建的用户中,
user_1必须开启SSL加密才能连接到服务器
user_2需要使用x509证书格式
user_3需要使用cipher ECDHE-RSA-AES256-GCM-SHA384
user_4需要使用cipher ECDHE-ECDSA-AES256-GCM-SHA384
user_5需要使用www.dtstack.com签发的证书
user_6需要使用subject为client.dtstack.com的证书
4测试用户信息
select user,host, ssl_type, ssl_cipher, x509_issuer, x509_subject from mysql.user where user like 'user%';
+--------+------+-----------+-------------------------------+-----------------+------------------------+
| user | host | ssl_type | ssl_cipher | x509_issuer | x509_subject |
+--------+------+-----------+-------------------------------+-----------------+------------------------+
| user_1 | % | ANY | | | |
| user_2 | % | X509 | | | |
| user_3 | % | SPECIFIED | ECDHE-RSA-AES256-GCM-SHA384 | | |
| user_4 | % | SPECIFIED | ECDHE-ECDSA-AES256-GCM-SHA384 | | |
| user_5 | % | SPECIFIED | | www.dtstack.com | client.dtstack.com |
| user_6 | % | SPECIFIED | | | /CN=client.dtstack.com |
+--------+------+-----------+-------------------------------+-----------------+------------------------+
4.1强制SSL
user_1登陆,如果不开启ssl-mode,登陆报错。使用SSL才能登陆
[root@box1 pki]# mysql -uuser_1 -phello -h127.0.0.1 --ssl-mode=disabled
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'user_1'@'localhost' (using password: YES)
[root@box1 pki]# mysql -uuser_1 -phello -h127.0.0.1
...
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> \s
...
Current user: user_1@localhost
SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
4.2强制使用客户端证书
user_2需要x509证书才能登陆
[root@box1 pki]# mysql -uuser_2 -phello -h127.0.0.1
ERROR 1045 (28000): Access denied for user 'user_2'@'localhost' (using password: YES)
[root@box1 pki]# mysql -uuser_2 -phello -h127.0.0.1 --ssl-mode=required
ERROR 1045 (28000): Access denied for user 'user_2'@'localhost' (using password: YES)
[root@box1 pki]# mysql -uuser_2 -phello -h127.0.0.1 --ssl-cert=client-cert.pem --ssl-key=client-key.pem
...
Welcome to the MySQL monitor. Commands end with ; or \g.
mysql> \s
...
Current user: user_2@localhost
SSL: Cipher in use is ECDHE-RSA-AES128-GCM-SHA256
4.3 强制指定客户端cipher
user_3指定了cipher, 无法登陆。 可以从服务端alert.log查看登陆失败的原因。
[root@box1 pki]# mysql -uuser_3 -pxhello -h127.0.0.1 --ssl-mode=required --ssl-cert=client-cert.pem --ssl-key=client-key.pem
ERROR 1045 (28000): Access denied for user 'user_3'@'localhost' (using password: YES)
### 服务端日志
[root@box1 mysql]# tail -1 /var/log/mysqld.log2021-04-01T00:07:44.216859Z 51 [Note] X509 ciphers mismatch: should be 'ECDHE-RSA-AES256-GCM-SHA384' but is 'ECDHE-RSA-AES128-GCM-SHA256'
2021-04-01T00:07:44.216915Z 51 [Note] Access denied for user 'user_3'@'localhost' (using password: YES)
说明了cipher不满足要求。
my.cnf增加ssl_ciphper参数,重启服务
[root@box1 mysql]# tail -1 /etc/my.cnf
ssl_cipher=ECDHE-RSA-AES256-GCM-SHA384
[root@box1 mysql]# service mysqld restart
Redirecting to /bin/systemctl restart mysqld.service
-- 再次尝试登陆,可以看到SSL 使用的ciper变成了 ECDHE-RSA-AES256-GCM-SHA384
[root@box1 pki]# mysql -uuser_3 -phello -h127.0.0.1 --ssl-mode=required --ssl-cert=client-cert.pem --ssl-key=client-key.pem
...
mysql> \s
Current user: user_3@localhost
SSL: Cipher in use is ECDHE-RSA-AES256-GCM-SHA384
4.4验证客户端证书的subject 和 issuer
### client
[root@box1 pki]# mysql -uuser_5 -phello -h127.0.0.1 --ssl-mode=required --ssl-cert=client-cert.pem --ssl-key=client-key.pem
ERROR 1045 (28000): Access denied for user 'user_5'@'localhost' (using password: YES)
### server
[root@box1 mysql]# tail -2 /var/log/mysqld.log
2021-04-01T01:17:21.692560Z 6 [Note] X509 issuer mismatch: should be 'www.dtstack.com' but is '/C=CN/ST=HZ/L=ZJ/O=lazybug CO/OU=freecity/CN=www.dtstack.com/emailAddress=junda@dtstack.com'
2021-04-01T01:17:21.692607Z 6 [Note] Access denied for user 'user_5'@'localhost' (using password: YES)
### client
[root@box1 pki]# mysql -uuser_6 -phello -h127.0.0.1 --ssl-mode=required --ssl-cert=client-cert.pem --ssl-key=client-key.pem
ERROR 1045 (28000): Access denied for user 'user_6'@'localhost' (using password: YES)
### server
[root@box1 mysql]# tail -2 /var/log/mysqld.log
2021-04-01T01:20:41.297093Z 8 [Note] X509 subject mismatch: should be '/CN=client.dtstack.com' but is '/C=XX/L=Default City/O=Default Company Ltd'
2021-04-01T01:20:41.297144Z 8 [Note] Access denied for user 'user_6'@'localhost' (using password: YES)
重新生成client证书,指定subject
[root@box1 pki]# openssl req -subj /CN=client.dtstack.com -newkey rsa:2048 -days 3600 \
-nodes -keyout client-key.pem -out client-req.pem
writing new private key to 'client-key.pem'
[root@box1 pki]# openssl rsa -in client-key.pem -out client-key.pem
writing RSA key
[root@box1 pki]# openssl x509 -sha384 -req -in client-req.pem -days 3600 \
> -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
Signature ok
subject=/CN=client.dtstack.com
Getting CA Private Key
使用新的证书,就可以登录的数据库了:
[root@box1 pki]# mysql -uuser_6 -phello -h127.0.0.1 --ssl-mode=required --ssl-cert=client-cert.pem --ssl-key=client-key.pem
...
mysql> \s
Current user: user_6@localhost
SSL: Cipher in use is ECDHE-RSA-AES256-GCM-SHA384
附录:SSL证书相关命令
生成证书的命令
# Create clean environment
rm -rf newcerts
mkdir newcerts && cd newcerts
# Create CA certificate
openssl genrsa 2048 > ca-key.pem
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
openssl req -newkey rsa:2048 -days 3600 \
-nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -sha384 -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
openssl req -subj /client.dtstack.com -newkey rsa:2048 -days 3600 \
-nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha384 -req -in client-req.pem -days 3600 \
-CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
openssl x509 -req -in client-req.pem -days 3600 \
-CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
查看证书信息
[root@box1 mysql]# openssl x509 -text -in server-cert.pem -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 2 (0x2)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN=MySQL_Server_5.7.32_Auto_Generated_CA_Certificate
Validity
Not Before: Mar 31 12:14:46 2021 GMT
Not After : Mar 29 12:14:46 2031 GMT
Subject: CN=MySQL_Server_5.7.32_Auto_Generated_Server_Certificate
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 bit)
Modulus:
[root@box1 pki]# openssl x509 -text -in client-cert.pem -noout
Certificate:
Data:
Version: 1 (0x0)
Serial Number: 1 (0x1)
Signature Algorithm: sha384WithRSAEncryption
Issuer: C=CN, ST=HZ, L=ZJ, O=lazybug CO, OU=freecity, CN=www.dtstack.com/emailAddress=junda@dtstack.com
Validity
Not Before: Apr 1 01:34:53 2021 GMT
Not After : Feb 8 01:34:53 2031 GMT
Subject: CN=client.dtstack.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
Public-Key: (2048 b
验证证书
使用openssl verify命令验证证书有效性。CAfile是用于创建证书的ca文件。
[root@box1 pki]# openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK
如果ca文件和证书文件不匹配,验证会报错
[root@box1 pki]# openssl verify -CAfile /var/lib/backupca/ca.pem server-cert.pem client-cert.pem
server-cert.pem: C = CN, ST = ZJ, L = HZ, O = bugfree server, OU = land, CN = www.dtstack.com, emailAddress = server@dtstack.com
error 20 at 0 depth lookup:unable to get local issuer certificate
client-cert.pem: CN = client.dtstack.com
error 20 at 0 depth lookup:unable to get local issuer certificate
更多技术信息请查看云掣官网云掣YunChe - 可观测运维专家 | 大数据运维托管 | 云MSP服务
相关推荐
- 雷军1994年写的老代码曝光,被称像诗一样优雅
-
大数据文摘授权转载自程序员的那些事雷军的代码像诗一样优雅↓↓↓有些网友在评论中质疑,说雷军代码不会是“屎”一样优雅吧。说这话的网友,也许是开玩笑的,也许是真没看过雷军写过的代码。在2011年的时候,我...
- 原创经验分享:低级bug耗费12小时Fix
-
调试某程序非常简单的程序,简单到认为不可能存在缺陷,但该BUG处理时间超过12小时:程序属于后台进程,监控系统每隔15秒检查外设IO状态,IO异常后发出报警或复位外设,外设都在linux下有/sys/...
- SpringBoot实现的简单停车位管理系统附带导入和演示教程视频
-
这一次为大家带来的是简单的停车位管理系统,基于SpringBoot+Thymeleaf+Mybatis框架,这个系统相对来说比较简单,很容易学习并快速上手,因为逻辑很清晰,没有太复杂的代码逻辑,所以学...
- 一个开箱即用的代码生成器(代码自动生成工具开源)
-
今天给大家推荐一个好用的代码生成器,名为renren-generator,该项目附带前端页面,可以很方便的选择我们所需要生成代码的表。首先我们通过git工具克隆下来代码(地址见文末),导入idea。...
- 【免费开源】JeecgBoot单点登录源码全部开源了
-
JeecgBoot单点登录源码全部开源了,有需要的朋友可以来薅羊毛了。一、JeecgBoot介绍JeecgBoot是一款企业级的低代码平台!前后端分离架构SpringBoot2.x,SpringCl...
- SpringBoot+JWT+Shiro+Mybatis实现Restful快速开发后端脚手架
-
作者:lywJee来源:cnblogs.com/lywJ/p/11252064.html一、背景前后端分离已经成为互联网项目开发标准,它会为以后的大型分布式架构打下基础。SpringBoot使编码配置...
- 为什么越来越多的人选择使用idea软件
-
IDEA软件是什么?IDEA软件是干什么的?为什么越来越多的人选择使用IDEA软件?IDEA软件,全称IntelliJIDEA,它是由JetBrains公司开发开发的一款功能强大的集成开发环境(ID...
- 开题报告大学生互助系统(附源码)java毕设
-
本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容选题背景随着互联网技术的飞速发展,大学生群体对信息共享与互助的需求日益增长。关于大...
- SpringBoot项目快速开发框架JeecgBoot——项目简介及系统架构!
-
项目简介及系统架构JeecgBoot是一款基于SpringBoot的开发平台,它采用前后端分离架构,集成的框架有SpringBoot2.x、SpringCloud、AntDesignof...
- 新手配电脑13代CPU怎么选择(新手配电脑13代cpu怎么选择好)
-
Intel第13代酷睿i3、i5、i7、i9系列处理器的核心参数、性能差异及适用群体的详细说明(以桌面端为例):一、13代酷睿全系参数对比(桌面端主流型号)参数i3-13100i5-13600Ki7-...
- 加速 SpringBoot 应用开发,官方热部署神器真带劲
-
平时使用SpringBoot开发应用时,修改代码后需要重新启动才能生效。如果你的应用足够大的话,启动可能需要好几分钟。有没有什么办法可以加速启动过程,让我们开发应用代码更高效呢?今天给大家推荐一款Sp...
- 基于微信小程序的移动端物流系统-计算机毕业设计源码+LW文档
-
摘要随着Internet的发展,人们的日常生活已经离不开网络。未来人们的生活与工作将变得越来越数字化,网络化和电子化。网上管理,它将是直接管理移动端物流系统app的最新形式。本论文是以构建移动端物流系...
- springboot教务管理系统+微信小程序云开发附带源码
-
今天给大家分享的程序是基于springboot的管理,前端是小程序,系统非常的nice,不管是学习还是毕设都非常的靠谱。本系统主要分为pc端后台管理和微信小程序端,pc端有三个角色:管理员、学生、教师...
- SpringBoot全家桶:23篇博客加23个可运行项目让你对它了如指掌
-
SpringBoot现在已经成为Java开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通...
- Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统
-
本系统基于Maven+JSP+Servlet+C3P0+Mysql实现的音乐库管理系统。简单实现了充值、购买歌曲、poi数据导入导出、歌曲上传下载、歌曲播放、用户注册登录注销等功能。难度等级:简单技术...
你 发表评论:
欢迎- 一周热门
-
-
UOS服务器操作系统防火墙设置(uos20关闭防火墙)
-
极空间如何无损移机,新Z4 Pro又有哪些升级?极空间Z4 Pro深度体验
-
如何修复用户配置文件服务在 WINDOWS 上登录失败的问题
-
手机如何设置与显示准确时间的详细指南
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
NAS:DS video/DS file/DS photo等群晖移动端APP远程访问的教程
-
日本海上自卫队的军衔制度(日本海上自卫队的军衔制度是什么)
-
10个免费文件中转服务站,分享文件简单方便,你知道几个?
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
FANUC 0i-TF数据备份方法(fanuc系统备份教程)
-
- 最近发表
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)