Mysql 中的SSL 连接

以下来自网络参考和自己测试整理,没有查找相关资料。若有错误之处,欢迎指正。

当前的Mysql 客户端版本基本都不太能支持 caching_sha2_password 认证,使用Mysql 8.0 的话,建议添加参数:

default-authentication-plugin=mysql_native_password

否则可能导致客户端连接失败。以下的案例也是基于此。客户端的不支持会导致不能反映真实结果。

当前数据库中的用户

root@(none):53: >select host,user,ssl_type,ssl_cipher,x509_issuer,x509_subject,plugin from mysql.user;
+--------------+------------------+----------+------------+-------------+--------------+-----------------------+
| host | user | ssl_type | ssl_cipher | x509_issuer | x509_subject | plugin |
+--------------+------------------+----------+------------+-------------+--------------+-----------------------+
| % | rep | | | | | mysql_native_password |
| % | root | | | | | mysql_native_password |
| % | test | | | | | mysql_native_password |
| % | test1 | | | | | caching_sha2_password |
| 192.168.20.% | cat | X509 | | | | mysql_native_password |
| localhost | mysql.infoschema | | | | | caching_sha2_password |
| localhost | mysql.session | | | | | caching_sha2_password |
| localhost | mysql.sys | | | | | caching_sha2_password |
| localhost | root | | | | | caching_sha2_password |
+--------------+------------------+----------+------------+-------------+--------------+-----------------------+
10 rows in set (0.00 sec)

require_secure_transport = OFF 模式

此为默认设置,该模式下用户可以不通过ssl加密连接到数据库

-- 不通过SSL连接方式
mysql -h mysql1 -utest -ptest --ssl-mode=DISABLED
SSL: Not in use

-- 通过SSL连接方式
mysql -h mysql1 -utest -ptest
mysql -h mysql1 -utest -ptest --ssl-mode=PREFERRED
mysql -h mysql1 -utest1 -ptest1 --ssl-mode=PREFERRED
mysql -h mysql1 -utest1 -ptest1 --ssl-mode=REQUIRED
SSL: Cipher in use is DHE-RSA-AES128-GCM-SHA256

  

navicate 只配置常规选项卡即可连接

连接之后为非加密模式

show status like 'ssl_cipher';

但我们同样可以使用加密连接

require_secure_transport = ON 模式下

强制要求配置ssl

如果不使用SSL 连接会报错,MySQL 命令行

-- 不使用SSL
[root@mysql2 ~]# mysql -h mysql1 -utest -ptest --ssl-mode=disabled
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.
-- 使用SSL
[root@mysql2 ~]# mysql -h mysql1 -utest -ptest
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show status like 'ssl_cipher';
+---------------+---------------------------+
| Variable_name | Value |
+---------------+---------------------------+
| Ssl_cipher | DHE-RSA-AES128-GCM-SHA256 |
+---------------+---------------------------+
1 row in set (0.01 sec)

SSL-MODE 有如下5中选项

'DISABLEDD'--不使用SSL加密

'PREFERRED','REQUIRED'--使用SSL 加密,加密算法没差别

'VERIFY_CA','VERIFY_IDENTITY' --需附加--ssl-ca 等选项

PEM 的使用

官方文档会推荐我们初始化Mysql 后执行如下命令

mysql_ssl_rsa_setup --datadir=datadir路径,该命令会在数据目录下生成如下这些文件。

那么该如何使用这些文件呢?

[root@mysql1 mydata1]# ll /u01/mydata1/*.pem
-rw-------. 1 mysql mysql 1680 Jun 4 03:12 /u01/mydata1/ca-key.pem
-rw-r--r--. 1 mysql mysql 1112 Jun 4 03:12 /u01/mydata1/ca.pem
-rw-r--r--. 1 mysql mysql 1112 Jun 4 03:12 /u01/mydata1/client-cert.pem
-rw-------. 1 mysql mysql 1680 Jun 4 03:12 /u01/mydata1/client-key.pem
-rw-------. 1 mysql mysql 1676 Jun 4 03:12 /u01/mydata1/private_key.pem
-rw-r--r--. 1 mysql mysql 452 Jun 4 03:12 /u01/mydata1/public_key.pem
-rw-r--r--. 1 mysql mysql 1112 Jun 4 03:12 /u01/mydata1/server-cert.pem
-rw-------. 1 mysql mysql 1680 Jun 4 03:12 /u01/mydata1/server-key.pem

  

创建用户

root@(none):39: >create user cat@'192.168.20.%' identified with mysql_native_password by 'cat' require ssl; -- 这时要求该用户必须使用SSL,即使参数require_secure_transport = OFF
root@(none):39: >grant all on *.* to cat@'192.168.20.%';
root@(none):39: >alter user cat@'192.168.20.%' require x509; -- 这里就要求使用pem 文件了
root@(none):39: >select host,user,ssl_type,ssl_cipher,x509_issuer,x509_subject,plugin from mysql.user where user='cat' \G
*************************** 1. row ***************************
host: 192.168.20.%
user: cat
ssl_type: X509
ssl_cipher:
x509_issuer:
x509_subject:
plugin: mysql_native_password
1 row in set (0.00 sec)

  

