mysql数据库ssl连接使用,mysql的ssl

本文目录一览:

如何配置MySQL SSL?

MySQL默认的数据通道是不加密的,在一些安全性要求特别高的场景下,我们需要配置MySQL端口为SSL,使得数据通道加密处理,避免敏感信息泄漏和被篡改。

当然,启用MySQL

SSL之后,由于每个数据包都需要加密和解密,这个对MySQL的性能是有不小影响的,读者们在使用的时候,要根据实际情况斟酌。

MySQL客户端登录服务器时候的密码不是明文传输,有加密策略处理。

笔者是在

ubuntu12.04

系统上使用MySQL

5.5版本测试的,其他环境请读者自行匹配。

配置MySQL服务器证书

编辑

/etc/mysql/my.cnf

文件

#

ssl-ca=/etc/mysql/cacert.pem

#

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

#

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

把上面三行默认证书配置注释打开,使用自己的证书。笔者就使用上次在搭建自己的CA服务

OpenSSL

CA

实战文章中生成的证书

ssl-ca=/home/yunweipai/user_certs/ca_cert.cer

ssl-cert=/home/yunweipai/user_certs/web.cer

ssl-key=/home/yunweipai/user_certs/web_key_plain.pem

这里需要注意的是,在ubuntu上,配置证书后如果不生效,参考这里解决方法

注意上面配置的

web_key_plain.pem

文件,由于MySQL不支持加密后的私钥,因此我们使用命令

openssl

rsa

-in

web_key.pem

-passin

pass:Yunweipai@123

-out

web_key_plain.pem

将私钥解密。MySQL不支持私钥加密的原因是从安全性角度考虑,因为如果要用户传递一个加密的私钥,那么必须要用户传密码,那么MySQL怎么存储这个密码呢?这就引出了我们在密码存储和传输的安全建议里面提到的一系列问题了。

所以MySQL为了简化实现,就不支持私钥加密。

指定客户端连接方式

MySQL服务端在对客户端授权的时候,可以通过选项指定客户端连接MySQL

服务器的SSL级别,参考MySQL赋权的

REQUIRE值:

ssl_option

SSL:

不认证客户端,客户端不需要提供证书

X509:

客户端必须发送一个有效的X509证书

issuer:

客户端的证书是否是服务器所配置的CA颁发的(在我们场景下是ca_cert.cer颁发的证书)

subject:

认证证书的subject(关于证书的subject在之前的文章有介绍)

cipher:

指定加密算法

这些选项可以叠加使用,如:X509|issuser

客户端连接(SSL方式)

mysql

客户端连接

mysql

-u

root

-pChangeme_123

-P

3306

–ssl-ca=/home/yunweipai/user_certs/ca_cert.cer

Welcome

to

the

MySQL

monitor.

Commands

end

with

;

or

\g.

Your

MySQL

connection

id

is

36

Server

version:

5.5.43-0ubuntu0.12.04.1

(Ubuntu)

Copyright

(c)

2000,

2015,

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

\s

————–

mysql

Ver

14.14

Distrib

5.5.43,

for

debian-linux-gnu

(i686)

using

readline

6.2

Connection

id:

36

Current

database:

Current

user:

root@localhost

SSL:

Cipher

in

use

is

DHE-RSA-AES256-SHA

Current

pager:

stdout

Using

outfile:

Using

delimiter:

;

Server

version:

5.5.43-0ubuntu0.12.04.1

(Ubuntu)

Protocol

version:

10

Connection:

Localhost

via

UNIX

socket

Server

characterset:

latin1

Db

characterset:

latin1

Client

characterset:

latin1

Conn.

characterset:

latin1

UNIX

socket:

/var/run/mysqld/mysqld.sock

Uptime:

29

sec

Threads:

1

Questions:

109

Slow

queries:

Opens:

48

Flush

tables:

1

Open

tables:

41

Queries

per

second

avg:

3.758

————–

JDBC连接

在jdbc字符串中增加下面参数

useSSL=trueverifyServerCertificate=false

这么就不需要客户端配置证书了,配置就简单很多。因为mysql本身有账号口令认证,因此不需要证书认证。

如何使用python连接mysql数据库

在 Python 语言环境下我们这样连接数据库。

In [1]: from mysql import connector

In [2]: cnx = connector.connect(host=”172.16.192.100″,port=3306,user=”appuser”,password=”xxxxxx”)

但是连接数据库的背后发生了什么呢?

答案

当我们通过驱动程序(mysql-connector-python,pymysql)连接 MySQL 服务端的时候,就是把连接参数传递给驱动程序,驱动程序再根据参数会发起到 MySQL 服务端的 TCP 连接。当 TCP 连接建立之后驱动程序与服务端之间会按特定的格式和次序交换数据包,数据包的格式和发送次序由 MySQL 协议 规定。MySQL 协议:整个连接的过程中 MySQL 服务端与驱动程序之间,按如下的次序发送了这些包。

MySQL 服务端向客户端发送一个握手包,包里记录了 MySQL-Server 的版本,默认的授权插件,密码盐值(auth-data)。

