Mysql-SSL加密

Openssl

SSL协议提供的服务主要有:
认证用户和服务器,确保数据发送到正确的客户机和服务器;
加密数据以防止数据中途被窃取;
维护数据的完整性,确保数据在传输过程中不被改变。

为了在MySQL服务器和客户端之间建立SSL联接,服务器系统必须满足:
操作系统安装有OpenSSL或yaSSL;
安装的MySQL版本必须支持SSL。
这里使用OpenSSL。

1.yum install openssl openssl-devel openssl098e
shell>rpm -qa | grep openssl #检查是否安装OpenSSL。MySQL需要openssl的共享库。
openssl-1.0.0-20.el6.x86_64
openssl-devel-1.0.0-20.el6.x86_64
openssl098e-0.9.8e-17.el6.x86_64

2.
mysql> show global variables like ‘have%ssl’; #检查是否支持ssl。NO表示不支持,DISABLE表示支持但未使用
+―――――+―――-+
| Variable_name | Value |
+―――――+―――-+
| have_openssl | DISABLED |
| have_ssl | DISABLED |

3.
如果是使用编译好的二进制,那默认都支持,如果自行编译,针对5.5版本,需要使用cmake . -DWITH_SSL=system选项。
shell>mkdir -p /data/ssl
shell>cd /data/ssl
#以下创建认证机构的数字认证证书,后续服务器端和客户端的证书都使用该认证机构进行签署。
shell>openssl genrsa 2048 > ca-key.pem
Generating RSA private key, 2048 bit long modulus
………+++
…………………………………………………………………………………………………..+++
e is 65537 (0×10001)

shell>openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca-cert.pem
#openssl req -new -x509 -key cakey.pem -out cacert.pem -days 36500
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.

Country Name (2 letter code) [GB]:CN *
State or Province Name (full name) [Berkshire]:SHENZHEN *
Locality Name (eg, city) [Newbury]:SHENZHEN *
Organization Name (eg, company) [My Company Ltd]:CA *
Organizational Unit Name (eg, section) []:MYSQL
Common Name (eg, your name or your server’s hostname) []:master
Email Address []:

为master发证书
openssl genrsa -out master.key 2048
#openssl req -new -key master.key -out master.csr -days 36500

#以下创建服务器端证书
shell>openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
Generating a 2048 bit RSA private key
……………….+++
…………+++
writing new private key to ‘server-key.pem’

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.

Country Name (2 letter code) [GB]:CN *
State or Province Name (full name) [Berkshire]:SHENZHEN *
Locality Name (eg, city) [Newbury]:SHENZHEN *
Organization Name (eg, company) [My Company Ltd]:CH *
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:mysqlserver *
Email Address []:
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []:

shell>openssl rsa -in server-key.pem -out server-key.pem #移除server-key中的passphrase【可选】
writing RSA key
shell>openssl x509 -req -in server-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem #签署服务端证书
Signature ok
subject=/C=CN/ST=Hangzhou/L=Hangzhou/O=CH/CN=mysqlserver
Getting CA Private Key

#以下创建客户端证书
shell>openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
Generating a 2048 bit RSA private key
………………………………………………………………………………………+++
…+++
writing new private key to ‘client-key.pem’

You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.

Country Name (2 letter code) [GB]:CN *
State or Province Name (full name) [Berkshire]:SHENZHEN *
Locality Name (eg, city) [Newbury]:SHENZHEN *
Organization Name (eg, company) [My Company Ltd]:CH *
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) []:mysqlclient *
Email Address []:
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:password

An optional company name []:
shell>openssl rsa -in client-key.pem -out client-key.pem #移除client-key中的passphrase【可选】
writing RSA key

shell>openssl rsa -in client-key.pem -out client-key.pem #移除client-key中的passphrase【可选】
writing RSA key
shell>openssl x509 -req -in client-req.pem -days 3600 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem #签署客户端证书
Signature ok
subject=/C=CN/ST=Hangzhou/L=Hangzhou/O=CH/CN=mysqlclient
Getting CA Private Key
#生成完毕后,验证下
shell>openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK

经过上述步骤,就生成了如下文件:
ca-cert.pem在服务器端和客户端都是用--ssl-ca=ca-cert.pem
server-cert.pem,server-key.pem 服务器端指定--ssl-cert=server-cert.pem和--ssl-key=server-key.pem
client-cert.pem,client-key.pem 客户端指定--ssl-cert=client-cert.pem和--ssl-key=client-key.pem