测试 SSL 常规连接,将会失败

[root@mysql2 ~]# mysql -h mysql1 -ucat -pcat
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'cat'@'192.168.20.82' (using password: YES)
[root@mysql2 ~]# mysql -h mysql1 -ucat -pcat --ssl-mode=PREFERRED
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'cat'@'192.168.20.82' (using password: YES)

  

复制pem文件

再想成功连接就需要使用到PEM 文件了,将server端pem 文件copy 到客户端

#mysql1
[root@mysql1 mydata1]# scp client-cert.pem mysql2:/home/mysql
client-cert.pem 100% 1112 873.8KB/s 00:00
[root@mysql1 mydata1]# scp client-key.pem mysql2:/home/mysql
client-key.pem 100% 1680 169.9KB/s 00:00
#mysql2
[root@mysql2 ~]# ll /home/mysql
total 8
-rw-r--r-- 1 root root 1112 Jul 14 09:43 client-cert.pem
-rw------- 1 root root 1680 Jul 14 09:43 client-key.pem

  

使用pem,成功连接

[root@mysql2 ~]# mysql -h mysql1 -ucat -pcat --ssl-cert=/home/mysql/client-cert.pem --ssl-key=/home/mysql/client-key.pem
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 50
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

  

--ssl-ca 参数也可以使用,同样需要将server 段的ca.pem 复制到客户端。如

[root@mysql2 ~]# mysql -h mysql1 -ucat -pcat --ssl-ca=/home/mysql/ca.pem --ssl-cert=/home/mysql/client-cert.pem  --ssl-key=/home/mysql/client-key.pem

  

工具连接

需要下载server端的pem 文件到自己电脑,为连接工具指定pem文件位置方可连接到数据库。

添加用户需要重新copy pem 文件吗?

-- 添加用户
root@(none):09: >create user dog@'192.168.20.%' identified with mysql_native_password by 'dog' require x509; -- 使用x509 可以不指定require ssl,但仍会强制要求SSL
Query OK, 0 rows affected (0.00 sec)

root@(none):09: >grant all on *.* to dog@'192.168.20.%';
Query OK, 0 rows affected (0.01 sec)

  

添加新用户,不用重新copy

-- 成功连接
[root@mysql2 ~]# mysql -h mysql1 -udog -pdog --ssl-cert=/home/mysql/client-cert.pem --ssl-key=/home/mysql/client-key.pem
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

  

说明pem 文件在安装好数据库后是固定不变的。copy 到客户端后可以永久使用,不受数据库变更的影响。

服务端的pem 文件和ssl连接有关联吗?

#将所有的pem文件移动走
[root@mysql1 mydata1]# mkdir pemdefault
[root@mysql1 mydata1]# mv *.pem pemdefault/
[root@mysql1 mydata1]# ll *.pem
ls: cannot access *.pem: No such file or directory

# 测试客户端连接
[root@mysql2 ~]# mysql -h mysql1 -udog -pdog --ssl-cert=/home/mysql/client-cert.pem --ssl-key=/home/mysql/client-key.pem
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 35
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

  

说明,服务端的*.pem文件被删除并不影响客户端的SSL 连接.

但是,如果重启数据库, 服务端会重新生成新的pem文件。

[root@mysql1 mydata1]# ll *.pem
-rw------- 1 mysql mysql 1680 Jul 14 10:24 ca-key.pem
-rw-r--r-- 1 mysql mysql 1112 Jul 14 10:24 ca.pem
-rw-r--r-- 1 mysql mysql 1112 Jul 14 10:24 client-cert.pem
-rw------- 1 mysql mysql 1680 Jul 14 10:24 client-key.pem
-rw------- 1 mysql mysql 1676 Jul 14 10:24 private_key.pem
-rw-r--r-- 1 mysql mysql 452 Jul 14 10:24 public_key.pem
-rw-r--r-- 1 mysql mysql 1112 Jul 14 10:24 server-cert.pem
-rw------- 1 mysql mysql 1680 Jul 14 10:24 server-key.pem

  

这时再远程连接就报错了

[root@mysql2 ~]# mysql -h mysql1 -udog -pdog --ssl-cert=/home/mysql/client-cert.pem --ssl-key=/home/mysql/client-key.pem
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2026 (HY000): SSL connection error: error:1409441B:SSL routines:ssl3_read_bytes:tlsv1 alert decrypt error

  

重新copy pem文件到客户端, 再次连接测试

#copy pem文件
[root@mysql1 mydata1]# scp client-cert.pem mysql2:/home/mysql
client-cert.pem 100% 1112 1.4MB/s 00:00
[root@mysql1 mydata1]# scp client-key.pem mysql2:/home/mysql
client-key.pem

