在这里我结合其他人写的资料加上我自己的总结谈谈ssl连接mysql,虽然网上好多人都写了很多教程但是中间省略了很多,最终导致我们配置失败,在这我详细的介绍一下,有些的不好的地方也希望大家多多指点

我们印象中的主从复制过程或远程连接到MySQL/MariaDB所有的链接通信中的数据都是明文的,在局域网内连接倒问题不大;要是在外网里访问数据或则复制,则安全隐患会被放大很多。由于项目要求需要直接和外网的一台实例进行同步。所以本文介绍下通过SSL加密的方式进行复制的方法,来进一步提高数据的安全性。本文会一起介绍MySQLMariaDB

环境搭建:

默认情况下ssl都是关闭的,要是have_ssl显示NO,则表示数据库不支持SSL,需要重新编译安装来支持它,显示为DISABLED表示我们的数据库只是关闭了SSL,并没有没有启用它。

我们通过show命令显示变量ssl

>show variableslike'%ssl%';+---------------+----------+

| Variable_name| Value|

+---------------+----------+

| have_openssl|DISABLED|

| have_ssl|DISABLED|

| ssl_ca||

| ssl_capath||

| ssl_cert||

| ssl_cipher||

| ssl_key||

+---------------+----------+

现在来开启SSL,在配置文件的mysqld选项组里面添加:

ssl

重启数据库,再次查看:

show variableslike'%ssl%';

+---------------+-------+

| Variable_name| Value|

+---------------+-------+

| have_openssl|YES|

| have_ssl|YES|

| ssl_ca||

| ssl_capath||

| ssl_cert||

| ssl_cipher||

| ssl_key||

+---------------+-------+

接着就是配置SSL的重点了:

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

在这需要注意一点就是生成证书时你需要填写各种配置信息包括所在国家,你的姓名,公司名等在这要保证 生成CA根证书  根据提示填写各个字段但注意 Common Name 最好是有效根域 ( freedomwind.com ),   并且不能和后来服务器证书签署请求文件中填的 Common Name 完全一样,否则会导致证书生成的时候出现如下错误:error 18 at 0 depth lookup:self signed certificate 错误  

正常验证证书的有效性应该会提示:

shell> openssl verify -CAfile ca.pemserver-cert.pem client-cert.pem

server-cert.pem: OK

client-cert.pem: OK

 

 接下来我们开始配置: 

openssl genrsa 2048> ca-key.pem

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

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

openssl req-newkey rsa:2048-days1000-nodes-keyoutserver-key.pem> server-req.pem

openssl x509 -req-in server-req.pem-days1000-CA ca-cert.pem-CAkey ca-key.pem-set_serial01> server-cert.pem

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

openssl req-newkey rsa:2048-days1000-nodes-keyoutclient-key.pem> client-req.pem

openssl x509 -req-in client-req.pem-days1000-CA ca-cert.pem-CAkey ca-key.pem-set_serial01> client-cert.pem

上面的操作都是在主上执行的,并且都在/etc/mysql/目录下执行的。 这里需要注意的是MySQLMariaDB不同:

MySQL在生成上面证书的时候需要输入大量用户信息,在CA上创建证书要注意所有的用户信息要和CA中的 一致 ,从国家到部门都要相同,否则会造成证书无法使用,直接全部默认回车即可。要是用户信息一样则MariaDB会报错

ERROR2026 (HY000):SSLconnection error: error:00000001:lib(0):func(0):reason(1)

[ERROR] Slave I/O:errorconnectingto master ... - retry-time:60 retries:86400 message:SSL connection error: error:14090086:SSLroutines:SSL3_GET_SERVER_CERTIFICATE:certificate verifyfailed, Internal MariaDBerror 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.pemclient-cert.pemclient-key.pem复制给从服务器 

重启主服务器,查看SSL的情况:

>show variableslike'%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: Unableto get privatekeyfrom'/etc/mysql/server-key.pem'

14122911:09:02[Warning] Failed to setup SSL

14122911:09:02[Warning] SSLerror: Unable to get privatekey

发现服务端的key不可用,在网上到了解决办法,大家可以自己看:http://askubuntu.com/questions/194074/enabling-ssl-in-mysql ,概括的说就是openssl新版本的变化导致的,这里有2个解决办法来重新生成server-key.pem:

方法1:openssl rsa

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