把生成的证书复制到从服并授文件权限
chown -R mysql.mysql /data/ssl/

配置主从后

再配置文件my.conf增加以下参数后重启mysql
change master to master_ssl=1;
change master to master_ssl_ca=‘/data/ssl/ca-cert.pem‘;
change master to master_ssl_cert=‘/data/ssl/server-cert.pem‘;
change master to master_ssl_key=‘/data/ssl/server-key.pem‘;

在主服为从服授权x509 或 ssl
grant replication client,replication slave on *.* to [email protected]‘192.168.1.84‘ require ssl;

grant replication client,replication slave on *.* to [email protected]‘192.168.1.84‘ identified by ‘password‘;

再自行SSL加密授权:
grant replication client,replication slave on *.* to [email protected]‘192.168.1.84‘ require x509;

4.
配置SSL连接
如下两种方案均可以实现使用SSL进行配置和赋权。
【方案一】
Server:
在服务器端的配置文件my.cnf中添加如下参数:
[mysqld]
ssl-cert=/data/ssl/server-cert.pem
ssl-key=/data/ssl/server-key.pem
重启mysqld。
用户赋权,用GRANT语句的REQUIRE SSL选项
如:
mysql>create user [email protected] identified by ‘arbt2015‘;
mysql>grant select on *.* to [email protected] require ssl;
Client:
mysql -u cert -parbt2015 -P 3306 --ssl-ca=ca-cert.pem
【方案二】
Server:
在服务器端的配置文件my.cnf中添加如下参数:
[mysqld]
ssl
ssl-ca=/data/ssl/ca-cert.pem
ssl-cert=/data/ssl/server-cert.pem
ssl-key=/data/ssl/server-key.pem
重启mysqld。
用户赋权,用GRANT语句的REQUIRE x509选项
如:
mysql>create user [email protected] identified by ‘arbt2015‘;
mysql>grant select on *.* to [email protected] require x509;
mysql -u cert -p -P 3306 --ssl-ca=ca-cert.pem --ssl-key=client-key.pem --ssl-cert=client-cert.pem
#mysql -ucert -p --ssl-ca=ca-cert.pem --ssl-key=client-key.pem --ssl-cert=client-cert.pem

5.
配置完成后,可以如下方式查看自身对ssl的支持:
mysql> show global variables like ‘%ssl%‘; #查看服务器是否支持SSL连接
+---------------+-------------------------+
| Variable_name | Value                   |
+---------------+-------------------------+
| have_openssl  | YES                     |
| have_ssl      | YES                     |
| ssl_ca        | /db/ssl/ca-cert.pem     |
| ssl_capath    |                         |
| ssl_cert      | /db/ssl/server-cert.pem |
| ssl_cipher    |                         |
| ssl_crl       |                         |
| ssl_crlpath   |                         |
| ssl_key       | /db/ssl/server-key.pem  |
+---------------+-------------------------+
mysql> SHOW STATUS LIKE ‘Ssl_cipher‘; #查看本连接是否是SSL加密的连接
+―――――+――――――+
| Variable_name | Value |
+―――――+――――――+
| Ssl_cipher | DHE-RSA-AES256-SHA |
+―――――+――――――+

时间: 2024-09-05 10:46:59

Mysql-SSL加密的相关文章

Tomcat JDBC 认证 MySQL SSL加密

最近公司做三级认证,也没怎么更新java博客,近期忙完则更新.其中三级认证有一项感觉很有意思: 一般公司MySQL/Mariadb Tomcat做JDBC认证一般是这样的: db.default.driver=com.mysql.jdbc.Driverdb.default.url="jdbc:mysql://url.to.database/database" db.default.user= "..."     //MySQL用户名 db.default.passw

基于SSL加密的MySQL主从复制

主主mysql搭建我就不多叙述了 由于公司需求要基于公网的mysql主主复制,对数据隐私保护的要求极为严格,通过局域网或广域网复制数据都需要加密,一般都是基于公网才做,需用到ssl隧道.废话不多说 环境:Centos6.5 master1:192.168.1.10 master2: 192.168.1.30 查看是否开启ssl show variables like '%ssl%'; 开启ssl vim /etc/my.cnf [mysqld] ssl 配置CA服务器 vim /etc/pki/

