MySQL(MariaDB)的 SSL 加密仿制51CTO博客 - 众发娱乐

MySQL(MariaDB)的 SSL 加密仿制51CTO博客

2019年03月09日15时37分05秒 | 作者: 怀瑶 | 标签: 仿制,证书,生成 | 浏览: 3003

布景:

      在默许的主从仿制进程或长途衔接到MySQL/MariaDB一切的链接通信中的数据都是明文的,在局域网内衔接倒问题不大;要是在外网里拜访数据或则仿制,则安全隐患会被扩大许多。因为项目要求需求直接和外网的一台实例进行同步。所以本文介绍下经过SSL加密的办法进行仿制的办法,来进一步进步数据的安全性。本文会一同介绍MySQL和MariaDB。

环境建立:

默许状况下ssl都是封闭的,要是have_ssl显现NO,则表明数据库不支撑SSL,需求从头编译装置来支撑它,显现为DISABLED表明支撑SSL,但没有敞开。

>show variables like %ssl%;                                                                                                  +-++| Variable_name | Value    |+-++| have_openssl  | DISABLED || have_ssl      | DISABLED || ssl_ca        |          || ssl_capath    |          || ssl_cert      |          || ssl_cipher    |          || ssl_key       |          |+-++

现在来敞开SSL,在装备文件的mysqld选项组里边增加:

ssl

重启数据库,再次检查:

show variables like %ssl%;+-+-+| Variable_name | Value |+-+-+| have_openssl  | YES   || have_ssl      | YES   || ssl_ca        |       || ssl_capath    |       || ssl_cert      |       || ssl_cipher    |       || ssl_key       |       |+-+-+

接着就是装备SSL的重点了:

1:在主服务器上创立CA证书:

openssl genrsa 2048 > ca-key.pem

openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem

2:在主服务器上创立服务端的证书:

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem

openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem

3:在主服务器上创立客户端的证书:

openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem

openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem

上面的操作都是在主上履行的,而且都在/etc/mysql/ 目录下履行的。这儿需求留意的是MySQL和MariaDB不同:

MySQL在生成上面证书的时分需求输入很多用户信息,在CA上创立证书要留意一切的用户信息要和CA中的共同,从国家到部分都要相同,不然会形成证书无法运用,直接悉数默许回车即可。要是用户信息相同则MariaDB会报错:

 ERROR 2026 (HY000): SSL connection error: error:00000001:lib(0):func(0):reason(1)

[ERROR] Slave I/O: error connecting to master ... - retry-time: 60  retries: 86400  message: SSL connection error: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed, Internal MariaDB error code: 2026

MariaDB在生成上面证书的时分也是需求输入很多用户信息,和MySQL不同的是输入的用户信息服务端和客户端不能共同。即服务端输入和客户端输入不相同。详细原因见这儿,最终能够经过:

openssl verify -CAfile /etc/mysql/ca-cert.pem /etc/mysql/server-cert.pem /etc/mysql/client-cert.pem

 验证MariaDB证书的有效性。好了,一切的证书现已生成,那么在主上需求修正装备文件,把生成的证书装备起来:

ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem

而且把生成的证书:ca-cert.pem,client-cert.pem,client-key.pem 仿制给从服务器。

重启主服务器,检查SSL的状况:

>show variables like %ssl%;+-++| Variable_name | Value                      |+-++| have_openssl  | DISABLED                   || have_ssl      | DISABLED                   || ssl_ca        | /etc/mysql/ca-cert.pem     || ssl_capath    |                            || ssl_cert      | /etc/mysql/server-cert.pem || ssl_cipher    |                            || ssl_key       | /etc/mysql/server-key.pem  |+-++

发现have_ssl变成了DISABLED,检查过错日志:

SSL error: Unable to get private key from /etc/mysql/server-key.pem141229 11:09:02 [Warning] Failed to setup SSL141229 11:09:02 [Warning] SSL error: Unable to get private key

发现服务端的key不可用,在网上到了处理办法,我们能够自己看:http://askubuntu.com/questions/194074/enabling-ssl-in-mysql,归纳的说就是openssl新版别的改变导致的,这儿有2个处理办法来从头生成server-key.pem:

办法1:openssl rsa

openssl rsa -in server-key.pem -out server-key.pem

再次检查SSL状况:

>show variables like %ssl%;+-++| Variable_name | Value                      |+-++| have_openssl  | YES                        || have_ssl      | YES                        || ssl_ca        | /etc/mysql/ca-cert.pem     || ssl_capath    |                            || ssl_cert      | /etc/mysql/server-cert.pem || ssl_cipher    |                            || ssl_key       | /etc/mysql/server-key.pem  |+-++

办法2:这儿也能够直接装置openssl的0.9.8x版别进行证书生成。

wget http://www.openssl.org/source/openssl-0.9.8x.tar.gz 
tar xvfz openssl-0.9.8x.tar.gz 
cd openssl-0.9.8x 
./config prefix=/usr/local/openssl-0.9.8 make 
make install

本文是经过办法1来进行处理的。

到此在主上的操作完结,再生成一个仿制帐号:REQUIRE SSL

GRANT REPLICATION SLAVE ON *.* TO rep@192.168.200.% IDENTIFIED BY 123456 REQUIRE SSL;

接着就去从上装备。之前现已把生成的证书给了从服务器,那么在装备之前能够用SSL衔接主服务器试试:

