版权声明:本文为博主原创文章,未经博主允许不得转载。 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. zookeeper与kafka安装搭建

    1.2181:对cline端提供服务 2.3888:选举leader使用 3.2888:集群内机器通讯使用(Leader监听此端口)

  2. 10.VScode Debug——2019年12月12日

    title: vscode debug date: "2019-09-17 16:17:16" tags: 技巧 categories: 技术驿站 1.为什么需要调试 写了很多行代 ...

  3. 【NLP新闻-2013.06.16】Representative Reviewing

    英语原文地址:http://nlp.hivefire.com/articles/share/40221/ 注:本人翻译NLP新闻只为学习专业英语和扩展视野,如果翻译的不好,请谅解! (实在是读不大懂, ...

  4. js-放大镜效果

    jd或者淘宝的具体商品有个放大镜的效果.虽然网上类似插件琳琅满目,应用到项目上有诸多不便,自己抽点时间自己写了个类似插件,积累下代码,何乐而不为呢!!let‘go: 打算把此特效封装成个插件,先把最基 ...

  5. 拦截Restful API的三种方式

    如题, 方式有三种. (1). 过滤器filter javaEE规范 (2). 拦截器interceptor springmvc提供 (3). 切片 aspect 一. Filter使用示例 impo ...

  6. Visual Studio Code 做PHP开发

    Visual Studio Code 做PHP开发 1. 在Windows 10环境下安装PHP: 1. 下载自己中意的PHP版本:http://windows.php.net/download (我 ...

  7. [CSP-S模拟测试]:树(树形DP+期望)

    题目描述 梦游中的你来到了一棵$N$个节点的树上.你一共做了$Q$个梦,每个梦需要你从点$u$走到点$v$之后才能苏醒,由于你正在梦游,所以每到一个节点后,你会在它连出去的边中等概率地选择一条走过去, ...

  8. 解决Mac下使用root 权限依旧无法读写文件的问题

    当时在学习selenium的时候,需要配合使用chromedriver 和phantomjs 进行浏览器的自动化测试.. chromedriver下载结束后.无法移动到/user/bin下面 会提示权 ...

  9. php与js互相调用

    php中调用js <?php echo '<script>var yearid=$("#yearId").val()</script>'; echo ...

  10. SoftDevice Specification v1.2

    S110 SoftDevice是蓝牙®低功耗(BLE)外设协议栈的解决方案.它集成了一个低 能量控制器和主机,并为建设蓝牙低功耗系统全面且灵活的API 芯片(SoC)解决方案. 本文件包含SoftDe ...