Mysql加密连接

时间:2025-04-10 08:38:31

使用加密连接:
/doc/refman/8.0/en/

通过MySQL客户端和服务器之间的未加密连接,有权访问网络的人可以监视您的所有流量并检查客户端和服务器之间发送或接收的数据。
当您必须以安全的方式通过网络移动信息时,未加密的连接是不可接受的。要使任何类型的数据不可读,请使用加密。加密算法必须包含安全元素,以抵御多种已知攻击,例如更改加密消息的顺序或重放数据两次。
MySQL支持使用TLS(传输层安全性)协议在客户端和服务器之间建立加密连接。TLS有时被称为SSL(安全套接字层),但MySQL实际上并不使用SSL协议进行加密连接,因为它的加密很弱(请参见 第6.4.6节“加密连接协议和密码”)。
TLS使用加密算法来确保可以信任通过公共网络接收的数据。它具有检测数据更改,丢失或重放的机制。TLS还包含使用X.509标准提供身份验证的算法。
X.509可以识别互联网上的某个人。在基本术语中,应该有一些称为“ 证书颁发机构 ”(或CA)的实体,它将电子证书分配给需要它们的任何人。证书依赖于具有两个加密密钥(公钥和密钥)的非对称加密算法。证书所有者可以将证书提供给另一方作为身份证明。证书由其所有者的公钥组成。使用该公钥加密的任何数据只能使用由证书所有者持有的相应密钥解密。
如果您有MySQL源代码分发,则可以使用其mysql-test/std_data目录中的演示证书和密钥文件来测试您的设置
使用加密连接的选项,证书和秘钥文件的名称以及加密连接技术支持相关的参数

ssl加密库:
openssh:MySQL支持使用TLSv1,TLSv1.1和TLSv1.2协议的加密连接。
wolfssh
要确定是否使用OpenSSL编译服务器,请测试是否存在任何这些变量。例如,如果使用OpenSSL,则此语句返回一行;如果使用wolfSSL,则返回空结果:

mysql> SHOW STATUS LIKE 'Rsa_public_key'\G

检查是否启用加密:

mysql> SHOW SESSION STATUS LIKE 'Ssl_cipher';
mysql> \s

查看服务器是否支持ssh连接:

mysql>SHOW VARIABLES LIKE 'have_ssl';

配置myql服务器连接:

有几个选项可用于指示是否使用加密连接,以及指定适当的证书和密钥文件
服务器端连接:
服务器端的这些选项标识服务器在允许客户端建立加密连接时使用的证书和密钥文件:
--ssl-ca:证书颁发机构(CA)证书文件的路径名。(--ssl-capath类似但指定CA证书文件目录的路径名。)
--ssl-cert:服务器公钥证书文件的路径名。这可以发送到客户端,并根据它具有的CA证书进行身份验证。
--ssl-key:服务器私钥文件的路径名。

[mysqld]
ssl-ca=
ssl-cert=
ssl-key=

加密连接的客户端配置

默认情况下,如果服务器支持加密连接,MySQL客户端程序会尝试建立加密连接,并通过以下--ssl-mode选项进一步控制 :
如果没有 --ssl-mode选项,客户端将尝试使用加密进行连接,如果无法建立加密连接,则会回退到未加密的连接。这也是具有显式--ssl-mode=PREFFERED选项的行为 。
使用时--ssl-mode=REQUIRED,客户端需要加密连接,如果无法建立,则会失败。
使用--ssl-mode=DISABLED,客户端使用未加密的连接。
使用--ssl-mode=VERIFY_CA或 --ssl-mode=VERIFY_IDENTITY,客户端需要加密连接,并对服务器CA证书和(与VERIFY_IDENTITY)证书 中的服务器主机名执行验证。
mysql --ssl-ca= \
  --ssl-cert= \
  --ssl-key=

使用openssh生成加密证书:

生成证书代码:

# Create clean environment
rm -rf newcerts
mkdir newcerts && cd newcerts

# Create CA certificate
openssl genrsa 2048 > 
openssl req -new -x509 -nodes -days 3600 \
        -key  -out 

# Create server certificate, remove passphrase, and sign it
#  = public key,  = private key
openssl req -newkey rsa:2048 -days 3600 \
        -nodes -keyout  -out 
openssl rsa -in  -out 
openssl x509 -req -in  -days 3600 \
        -CA  -CAkey  -set_serial 01 -out 

# Create client certificate, remove passphrase, and sign it
#  = public key,  = private key
openssl req -newkey rsa:2048 -days 3600 \
        -nodes -keyout  -out 
openssl rsa -in  -out 
openssl x509 -req -in  -days 3600 \
        -CA  -CAkey  -set_serial 01 -out 

生成的文件目录:

➜  newcerts tree -L 2
.
├── :CA证书
├── 
├── :客户端连接的证书
├── 
├── 
├── :服务器端的证书
├── 
└── 

0 directories, 8 files

验证证书:

要查看SSL证书的内容(例如,要检查其有效的日期范围),请直接调用 openssl:

openssl x509 -text -in 
openssl x509 -text -in 
openssl x509 -text -in 

也可以使用以下SQL语句检查SSL证书过期信息:

mysql> SHOW STATUS LIKE 'Ssl_server_not%';
openssl verify -CAfile   

查看证书内容:

openssl x509 -text -in 
openssl x509 -text -in 
openssl x509 -text -in 

创建RSAkey:

openssl genrsa -out private_key.pem 2048
openssl rsa -in private_key.pem -pubout -out public_key.pem
chmod 400 private_key.pem
chmod 444 public_key.pem

配置:
在启动服务器时用有关选项指明证书文件和密钥文件的位置。在建立加密连接前,要准备三个文件,一个CA证书,是由可信赖第三方出具的证书,用来验证客户端和服务器端提供的证书。CA证书可向商业机构购买,也可自行生成。第二个文件是证书文件,用于在连接时向对方证明自已身份的文件。第三个文件是密钥文件,用来对在加密连接上传输数据的加密和解密。MySQL服务器端的证书文件和密钥文件必须首先安装,在sampdb发行版本的ssl目录里有几个供参考的样本文件:(CA证书),(服务器证书),(服务器公共密钥)。把这几个文件拷贝到服务器的数据目录中,再在选项文件里加上以下内容:

[mysqld]
ssl-ca=/usr/local/mysql/data/
ssl-cert=/usr/local/mysql/data/
ssl-key=/usr/local/mysql/data/

要想让某个客户程序建立加密连接,必须在调用这个客户程序时用有关选项告诉它在哪里能找到其证书文件和密钥文件。在sampdb发行版的ssl目录中提供了(客户证书文件),(客户密钥文件),CA证书与服务器使用同样的。把他们拷贝到个人目录下,并在.选项文件中指出文件位置,如:

[mysql]
ssl-ca=/home/mysql/
ssl-cert=/home/mysql/
ssl-key=/home/mysql/

配置完成后,调用mysql程序运行\s或SHOW STATUS LIKE 'SSL%'命令,如果看到SSL:的信息行就说明是加密连接了。如果把SSL相关的配置写进选项文件,则默认是加密连接的。也可用mysql程序的–skip-ssl选项取消加密连接。如果用命令行方式启用加密连接可以这样写:

 mysql --ssl-ca= --ssl-cert= --ssl-key=

可用GRANT语句的REQUIRE SSL选项来强制用户使用加密连接。

使用sampdb发行版的证书可以建立一个加密连接,但由于该文件已公开,所以安全性不好,我们可以在测试成功后自行建立证书或购买商业证书,以提高安全性。如何自行建立SSL证书的文档在sampdb发行版的ssl/README文件里有说明