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

当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,可以从日志中得知是无权限获取私钥

时间: 2015-12-21

Apache、SSL、MySQL和PHP平滑无缝地安装

为了这个任务所需的工具是: Apache-一个网站服务器  Mod_SSL-一个安全套接字层(SSL)的模块  OpenSSL-开放源代码工具箱(mod_ssl所需)  RSARef-仅对美国用户  MySQL-一个数据库服务器  PHP-一种脚本语言  "条条大路通罗马"--因此这只是很多能达到我们要求的配置之一.我选择这样的配置,是因为它是最简单和最快的一种.选择Mod_SSL/OpenSSL的原因是因为我有它的先前经验,是最快配置和最容易安装的一种.为了彼此方便地与Apache集

通过mysql show processlist 命令检查mysql锁的方法

processlist命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令. 1.      进入mysql/bin目录下输入mysqladmin processlist; 2.      启动mysql,输入show processlist; 如果有SUPER权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程). 得到数据形式如下(只截取了三条): mysql> show processlist; +---

linux系统中使用openssl实现mysql主从复制

        证书准备: CA证书: 第一步:创建CA私钥 [root@localhost CA]# (umask 066;openssl genrsa -out /etc/pki/CA/private/cakey.pem 2048) 第二步:生成自签证书 [root@localhost CA]# openssl req -new -x509 -key /etc/pki/CA/private/cakey.pem  -days 7300 -out /etc/pki/CA/cacert.pem -

MySQL 使用 SSL 连接配置详解

查看是否支持 SSL 首先在 MySQL 上执行如下命令, 查询是否 MySQL 支持 SSL: mysql> SHOW VARIABLES LIKE 'have_ssl'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | have_ssl | YES | +---------------+-------+ 1 row in set (0.02 sec) 当 have_ssl 为 YE

多种不同的 MySQL 的 SSL 配置

在这篇博客的帖子里,我将会描述不同的使用MySQL数据库的SSL配置方法. SSL给了你什么? 你可以通过互联网使用 MySQL 复制特性(replication) 或者通过互联网连接到MySQL. 还有可能是你通过企业网去连接,这样会有很多人访问.如果你使用一个自带设备(BYOD)网络,这就更是一个问题了. SSL在这里通过加密网络防止有针对性的监听.在与正确的服务器进行交互时,可以有效应对中间人攻击(man-in-the-middle attacks). 你还可以使用SSL客户端证书,让它同

processlist命令 查看mysql 线程

1. 进入mysql/bin目录下输入mysqladmin processlist; 2. 启动mysql,输入show processlist(关闭某一线程 kill id;); 如果有 SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程). 得到数据形式如下(只截取了三条): mysql> show processlist; +-----+-------------+--------------------+-------+---

mysql show processlist 显示mysql查询进程

1.进入mysql/bin目录下输入mysqladmin processlist; 2.启动mysql,输入show processlist; 如果有 SUPER 权限,则可以看到全部的线程,否则,只能看到自己发起的线程(这是指,当前对应的MySQL帐户运行的线程). 得到数据形式如下(只截取了三条): mysql> show processlist; +-----+-------------+--------------------+-------+---------+-------+----

apache+mysql+php+ssl服务器之完全安装攻略

目的我们的目标是安装一个允许我们托管多个网站的web服务器,其中一些是针对电子商务的安全解决方案,而大部分网站是通过连接一个数据库服务器并且提取其数据的脚本驱动的.为了这个任务所需的工具是:Apache-一个网站服务器Mod_SSL-一个安全套接字层(SSL)的模块OpenSSL-开放源代码工具箱(mod_ssl所需)RSARef-仅对美国用户MySQL-一个数据库服务器PHP-一种脚本语言 "条条大路通罗马"--因此这只是很多能达到我们要求的配置之一.我选择这样的配置,是因为它是最简

mysql通过ssl的方式生成秘钥具体生成步骤

-- mysql ssl 生成秘钥 1 check ssl是否已经开启 mysql> show variables like '%ssl%'; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | | have_ssl | DISABLED | | ssl_ca | | | ssl_capath | | | ssl_cert |

java实现的AES秘钥生成算法示例

本文实例讲述了java实现的AES秘钥生成算法.分享给大家供大家参考,具体如下: import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; public class Test { public static void main(String[] args) { g

centos6.5配置ssh免秘钥登陆执行pssh命令的讲解

1.检查并安装pssh,yum list pssh 2.因为没有配置免秘钥登陆,pssh命令执行失败. [root@bogon ]# pssh -H root@192.168.245.129 -i uptime [1] 11:00:36 [FAILURE] root@192.168.245.129 Exited with error code 255 Stderr: The authenticity of host '192.168.245.129 (192.168.245.129)' can'

Linux下实现SSH免密码登录和实现秘钥的管理、分发、部署SHELL脚本分享

环境: ssh server: 192.168.100.29  server.example.com ssh client: 192.168.100.30  client.example.com 通过root用户建立秘钥认证实现SHELL脚本管理,分发,部署 首先client端创建秘钥对,并将公钥分发给需要登录的SSH服务端 注:公钥相当于锁,私钥相当于钥匙,我们这里相当于在客户端创建一对钥匙和锁,想要做到SSH免密码登录,就相当于我们将锁分发到服务端并装锁,然后客户端就可以利用钥匙开锁. 一.

java加密算法--MD5加密和哈希散列带秘钥加密算法源码

java加密算法--MD5加密和哈希散列带秘钥加密算法源码 最近学习加密算法的知识,利用MD5 加密,百度一下网上资料很多,不是很详细,这里就整理下如何实现用MD5加密和 哈希散列带秘钥加密算法,大家可以看下. 实现代码: package com.ompa.common.utils; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import javax.crypto.Mac;

Python内置方法实现字符串的秘钥加解密(推荐)

在实际编程开发中,我们会使用到各类的加密算法来对数据和信息进行加密.比如密码中比较常见的MD5加密,以及AES加密等等. 对于密码认证来说,MD5加密是比较适合的,因为其不需要接触到明文的数据,只需要比对MD5加密后的哈希值就能判断数据是否一致:而对于一些在加密后进行解密的数据而言,AES则更加的常用. 在Python中实现AES算法需要借助的第三方库Crypto,其在各个操作系统上的安装方法有些许复杂,所以对于简单的使用有点杀鸡用牛刀的意思.在Mrdoc的开发过程中,我们就遇到了这样的问题.一

php连接MySQL的两种方式对比

记录一下PHP连接MySQL的两种方式. 先mock一下数据,可以执行一下sql. /*创建数据库*/ CREATE DATABASE IF NOT EXISTS `test`; /*选择数据库*/ USE `test`; /*创建表*/ CREATE TABLE IF NOT EXISTS `user` ( name varchar(50), age int ); /*插入测试数据*/ INSERT INTO `user` (name, age) VALUES('harry', 20), ('