版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012974916/article/details/53316758

大家都知道MySQL的主从复制是明文传输的,这对一些特殊业务来说是不允许的,下面来尝试构建基于SSL的主从复制
环境:RHEL5.8 SELinux关闭,iptables关闭,MySQL 5.5.28-i686 tar包初始化安装(非编译)
规划:

master: 172.16.1.18  master.laoguang.me
    slave:  172.16.1.19  slave.laoguang.me

准备工作:hostname与规划一致,配置/etc/hosts做好解析,时间要同步,过程不再赘述,见http://laoguang.blog.51cto.com/6013350/1073891,mysql安装见http://laoguang.blog.51cto.com/6013350/1039208,数据目录为/data/mydata
一.在master上配置CA服务器,并为master,slave颁发证书
1.1 master建立CA服务器,过程见http://laoguang.blog.51cto.com/6013350/1035608
1.2 master的MySQL证书申请

mkdir /data/mydata/ssl
    cd /data/mydata/ssl
    openssl genrsa 1024 > mysql.key
    openssl req -new -key mysql.key -out mysql.csr -days 3650
    ##接下来的输入与建立CA时的一致,common name为master.laoguang.me
    openssl ca openssl ca -in mysql.csr -out mysql.crt ##为MySQL签证
    cp /etc/pki/CA/cacert.pem .  ##将CA的证书也拷过来
    chown mysql:mysql *
    chmod 600 *

1.3 slave上申请证书

mkdir /data/mydata/ssl
    cd /data/mydata/ssl
    openssl genrsa 1024 > mysql.key
    openssl req -new -key mysql.key -out mysql.csr -days 3650
    ##接下来的输入与建立CA时的一致,common name为slave.laoguang.me
    scp mysql.csr master:/root

1.4 master上为slave签发

cd /root
    openssl ca -in mysql.csr -out mysql.crt
    scp mysql.crt slave:/data/mydata/ssl
    scp /etc/pki/CA/cacert.pem slave:/data/mydata/ssl

1.5 slave上更改权限与属主

chown mysql:mysql mysql.*
    chmod 600 mysql.*

二.Master上编缉/etc/my.cnf启用ssl,并设置主从
2.1 修改/etc/my.cnf

[mysqld]
    log-bin=mysql-bin
    sync_binlog     = 1                  ##二进制日志
    server-id       = 1                  ##此id必须全局唯一
    innodb_flush_log_at_trx_commit=1    ##每秒将事务日志立刻刷写到磁盘
    ssl                     ##启用ssl默认是不开启的,mysql中show variables like '%ssl%'查看
    ssl_ca =/data/mydata/ssl/cacert.pem  ##ca文件的位置
    ssl_cert= /data/mydata/ssl/mysql.crt ##证书文件的位置
    ssl_key = /data/mydata/ssl/mysql.key ##私钥文件的位置

2.2 启动mysql,并查看ssl信息

service mysqld start
    mysql
    mysql> show variables like '%ssl%';
    +---------------+-----------------------------+
    | Variable_name | Value                       |
    +---------------+-----------------------------+
    | have_openssl  | YES                         |
    | have_ssl      | YES                         |
    | ssl_ca        | /data/mydata/ssl/cacert.pem |
    | ssl_capath    |                             |
    | ssl_cert      | /data/mydata/ssl/mysql.crt  |
    | ssl_cipher    |                             |
    | ssl_key       | /data/mydata/ssl/mysql.key  |
    +---------------+-----------------------------+

2.3 为同步建立一最小权限账户,并要求ssl

mysql> create user 'backup_ssl'@'172.16.1.19' identified by 'redhat';
    mysql> revoke all privileges,grant option from 'backup_ssl'@'172.16.1.19';
    mysql> grant replication slave,replication client on *.* to 'backup_ssl'@'172.16.1.19' require ssl;
    mysql> flush privileges;

三.Slave上编缉/etc/my.cnf,启用ssl,并设置主从
3.1 编缉/etc/my.cnf