$mysql ssl-ca=ca-cert.pem ssl-cert=client-cert.pem ssl-key=client-key.pem -h192.168.200.245 -urep -pEnter password: 
SSL error: Unable to get private key from client-key.pemERROR 2026 (HY000): SSL connection error

同理,也是SSL的问题导致的,从头生成client-key.pem,办法同从头生成server-key.pem相同:

openssl rsa  client.pem out client

持续用SSL测验衔接:

$mysql ssl-ca=ca-cert.pem ssl-cert=client-cert.pem ssl-key=client-key.pem -h192.168.200.245 -urep -pEnter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 763Server version: 5.5.35-0ubuntu0.12.04.2-log (Ubuntu)

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type help; or \h for help. Type \c to clear the current input statement.

mysql> \smysql  Ver 14.14 Distrib 5.5.37, for debian-linux-gnu (x86_64) using readline 6.2Connection id:        763Current database:    
Current user:        rep@192.168.200.212SSL:            Cipher in use is DHE-RSA-AES256-SHACurrent pager:        stdout
Using outfile:        Using delimiter:    ;
Server version:        5.5.35-0ubuntu0.12.04.2-log (Ubuntu)
Protocol version:    10Connection:        192.168.200.245 via TCP/IP
Server characterset:    utf8mb4
Db     characterset:    utf8mb4
Client characterset:    utf8
Conn.  characterset:    utf8
TCP port:        3306Uptime:            22 min 52 sec

Threads: 3  Questions: 2325  Slow queries: 1  Opens: 7483  Flush tables: 1  Open tables: 100  Queries per second avg: 1.694

SSL测验衔接成功,而且登入的SSL协议是:Cipher in use is DHE-RSA-AES256-SHA

持续在从上装备SSL:

ssl
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/client-cert.pem
ssl-key=/etc/mysql/client-key.pem

检查SSL是否被支撑:

>show variables like %ssl%;+-++| Variable_name | Value                      |+-++| have_openssl  | YES                        || have_ssl      | YES                        || ssl_ca        | /etc/mysql/ca-cert.pem     || ssl_capath    |                            || ssl_cert      | /etc/mysql/client-cert.pem || ssl_cipher    |                            || ssl_key       | /etc/mysql/client-key.pem  |+-++

从上SSL也被正确支撑,那么最终开端装备主从replicate。在从上CHANGE:

CHANGE MASTER TO MASTER_HOST=192.168.200.245, MASTER_USER=rep, MASTER_PASSWORD=123456, MASTER_LOG_FILE=mysql-bin.000042, MASTER_LOG_POS=521, MASTER_SSL=1, MASTER_SSL_CA = /etc/mysql/ca-cert.pem, MASTER_SSL_CERT = /etc/mysql/client-cert.pem, MASTER_SSL_KEY = /etc/mysql/client-key.pem

测验:

M:

>create table tmp_1229(id int,name varchar(100))default charset utf8;>insert into tmp_1229 values(1,a),(2,b),(3,c);>select * from tmp_1229;+++| id   | name |+++|    1 | a    ||    2 | b    ||    3 | c    |+++

S:

   id    name       a          b          c

以上同步成功。

总结:

      SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信供给安全及数据完整性的一种安全协议。仿制默许是明文进行传输的,经过SSL加密能够大大进步数据的安全性。在上面的进程中,遇到一些问题:

1:openssl版别问题引起的证书不可用,文中现已阐明处理办法。

2:MariaDB 证书的不可用,原因是生成服务端客户端证书的时分输入共同导致的,文中也阐明了处理办法。

3:要是装备有问题,在用SSL登陆的时分,能够发现过错信息,能够直接定位到哪里出问题。

ssl登陆:
mysql

4:在装备MariaDB的时分,在生成证书的时分能够直接先验证,检查是否有问题。

验证:
openssl verify CAfile etcmysqlcacert.pem etcmysqlservercert.pem etcmysqlclientcert.pem

/etc/mysql/server-cert.pem: OK
/etc/mysql/client-cert.pem: OK

5:要是openssl版别没有问题,不需求再次经过openssl rsa 再次生成,详细的装置装备办法参照本文章即可。

更新(2016.3.19):

今日做了MySQL5.7的SSL仿制,5.7装置的时分就现已在数据目录下面生成了上面的这些pem文件,所以直接把client的pem仿制到从上去就能够了(留意仿制曩昔之后修正权限,属主改成mysql即可)。不然报错:

Failed to set up SSL because of the following SSL library error: Unable to get certificate ... server-cert.pem
Failed to set up SSL because of the following SSL library error: Unable to get private key ... server-cert.pem

 

更多信息:

https://blog.marceloaltmann.com/en-mysql-replication-with-ssl-pt-replicacao-em-mysql-com-ssl/

http://www.zhengdazhi.com/?p=856

http://dev.mysql.com/doc/refman/5.5/en/replication-solutions-ssl.html

https://dev.mysql.com/doc/refman/5.7/en/replication-solutions-secure-connections.html

 


版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1
  • 2

    (转)sshdITeye

    运用,设定,这个
  • 3

    几种监控用守时使命ITeye

    监控,网络连接,进程
  • 4

    Ubuntu下装置php扩展ITeye

    装置,扩展,办法
  • 5
  • 6
  • 7
  • 8

    浅谈https\ssl\数字证书(2)ITeye

    证书,数字证书,客户端
  • 9
  • 10