MySQL(十五)之基于ssl加密搭建含有gtid特性的MySQL主从复制

一.什么是GTID 自MySQL 5.6引入的GTID(Global Transaction ID)使得其复制功能的配置.监控及管理变得更加易于实现,且更加健壮.官方文档在这篇文档里,我们可以知道全局事务 ID 的官方定义是:GTID = source_id:transaction_id gtid是一个 unique 唯一的表示符,他是由服务器的uuid 全局唯一标识,是由128位的随机符组成,mysql-5.6是依靠server-id和uuid 来标识复制架构中的每一个主机,因为是128位的随

MySQL主从ssl加密传输报错解决

案例:今天实施MySQL主从+SSL加密传输时候,master为slave签署证书有一个小小问题: failedto update database TXT_DBerror number 2 一开始没留意,最后导致在slave通过证书连接master时候报错证书错误.仔细检查才看到错误. 1.报错原因: This thing happens when certificates share common data. You cannot have two  certificates that lo

MySQL 5.7 的SSL加密方法

MySQL 5.7 的SSL加密方法 MySQL 5.7.6或以上版本 (1)创建证书开启SSL验证--安装opensslyum install -y opensslopenssl versionOpenSSL 1.0.1e-fips 11 Feb 2013 --安装证书/usr/local/mysql/bin/mysql_ssl_rsa_setup   --datadir=/data/mysql/mysql3306/data --修改权限chown -R mysql:mysql /data/m

mysql5.7:mysql安装和基于SSL加密的主从复制(详细剖析)

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 目录: --------mysql-5.7.13简介及安装 --------配置mysql-5.7.13的ssl加密传输 --------基于SSL加密传输实现mysql-5.7.13的主从复制 一. Mysql5.7.13简介 1. Mysql5.7的主要优化 mysql5.7原生支持centos7.*版本的systemd 更好的性能:对于多核

MySQL(MariaDB)的 SSL 加密复制

背景: 在默认的主从复制过程或远程连接到MySQL/MariaDB所有的链接通信中的数据都是明文的,在局域网内连接倒问题不大:要是在外网里访问数据或则复制,则安全隐患会被放大很多.由于项目要求需要直接和外网的一台实例进行同步.所以本文介绍下通过SSL加密的方式进行复制的方法,来进一步提高数据的安全性.本文会一起介绍MySQL和MariaDB. 环境搭建: 默认情况下ssl都是关闭的,要是have_ssl显示NO,则表示数据库不支持SSL,需要重新编译安装来支持它,显示为DISABLED表示支持S

MySQL的SSL加密连接与性能开销

前言 在生产环境下,安全总是无法忽视的问题,数据库安全则是重中之重,因为所有的数据都存放在数据库中.MySQL在5.7版本之前对于安全问题的确考虑并不充分,导致存在比较大的隐患,比如下面的这些问题,可能有些小伙伴知道,有些却还不知道: MySQL数据库默认安装的用户密码为空 所有用户拥有对于MySQL默认安装test数据库的访问权限(即使没有授予权限) 好在Oracle官方也已经意识到安全的重要性,MySQL 5.7开始安装完成后的root用户的密码不再是空,而是在安装时随机产生一个密码,这也导

MySQL主从复制使用SSL加密

环境: CentOS7.4 CA主机一 mysql主机两台 数据库:MariaDB-5.5 一.准备证书文件 1.生成CA自签名证书 mkdir /etc/my.cnf.d/ssl cd /etc/my.cnf.d/ssl openssl genrsa 2048 > cakey.pem chmod 600 cakey.pem openssl req -new -x509 -key cakey.pem -days 3650 -out cacert.pem 2.生成master私钥以及证书申请 op

mysql+ssl主从复制

主从复制原理 作为主服务器Master, 会把自己的每一次改动都记录到 二进制日志 Binarylog 中. (从服务器I/O thread会负责来读取master binary log, 然后写入自身relay log中然后在用自身的sql thread读取relay log并在自身服务器执行一遍.)到这里主服务器上的更改就同步到从服务器上了. 环境:|centos7| master | slave | mysql5.7 | 192.168.41.10 | 192.168.41.20 | 1.