[mysqld]
    server-id       = 2                  ##此id必须全局唯一
    ##log-bin = mysql-bin ##注释掉,从服务器不需要二进制日志
    relay-log = mysql-ralay              ##中继日志
    relay-log-index = mysql-ralay.index  ##中继目录
    read-only = 1 ##从服务器只读
    ssl                          ##启用ssl默认是不开启的,mysql中show variables like '%ssl%'查看
    ssl_ca =/data/mydata/ssl/cacert.pem  ##ca文件的位置
    ssl_cert= /data/mydata/ssl/mysql.crt ##证书文件的位置
    ssl_key = /data/mydata/ssl/mysql.key ##私钥文件的位置

3.2 启用mysqld并查看ssl相关信息

servie mysqld start
    mysql> show variables like '%ssl%';
    +---------------+-----------------------------+
    | Variable_name | Value                       |
    +---------------+-----------------------------+
    | have_openssl  | YES                         |
    | have_ssl      | YES                         |
    | ssl_ca        | /data/mydata/ssl/cacert.pem |
    | ssl_capath    |                             |
    | ssl_cert      | /data/mydata/ssl/mysql.crt  |
    | ssl_cipher    |                             |
    | ssl_key       | /data/mydata/ssl/mysql.key  |
    +---------------+-----------------------------+

3.3 启动slave同步进程,连接主服务器

mysql> change master to  
        -> master_host='172.16.1.18',
        -> master_user='backup_ssl',
        -> master_password='redhat',
        -> master_log_file='mysql-bin.000001',
        -> master_ssl=1,
        -> master_ssl_ca='/data/mydata/ssl/cacert.pem',
        -> master_ssl_cert='/data/mydata/ssl/mysql.crt',
        -> master_ssl_key='/data/mydata/ssl/mysql.key';
    mysql> start slave
    mysql> show slave status\G; ##查看slave状态

关注以下参数:

Slave_IO_Running: Yes      ##IOthread是否运行,如果为No代表slave运行不正常
    Slave_SQL_Running: Yes     ##SQLthread是否运行,如果为No代表slave运行不正常
    Master_SSL_CA_File: /data/mydata/ssl/cacert.pem  ##是否启用了ssl
    Master_SSL_Cert: /data/mydata/ssl/mysql.crt
    Master_SSL_Key: /data/mydata/ssl/mysql.key
    Master_Log_File: mysql-bin.000023                ##最后接收的主服务器的二进制
    Exec_Master_Log_Pos: 1087                        ##最后执行的位置,查看master中是不是该位置
    Last_IO_Errno: 0                                 ##最后一次IOthread有没有报错

如果与上图累似,slave基本正常,下面测试
四.测试
4.1 主服务器上建立一数据库

mysql> create database testssl;

4.2 从服务器上查看有没有同步过去

mysql> show databases;

如果同步成功,说明没有错误
4.3 从服务器mysql基于ssl连接主服务器,查看连接状态是否加密

mysql -ubackup_ssl -predhat -h172.16.1.18 --ssl-cert=/data/mydata/ssl/mysql.crt \
    --ssl-key=/data/mydata/ssl/mysql.key

查看连接状态

mysql> status;
    Current user:       backup_ssl@slave.laoguang.me
    SSL:            Cipher in use is DHE-RSA-AES256-SHA

由此可知连接是加密的,可以用tcpdump抓包测试
到此基于SSL的mysql主从同步构建完毕,如果你的从服务器是新加的,先将主服务器最近一次的完整备份恢复到从服务器,并从同步完整备份后的二进制日志,即change master时添加master_log_op=n, n代表完整备份后的二进制位置,其它的基本一致。
 
后记:今天尝试只给slave签发证书,master拥有有CA的证书,理论上应该能成功的,不过就是连接不上,所以暂时放弃,然后尝试master的证书名字为master.crt,slave的证书为slave.crt结果也连不上,后来google,把master与slave的证书,私钥都叫mysql.crt,mysql.key才得以完成,有了解的人说明一下,单证书为何不行,两个证书名称不一致也不行在原因,感谢!
---------------------
作者:紫絮慕雪
来源:CSDN
原文:https://blog.csdn.net/u012974916/article/details/53316758

https://blog.csdn.net/u012974916/article/details/53316758
版权声明:本文为博主原创文章,转载请附上博文链接!