2. MySQL 客户端发出 ssl 连接请求包(如果有必要的话)。

3. MySQL 客户端发出握手包的响应包,这个包时记录了用户名,密码加密后的串,客户端属性,等等其它信息。

4. MySQL 服务端发出响应包,这个包里记录了登录是否成功,如果没有成功也会给出错误信息。

如何解决MySQL在高版本需指明是否进行SSL连接问题

如何解决MySQL在高版本需指明是否进行SSL连接问题

Java使用mysql-jdbc连接MySQL出现如下警告:

Establishing SSL connection without server’s identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn’t set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to ‘false’. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.

在mysql连接字符串url中加入ssl=true或者false即可,如下所示。

url=jdbc:mysql://127.0.0.1:3306/framework?characterEncoding=utf8useSSL=true

如何为MySQL服务器和客户机启用SSL

用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSL wrapper)。这每一种方法各有其优缺点。比如说,在出现多条短时间MySQL连接的高度动态环境下,VPN或SSH隧道也许是比SSL更好的选择,因为后者建立每条连接时需要成本高昂的SSL握手计算。另一方面,如果是长时间运行的MySQL连接比较少的那些应用,基于SSL的加密可能很合理。由于MySQL服务器已经内置了SSL支持功能,你不需要实施VPN或SSH隧道之类单独的安全层,这种隧道有其自己的维护开销。

在MySQL服务器中实施SSL可以加密在服务器与客户机之间来回传输的所有数据,因而防止广域网或数据中心里面可能出现的窃听或数据嗅探行为。此外,SSL还通过SSL证书提供了身份验证机制,因而可以保护用户,远离可能出现的网络钓鱼攻击。

我们在本文中将介绍如何启用MySQL服务器上的SSL。请注意:同样过程适用于MariaDB服务器。

创建Server SSL证书和私钥

我们必须为MySQL服务器创建SSL证书和私钥,通过SSL连接到服务器时要用到它们。

首先,创建一个临时的工作目录,我们将把私钥和证书文件放在该目录下。

$ sudo mkdir ~/cert $ cd ~/cert

确保OpenSSL已安装在运行MySQL服务器的系统上。通常,所有Linux发行版在默认情况下都安装了OpenSSL。想检查一下OpenSSL有没有安装,不妨使用下面这个命令。

$ openssl version OpenSSL 1.0.1f 6 Jan 2014

现在,继续创建CA私钥和证书。下面这些命令将创建ca-key.pem和ca-cert.pem。

$ openssl genrsa 2048 ca-key.pem $ openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem ca-cert.pem

第二个命令会询问你几个问题。你在这些字段里填入什么并不重要。只管填好那些字段。

下一步是为服务器创建私钥。

$ openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem server-req.pem

这个命令会再次询问几个问题,你可以填写上一步中提供的相同答案。

下一步,使用下面这个命令,将服务器的私钥导出成RSA类型的密钥。

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

最后,使用CA证书,创建服务器证书。

$ openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 server-cert.pem

配置MySQL服务器上的SSL

完成上述过程后,我们应该有了CA证书、服务器的私钥及其证书。下一步就是配置MySQL服务器,以便使用私钥和证书。

在配置MySQL服务器之前,检查一下SSL选项已被启用还是被禁用。为此,登录进入到MySQL服务器,输入下面这个查询。

mysql SHOW GLOBAL VARIABLES LIKE ‘have_%ssl’;,

该查询的结果会如同下图。

请注意:“have_openssl”和“have_ssl”变量的默认值是“被禁用”,如下所示。想启用MySQL服务器中的SSL,继续执行下列步骤。

1. 将ca-cert.pem、server-cert.pem和server-key.pem拷贝或移动到/etc目录下。

$ sudo mkdir /etc/mysql-ssl $ sudo cp ca-cert.pem server-cert.pem server-key.pem /etc/mysql-ssl

2. 使用文本编辑工具,打开服务器的my.cnf配置文件。添加或去掉注释[mysqld]部分中类似下面内容的几行。这些应该指向你放在/etc/mysql-ssl中的私钥和证书。

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

3. 在my.cnf中,还要找到“bind-address = 127.0.0.1”,并将它改成:

bind-address = *

那样一来,你就可以从另一个主机连接到MySQL服务器了。

4. 重启MySQL服务。

$ sudo service mysql restart 或 $ sudo systemctl restart mysql 或 $ sudo /etc/init.d/mysql restart

你只要查看MySQL错误日志文件(比如/var/log/mysql/mysql.log),就可以检查SSL配置有没有问题。要是错误日志中没有警告或错误(就像下面的屏幕截图),这表明SSL配置没有问题。

验证SSL配置的另一个办法就是,在MySQL服务器里面再次运行“have_%ssl”查询。

mysql SHOW GLOBAL VARIABLES LIKE ‘have_%ssl’;

创建拥有SSL权限的用户

服务器端的SSL配置完成后,下一步就是创建有权通过SSL访问MySQL服务器的用户。为此,登录进入到MySQL服务器,输入下面内容:

