MySQL基于SSL协议进行主从复制的详细操作教程
作者:zdz 发布时间:2024-01-24 23:10:35
当mysql跨越互联网进行复制时别人可以窃取到mysql的复制信息,这些信息是明文的,因此存在不安全性,这里通过ssl对复制的信息进行加密。当在客户没有固定ip而要访问服务器时,mysql要允许任意地址的访问,服务端和客户端通过证书验证可以防止暴力破解。
开始之前让我们先来回顾一下SSL协议客户端OpenSSL的安装过程:
安装openssl
mkdir /test/setup
cd /test/setup
tar zxvf openssl-0.9.8b.tar.gz
cd openssl-0.9.8b
./config
make && make install
开启mysql中ssl功能
登录Mysql查看
mysql> show variables like '%ssl%';
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| have_openssl | DISABLED |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
+---------------+----------+
如果mysql输出如上所述,那么继续操作开启ssl;如果不是,重新编译安装mysql,注意生成makefile时填写参数正确。
退出mysql,编辑/etc/my.cnf
在[mysqld]和[mysqldump]之间,加入下列配置信息:
ssl
保存后重新启动mysql,再次登录mysql
mysql -uroot -p
mysql> show variables like '%ssl%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_key | |
+---------------+-------+
好了,下面进入正题:
mysql基于ssl复制
1、创建证书中心
在主服务器上创建证书中心
cd /etc/pki/CA
生成私钥
(umask 077;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048)
生成自签证书,由于需要输入大量用户信息,因此编辑证书的配置文件,在私有的CA上创建证书要注意所有的用户信息要和CA中的一致,从国家到部门都要相同,否则会造成证书无法使用
vim /etc/pki/tls/openssh.cnf
[ req_distinguished_name ]
countryName = Country Name (2 letter code)
countryName_default = CN
countryName_min = 2
countryName_max = 2
stateOrProvinceName = State or Province Name (full name)
stateOrpovinceName_default = FJ
localityName = Locality Name (eg,city)
localityName = FZ
O.organizationName = Organization Name (eg,company)
O.organizationName_default = zdz
organizationalUnitName = Organizational Unit Name (eg,section)
organizationalUnitName_default = zdz
生成自签证书
openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem -out /etc/pki/CA/cacert.pem -days 3650
-x509是创建自签证书是需要的参数,在创建其他证书时不能加该参数
由于是自签证书因此要 * 路径
vim /etc/pki/tls/openssl.cnf
[ CA_defalut ]
dir = /etc/pki/CA
certs = $dir/certs #存放生成证书的目录
crl_dir = $dir/crl #存放吊销证书的目录
database = $dir/index.txt #证书的索引文件
new_certs_dir = $dir_newcerts #新签的证书目录
serial = $dir/serial #序列号
crl = $dir/crl.pem
private_key = $dir/private/cakey.pem #证书中心私钥文件
创建证书编号
mkdir certs crl newcerts
touch index.txt
echo 00 > serial
2、为主服务器创建证书
服务器的名称必须固定,在申请证书时要输入服务器名称,证书和服务器名称对应
创建私钥
mkdir /usr/local/mysql/ssl
cd /usr/local/mysql/ssl
(umask 077;openssl genrsa -out /usr/local/mysql/ssl/master.key 2048)
生成证书申请
openssl req -new -key master.key -out master.csr
在证书服务器上对master的证书进行签发
openssl ca -in master.csr -out master.crt -days 365
3、创建从服务器证书
(umask 077;openssl genrsa -out /usr/local/mysql/ssl/slave.key 2048)
openssl req -new -key slave.key -out slave.csr
将从服务器的证书申请文件复制到证书服务器上进行签发
opessl ca -in slave.csr -out slave.crt -days 356
4、 * 权限和mysql配置文件
将证书的公钥cacert.pem复制到主从服务器的目录下
cd /usr/local/mysql/ssl
cp /etc/pki/CA/cacert.pem ./
chown -R mysql:mysql master.crt master.key cacert.pem
chmod 600 master.crt master.key cacert.pem
vim /usr/local/mysql/my.cnf
ssl
ssl_ca = /usr/local/mysql/ssl/cacrt.pem
ssl_cert = /usr/local/mysql/ssl/master.crt
ssl_key = /usr/local/mysql/ssl/master.key
修改从服务器配置
cd /usr/local/mysql/ssl
cp /etc/pki/CA/cacert.pem ./
chown -R mysql:mysql slave.crt slave.key cacert.pem
chmod 600 slave.crt slave.key cacert.pem
vim /usr/local/mysql/my.cnf
ssl
ssl_ca = /usr/local/mysql/ssl/cacrt.pem
ssl_cert = /usr/local/mysql/ssl/slave.crt
ssl_key = /usr/local/mysql/ssl/slave.key
5、在主服务器上创建复制用户
grant replication slave on *.* to slave@'192.168.216.133' identified by 'slave' requere ssl;
flush privileges;
查看主服务器当前二进制位置
mysql> show master status ;
+-------------------------+------------+---------------------+--------------------------+--------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------------+------------+---------------------+--------------------------+--------------------------+
| mysql-bin.000007 | 1015 | | | |
+-------------------------+------------+---------------------+--------------------------+---------------------------+
1 row in set (0.00 sec)
6、在从服务器上开始复制
change master to
master_host='192.168.216.132',
master_user='slave',
master_password='slave',
master_log_file='mysql-bin.000007',
master_log_pos=1015,
master_ssl=1,
master_ssl_ca=' /usr/local/mysql/ssl/cacrt.pem',
master_ssl_cert='/usr/local/mysql/ssl/slave.crt',
master_ssl_key='/usr/local/mysql/ssl/slave.key';
start slave;
查看状态
错误1:
如果要确保证书没有问题可以通过建立测试的用户同ssl进行连接在主服务器上开一个权限很大的用户,进行ssl的登录测试
grant all privileges on *.* to root@'192.168.216.133′ identified by ‘root' require ssl;
[root@slave ssl]# mysql -uroot -proot -h192.168.216.133 –ssl-ca=cacrt.pem –ssl-cert=slave.crt –ssl-key=slave.key
Warning: Using a password on the command line interface can be insecure.
ERROR 2026 (HY000): SSL connection error: ASN: before date in the future
这是由于虚拟的时间不正确导致
如果这时候不使用ssl方式进行连接则会报出错误
[root@slave ssl]# mysql -uroot -proot -h192.168.216.133;
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user ‘root'@'192.168.216.132′ (using password: YES)
错误2:
在配置文件中添加证书配置后执行 show variables like ‘%ssl%'显示
这是由于没有将证书的属主改为mysql,可以从日志中得知是无权限获取私钥
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- 在这篇文章中,我将努力揭开Mobile Web开发的神秘面纱,换句话说,也就是为了移动设备上的用户体验可以被接受,代码得怎么设计。我将阐述“
- 主要作用为指定图片像素:matplotlib.rcParams[‘figure.figsize']#图片像素 matplotlib.
- 在python中读取csv文件时,一般操作如下:import pandas as pdpd.read_csv(filename)该读文件方式
- 有时候需要罗列下U盘等移动设备或一个程序下面的目录结构的需求。基于这样的需求个人整理了一个使用Python的小工具,期望对有这方面需求的朋友
- ASP正则表达式,RegExp对象提供简单的正则表达式支持功能。RegExp对象的用法: Function RegExpTest(
- 本文实例为大家分享了Python实现打砖块游戏的具体代码,供大家参考,具体内容如下#导入模块import pygamefrom pygame
- 内网的主机都是自动分配ip地址,有时候需要查看下有那些ip在使用,就写了个简单的脚本。linux和windows下都可以用,用多线程来pin
- 条形图是一种常用的图形,比如在各种PPT的展示中为各种职业人士所喜爱。条形图能够直观地展示各种场景下数值的比较。Matplotlib提供了b
- 本文实例讲述了Python计时相关操作。分享给大家供大家参考,具体如下:内容目录:1. 时间戳2. 当前时间3. 时间差4. python中
- lambda 语法lambda 函数的语法只包含一个语句,表现形式如下:lambda [arg1 [,arg2,.....argn]]:ex
- 昨天在看别人blog的时候发现DW有这么一个东西。叫做代码片断。我们可以将常用的css定义写一个代码片断。保存在DW中,作为公用库。当再次写
- 1.装饰器通用模型def wrapper(fn): def inner(*args, **kwargs):&nbs
- iamlaosong文曾经看到这样一个问题,一个字典中的元素是列表,将这个列表元素赋值给一个变量,然后修改这个列表中元素的值,结果发现,字典
- 一、前言好不容易女神喊我去看电影,但是她又不知道看啥,那么我当然得准备准备~二、前期准备1、使用的软件python 3.8 开源 免费的 (
- 1、过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大。正好看到graphics.
- 问题: jsp中想要输出的中文被显示成“?” 解决方法 : 在eclipse-windows- preferences中 搜索jsp , E
- Python中编码问题:u'\xe6\x97\xa0\xe5\x90\x8d' 类型的转为utf-8的解决办法相信小伙伴们遇
- Application-settings我们在创建tornado.web.Application的对象时,传入了第一个参数&mdas
- 如下所示:#!/usr/bin/env python3.5import psutilimport mysql.connectorimport
- 超链接在新窗口打开,是在<a>标签加 target="_blank" 即可。可按下“POST/GET提交按钮