基于SSL实现MySQL的加密主从复制的更多相关文章

  1. 基于SSL实现Mysql加密主从

    Mysql主从复制是明文传输的,对于一些特殊的场合是绝对不允许的,数据的安全性会受到威胁,在这里,简单的构建基于SSL的mysql主从复制 Ps:这里采用master-mysql为CA服务器 主端生成 ...

  2. 基于SSL的MySQL主从

    master 端 配置CA和证书 [root@baseos-1_192.168.31.140 ~]# cd /etc/pki/CA/ #生成根证书的私钥 [root@baseos-1_192.168. ...

  3. mysql -- mysql基于ssl的主从复制

    mysql基于ssl的主从复制由于mysql在复制过程中是明文的,所以就大大降低了安全性,因此需要借助于ssl加密来增加其复制的安全性. 主服务器node1:172.16.200.1从服务器node2 ...

  4. 基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下)

    基于Mysql-Proxy实现Mysql的主从复制以及读写分离(下) 昨天谈到了Mysql实现主从复制,但由于时间原因并未讲有关读写分离的实现,之所以有读写分离,是为了使数据库拥有双机热备功能,至于双 ...

  5. 基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上)

    基于Mysql-Proxy实现Mysql的主从复制以及读写分离(上) 上周BOSS给分配任务让实现一下Mysql数据库的主从复制以及读写分离,然后花了一盏茶的功夫进行了调研,发现主从复制数据库进行一番 ...

  6. (转) HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手、TCP/IP协议基础、加密学)

    HTTP & HTTPS网络协议重点总结(基于SSL/TLS的握手.TCP/IP协议基础.加密学) 原文:http://blog.csdn.net/itermeng/article/detai ...

  7. 基于SSL加密的vsftpd 服务器搭建和配置

    基于SSL加密的VSFTPD 服务器搭建和配置 1.安装 ubuntu系统:apt-get install vsftp lftp centos系统:yum install -y vsftpd ftp ...

  8. 基于Docker的Mysql主从复制

    基于Docker的Mysql主从复制搭建 为什么基于Docker搭建? 资源有限 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐 一台机器上可以运行多个Docker容器 Docker容器之间相 ...

  9. 基于GTID模式MySQL主从复制

    基于GTID模式MySQL主从复制 GTID复制原理:基于GTID的复制是MySQL 5.6后新增的复制方式GTID (global transaction identifier) 即全局事务ID, ...

随机推荐

  1. 微信小程序(12)--倒计时

    记录一个常见的效果,倒计时. <text>倒计时:{{content}}</text> Page({ /** * 页面的初始数据 */ data: { endTime: '', ...

  2. Oracle数据库同义词

    一.定义 同义词顾名思义,是数据库方案对象的一个别名.这里的数据库方案对象指表.视图.序列.存储过程.包等. 二.同义词的好处 1.不占内存空间,节省大量的数据库空间 2.简化了数据库对象的访问 3. ...

  3. wireshark 抓包加密

    使用openssl 加密传输数据 #是否使用SLL连接,1是使用SSLCon=1 配置文件配置是否开启ssl

  4. 【LeetCode】几何学 geometry(共2题)

    [587]Erect the Fence [892]Surface Area of 3D Shapes

  5. poj 2505 乘法博弈论

    转自:http://hzwer.com/1921.html 题目大意: 题意:Stan从1开始,可以乘上2~9中任何一个数,Ollie也如此操作,只到某个人本回合的操作超过N为之..1<N< ...

  6. .NET面试题集锦①

    一.前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳. 1.面向对象的思想主要包括什么? 答:任何事物都可以理解为对象,其主要特征: 继承.封装.多态.特点:代码好维护,安 ...

  7. controler--application配置

    <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...

  8. mybatis 动态Sql的模糊查询

    where teacher.tname like concat(concat(#{tName}),'%') 2:distinct的使用 下面先来看看例子: table    id name    1 ...

  9. shell脚本学习 (10) 从结构化文本提取数据

    1提取/ 后的数据 sed -e 's=/.*==' do.txt 2 sed -e 's=/.*=='\ -e 's=^\([^:]*\):\(.*\) \([^ ]*\)=\1:\3, \2=' ...

  10. php fmod()函数 语法

    php fmod()函数 语法 作用:fmod()函数的作用是两个数值做除法运算后的余数 语法:fmod(X,Y).大理石平台哪家好 参数: 参数 描述 X 必须,X为除数 Y 必须,被除数,如果Y为 ...