再次查看SSL情况:

>show variableslike'%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:这里也可以直接安装openssl0.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

GRANTREPLICATION SLAVEON*.*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 -p

Enter password:

SSL error: Unableto get privatekeyfrom'client-key.pem'

ERROR 2026 (HY000): SSL connection error

同理,也是SSL的问题导致的,重新生成client-key.pem,方法同重新生成server-key.pem一样:

openssl rsa-in client-key.pem-outclient-key.pem

继续用SSL测试连接:

$mysql--ssl-ca=ca-cert.pem--ssl-cert=client-cert.pem--ssl-key=client-key.pem -h192.168.200.245 -urep -p

Enter password:

Welcome to the MySQL monitor. Commandsendwith ;or \g.

Your MySQL connection idis763

Server version:5.5.35-0ubuntu0.12.04.2-log (Ubuntu)

Copyright (c) 2000,2014, Oracleand/or its affiliates.All rightsreserved.

Oracle is a registered trademarkof OracleCorporationand/or its

affiliates. Other names maybetrademarksof their respective

owners.

Type 'help;'or'\h'for help. Type'\c'to clear thecurrent input statement.

mysql> \s

--------------

mysql Ver14.14 Distrib5.5.37,for debian-linux-gnu (x86_64)using readline6.2

Connection id: 763

Currentdatabase:

Currentuser:rep@192.168.200.212

SSL: Cipher in use is DHE-RSA-AES256-SHA

Current pager: stdout

Using outfile: ''

Using delimiter: ;

Server version:5.5.35-0ubuntu0.12.04.2-log (Ubuntu)

Protocol version:10

Connection: 192.168.200.245 via TCP/IP

Server characterset: utf8mb4

Db characterset: utf8mb4

Client characterset: utf8

Conn. characterset: utf8

TCP port: 3306

Uptime: 22min52 sec

Threads: 3 Questions:2325 Slowqueries:1 Opens:7483 Flush tables:1Open tables:100 Queries per secondavg:1.694

SSL测试连接成功,并且登入的SSL协议是: Cipher in useisDHE-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 variableslike'%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 MASTERTO 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:

>createtable tmp_1229(idint,namevarchar(100))default charset utf8;

>insertinto tmp_1229values(1,'a'),(2,'b'),(3,'c');

>select*from tmp_1229;

+------+------+

| id| name|

+------+------+

|1| a|

|2| b|

|3| c|

+------+------+

S:

>select*from tmp_1229;

+------+------+

| id| name|

+------+------+

|1| a|

|2| b|

|3| c|

+------+------+

 

以上同步成功。

总结:

SSL(Secure Sockets Layer安全套接层),及其继任者传输层安全(Transport Layer SecurityTLS)是为网络通信提供安全及数据完整性的一种安全协议。复制默认是明文进行传输的,通过SSL加密可以大大提高数据的安全性。在上面的过程中,遇到一些问题:

1:openssl版本问题引起的证书不可用,文中已经说明解决办法。

2:MariaDB证书的不可用,原因是生成服务端客户端证书的时候输入一致导致的,文中也说明了解决办法。

3:要是配置有问题,在用SSL登陆的时候,可以发现错误信息,可以直接定位到哪里出问题。

ssl登陆:

mysql--ssl-ca=ca-cert.pem--ssl-cert=client-cert.pem--ssl-key=client-key.pem -h192.168.200.245 -urep -p

4:在配置MariaDB的时候,在生成证书的时候可以直接先验证,查看是否有问题。

验证:

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

5:要是openssl版本没有问题,不需要再次通过openssl rsa再次生成,具体的安装配置方法参照本文章即可。

                                             Windows客户端连接

在这我使用的是navicat-premium11.1

打开数据库管理工具后点击左上角的新建连接,选择mysql之后我们点击常规选项数据我们数据库的地址账户名与密码然后再点击ssl,进去之后把我们在server端生成的ca.pem(CA证书),client-cert.pem(客户端证书),client-key.pem(客户端秘钥)t填入进去即可,单机测试连接显示测试成功。

                                           linux客户端连接

配置好mysql客户端的配置文件后我们 mysql --ssl-ca=ca.pem--ssl-cert=client-cert.pem --ssl-key=client-key.pem -h192.168.1.115 -utest1 -p进行连接服务器

 

 

Logo

更多推荐