分享好友 数据库首页 频道列表

MySQL基于SSL协议进行主从复制的详细操作教程

MySQL教程  2016-01-31 10:060

当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;

查看状态

MySQL基于SSL协议进行主从复制的详细操作教程

错误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基于SSL协议进行主从复制的详细操作教程

这是由于没有将证书的属主改为mysql,可以从日志中得知是无权限获取私钥

MySQL基于SSL协议进行主从复制的详细操作教程

查看更多关于【MySQL教程】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
mysql下如何执行sql脚本 执行SQL脚本
1.编写sql脚本,假设内容如下:  create database dearabao;  use dearabao;  create table niuzi (name varchar(20));  保存脚本文件,假设我把它保存在F盘的hello world目录下,于是该文件的路径为:F:\hello world\niuzi.sql2.执行sql脚本,可以有2种方法: 

0评论2023-02-10699

MySQL 5.7版本sql_mode=only_full_group_by问题
用到GROUP BY 语句查询时com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #2 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'col_user_6.a.START_TIME' which is not functionally dependent on colu

0评论2023-02-10973

Oracle迁移到MySQL性能下降的注意点 oracle数据库迁移需要注意的问题
背景:最近有较多的客户系统由原来由Oracle改造到MySQL后出现了性能问题CPU 100%,或是后台的CRM系统复杂SQL在业务高峰的时候出现堆积导致业务故障。在我的记忆里面淘宝最初从Oracle迁移到MySQL期间也遇到了很多SQL的性能问题,记忆最为深刻的子查询,当初的

0评论2023-02-10580

MySQL与Oracle 差异比较之六触发器
触发器编号类别ORACLEMYSQL注释1创建触发器语句不同create or replace trigger TG_ES_FAC_UNIT  before insert or update or delete on ES_FAC_UNIT  for each rowcreate trigger `hs_esbs`.`TG_INSERT_ES_FAC_UNIT` BEFORE INSERT on `hs_esbs`.`es_fac_u

0评论2023-02-10914

mysql where条件:某时间字段为今天的sql语句
1.查询:注册时间为今天的所有用户数:select count(*) from customer where TO_DAYS(createtime) = TO_DAYS(NOW())2.获取当前时间到凌晨24点还有多长时间:(Java中可用于判断某时间是否为今天)final Calendar cal = Calendar.getInstance();    ca

0评论2023-02-10717

mysql中的sql
变量用户变量: 在用户变量前加@系统变量: 在系统变量前加@@运算符算术运算符有: +(加), -(减), * (乘), / (除) 和% (求模) 五中运算位运算符有:(位于), | (位或), ^ (位异或), ~ (位取反),(位右移),(位左移)比较运算符有: = (等于),(大于),(小于), = (大

0评论2023-02-10936

Oracle、MySql、Sql Server比对
MySql:廉价(部分免费):当前,MySQL採用双重授权(DualLicensed),他们是GPL和MySQLAB制定的商业许可协议。假设你在一个遵循GPL的***(开源)项目中使用MySQL,那么你能够遵循GPL协议免费使用MySQL。否则,你须要购买MySQLAB制定的那个商业许可协议。Windows $

0评论2023-02-10441

MySQL与Oracle的区别之我见 mysql oracle 区别
1. 大的方面(宏观)Oracle为商用数据库,行业中占据相当的地位:市场占比2012年为40%。开发、管理资源相当丰富,有自己的metalink,我也曾用过,有什么问题,都能在那里得到较快速度的解决。开发用了近10年,虽然有些功能用起来挺鸡肋的(像分页),但它在OL

0评论2023-02-10801

一条SQL语句在MySQL中如何执行的 mysql执行语句的过程
本篇文章会分析一个 sql 语句在 MySQL 中的执行流程,包括 sql 的查询在 MySQL 内部会怎么流转,sql 语句的更新是怎么完成的。在分析之前我会先带着你看看 MySQL 的基础架构,知道了 MySQL 由那些组件组成以及这些组件的作用是什么,可以帮助我们理解和解决这

0评论2023-02-10684

sql mysql和sqlserver存在就更新,不存在就插入的写法(转)
转自:http://hi.baidu.com/tidy0608/item/ff930fe2436f2601560f1dd9sqlsever数据存在就更新,不存在就插入的两种方法两种经常使用的方法:1. Update, if @@ROWCOUNT = 0 then insertUPDATETable1 SETColumn1 = @newValue WHEREId = @idIF@@ROWCOU

0评论2023-02-10605

更多推荐