#连接恢复
[root@mysql2 ~]# mysql -h mysql1 -udog -pdog --ssl-cert=/home/mysql/client-cert.pem --ssl-key=/home/mysql/client-key.pem
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 19
Server version: 8.0.16 MySQL Community Server - GPL

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

  

所以综上,虽然pem ssl 远程连接不需要通过服务端的pem 文件匹配验证,但仍然不能删除服务端pem文件,因为删除后重启数据库会重新生成新的pem 文件,将导致远程连接失败,需要重新copy。

Mysql 中的SSL 连接的更多相关文章

  1. MySQL中的内连接、左连接、右连接、全连接、交叉连接

    创建两个表(a_table.b_table),两个表的关联字段分别为:a_table.a_id和b_table.b_id CREATE TABLE a_table ( a_id int NOT NUL ...

  2. 关于日常使用Azure MySQL中遇到的连接问题以及排查方法分享

    由于防火墙问题,TCP keep alive 问题,以及 MySQL 自身的参数问题这三个在使用中比较常见,所以今天就分享下自己找到的排查方法. 今天先聊一聊防火墙问题 大多数人在第一次创建 MySQ ...

  3. mysql中的内连接,外连接实例详解

    内连接: 只连接匹配的行左外连接: 包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行右外连接: 包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边 ...

  4. MySql中允许远程连接

    要达到这个目的需要实现两点 开通用户权限 解除本地绑定 开通用户权限 首先登陆服务器端的mysql //不使用空格可以直接登陆 mysql -u用户名 -p密码 mysql> use mysql ...

  5. MySQL中的内连接、外连接、交叉连接

    内连接(INNER JOIN):   分为三种 等值连接.自然连接.不等连接        外连接(OUTER JOIN):   左外连接(LEFT OUTER JOIN或LEFT JOIN)   右 ...

  6. mysql中的左连接右连接内连接

    一. 初始化SQL语句 /*join 建表语句*/ drop database if exists test; create database test; use test; /* 左表t1*/ dr ...

  7. MYSQL中的字符串连接符

    update `table` set nsdf = concat('a','b') where id=137

  8. MySQL中的左连接遇到的坑

    参考地址:https://blog.csdn.net/feichangwurao/article/details/89526741 待研究整理中.....

  9. MySQL中基本的多表连接查询教程

    一.多表连接类型1. 笛卡尔积(交叉连接) 在MySQL中可以为CROSS JOIN或者省略CROSS即JOIN,或者使用','  如: SELECT * FROM table1 CROSS JOIN ...

随机推荐

  1. spring 加载属性(properties)文件

    在开发的过程中,配置文件往往就是那些属性(properties)文件,比如使用properties文件配置数据库文件,又如database-config.properties 代码清单:databas ...

  2. Java合并(连接)多个音频

    java sound resource 合并的说法有歧义,为了方便大家搜索到这里,所以用这个标题,实际上是连接(concat),可以理解为字符串concat方法所指定的含义. AudioConcat. ...

  3. 使用Docker在本地启动3个MySQL镜像

    首先执行 sudo docker pull mysql 命令下载mysql官方镜像: zifeiy@zifeiy-PC:~$ sudo docker pull mysql Using default ...

  4. JS正则验证数字格式2

    之前的博文:JS验证正数字,正则的一种正数规则1,中isNaN可以判断内容是否为数字,但是这种判断出来的数字,有的不是数字的标准格式.那篇博文中尝试了下用正则验证,但是忘了一种情况,小数点后无数字,小 ...

  5. html测试页LODOP的内容反复进入打印设计

    打印设计是给开发人员使用的工具,用打印设计辅助开发后,打印设计的界面本身的菜单下,可以生成代码,然后把对应的内容信息补充上,拷贝到自己的页面的JS里或存起来,作为模版使用. 也可以关闭打印设计,可返回 ...

  6. 原生JavaScript常用本地浏览器存储方法二(cookie)

    JavsScript Cookie概述 cookie是浏览器提供的一种机制,它将document对象的cookie属性提供给JavaScript.可以由JavaScript对其进行控制,而并不是Jav ...

  7. vue项目开发优化

    1 按需引入ui组件 比如elementUI,不要直接在main.js中全局引入所有的组件,可以根据elementui的说明文件,按需引入 项目中的组件 2 异步引入路由组件 使用 { path:'/ ...

  8. Cas(05)——修改Cas Server的其它配置

    修改Cas Server的其它配置 目录 1.1      修改host.name 1.2      修改SSO Session的超时策略 1.3      修改允许管理service的角色 1.4  ...

  9. SpringBoot RequestBody ajax提交对象

    前端实现: var student = { "name":1, "age":2, "score":3 }; $.ajax({ url:&qu ...

  10. 2019.12.4 Hystix熔断&Feign进行远程调用&Zuul

    0.学习目标 会配置Hystix熔断 会使用Feign进行远程调用 能独立搭建Zuul网关 能编写Zuul的过滤器 1.Hystrix 1.1.简介 Hystrix,英文意思是豪猪,全身是刺,看起来就 ...