mysql GRANT ALL PRIVILEGES ON *.* TO ‘ssluser’@’%’ IDENTIFIED BY ‘dingdong’ REQUIRE SSL; mysql FLUSH PRIVILEGES;

把“ssluser”(用户名)和“dingdong”(密码)换成你自己的用户名和密码。

如果你想分配一个特定的IP地址(比如192.168.2.8),以便用户从该地址来访问服务器,那就改而使用下列查询。

mysql GRANT ALL PRIVILEGES ON *.* TO ‘ssluser’@’192.168.2.8’ IDENTIFIED BY ‘dingdong’ REQUIRE SSL; mysql FLUSH PRIVILEGES;

配置MySQL客户机上的SSL

鉴于MySQL服务器端配置已完成,不妨将目光转移到客户机端。就MySQL客户机而言,我们就需要基于服务器的CA私钥和证书,创建新的私钥和证书。

在服务器的CA私钥和证书驻留于其中的MySQL服务器主机上运行下列命令。

$ openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem client-req.pem

类似服务器端配置,上述命令会询问几个问题。只管填好字段,就像前面所做的那样。

我们还需要将创建的客户机私钥转换成RSA类型,如下所示。

$ openssl rsa -in client-key.pem -out client-key.pem,

最后,我们需要使用服务器的CA私钥和证书,创建客户机证书。

$ openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 client-cert.pem

现在,将ca-cert.pem、client-cert.pem和client-key.pem文件转移到你想要运行MySQL客户机的任何主机上。

在客户机主机上,使用下面这个命令,通过SSL连接到MySQL服务器。

$ mysql –ssl-ca=ca-cert.pem –ssl-cert=client-cert.pem –ssl-key=client-key.pem -h -u ssluser -p

在输入ssluser的密码后,你会看到如往常那样的MySQL提示符。

想检查一下你有没有使用SSL,在提示符处输入状态命令。

mysql status;

如果你已通过SSL连接上去,它会在SSL字段显示密码信息,如下所示。

原创文章,作者:KXZK,如若转载,请注明出处:https://www.506064.com/n/148102.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
KXZKKXZK
上一篇 2024-11-02 13:14
下一篇 2024-11-02 13:14

相关推荐

  • 如何修改mysql的端口号

    本文将介绍如何修改mysql的端口号,方便开发者根据实际需求配置对应端口号。 一、为什么需要修改mysql端口号 默认情况下,mysql使用的端口号是3306。在某些情况下,我们需…

    编程 2025-04-29
  • Python 常用数据库有哪些?

    在Python编程中,数据库是不可或缺的一部分。随着互联网应用的不断扩大,处理海量数据已成为一种趋势。Python有许多成熟的数据库管理系统,接下来我们将从多个方面介绍Python…

    编程 2025-04-29
  • openeuler安装数据库方案

    本文将介绍在openeuler操作系统中安装数据库的方案,并提供代码示例。 一、安装MariaDB 下面介绍如何在openeuler中安装MariaDB。 1、更新软件源 sudo…

    编程 2025-04-29
  • Python操作MySQL

    本文将从以下几个方面对Python操作MySQL进行详细阐述: 一、连接MySQL数据库 在使用Python操作MySQL之前,我们需要先连接MySQL数据库。在Python中,我…

    编程 2025-04-29
  • 数据库第三范式会有删除插入异常

    如果没有正确设计数据库,第三范式可能导致删除和插入异常。以下是详细解释: 一、什么是第三范式和范式理论? 范式理论是关系数据库中的一个规范化过程。第三范式是范式理论中的一种常见形式…

    编程 2025-04-29
  • MySQL递归函数的用法

    本文将从多个方面对MySQL递归函数的用法做详细的阐述,包括函数的定义、使用方法、示例及注意事项。 一、递归函数的定义 递归函数是指在函数内部调用自身的函数。MySQL提供了CRE…

    编程 2025-04-29
  • leveldb和unqlite:两个高性能的数据库存储引擎

    本文将介绍两款高性能的数据库存储引擎:leveldb和unqlite,并从多个方面对它们进行详细的阐述。 一、leveldb:轻量级的键值存储引擎 1、leveldb概述: lev…

    编程 2025-04-28
  • Python怎么导入数据库

    Python是一种高级编程语言。它具有简单、易读的语法和广泛的库,让它成为一个灵活和强大的工具。Python的数据库连接类型可以多种多样,其中包括MySQL、Oracle、Post…

    编程 2025-04-28
  • MySQL bigint与long的区别

    本文将从数据类型定义、存储空间、数据范围、计算效率、应用场景五个方面详细阐述MySQL bigint与long的区别。 一、数据类型定义 bigint在MySQL中是一种有符号的整…

    编程 2025-04-28
  • MySQL左连接索引不生效问题解决

    在MySQL数据库中,经常会使用左连接查询操作,但是左连接查询中索引不生效的情况也比较常见。本文将从多个方面探讨MySQL左连接索引不生效问题,并给出相应的解决方法。 一、索引的作…

    编程 2025-04-28

发表回复

登录后才能评论