提供使用国密算法的MySQL

2022-10-31 10:38:18 浏览数 (1)

在当前的形势下,各种国产技术的需求,比以往都要紧迫,借鉴徐老师的这篇文章《国密算法 MySQL》,学习创建使用国密算法的MySQL数据库。

中国加密标准的SM1、SM2、SM3、SM4、SM7、SM9等,借助国际加密标准,我们可以利用来自开源的加密库实现,例如,最常用和最流行的加密库之一是OpenSSL。

本文旨在使用有SMx(中国加密库)的“OpenSSL”库的BabaSSL,加上 MySQL的TLS设置,提供使用国密算法的MySQL。BabaSSL不是唯一采用 MySQL 的中国加密标准,  来自其他的中国加密供应商/开源的/兼容的/最新的 OpenSSL 库,也会支持类似的方式来实现MySQL国密TLS加密。

测试环境(用于分享)

1. 计算机资源(VM)。

2.  操作系统 - 计算机VM配备Oracle Linux 8。

3.  通过公用yum的存储库安装MySQL社区版本8.0。

4. 使用BabaSSL 8.3[BabaSSL 8.3.2-dev]。它基于2020年9月22日的OpenSSL 1.1.1h版本。

介绍

MySQL利用OpenSSL库通过通信通道为密码提供TLS加密。为了允许使用中国标准和MySQL切换OpenSSL库,可使用OpenSSL兼容的BabaSSL以强制使用中国加密标准进行通信。

安装和使用

1.  提供虚拟机和操作系统/包更新。

2. 下载BabaSSL 8.3.2稳定源代码。

3. Compile BabaSSL并以安装。

4. 安装MySQL 8.0.30(来自yum 存储库)。

5. 使用SMx for MySQL配置TLS。

6. 使用BabaSSL库路径来更改mysqld的系统服务。

7. 重新加载并重启mysqld服务。

8. MySQL (mysql) 客户端与BabaSSL库通过TLS与SMx连接。

配置虚拟机和操作系统/包更新

计算实例 (VM) 使用Oracle Linux 8进行配置。VM配置好并准备好连接,登录到shell终端并进行更新。

从终端Terminal SSH登录,

代码语言:javascript复制
ssh -i <privatekey>  opc@<public IP> 
sudo yum update
sudo yum install wget

下载BabaSSL 8.3.2稳定源代码

要下载8.3稳定源zip文件,并执行以下命令和解压zip文件,

代码语言:javascript复制
wget https://github.com/Tongsuo-Project/Tongsuo/archive/refs/heads/8.3-stable.zip
unzip 8.3-stable.zip

要Compile代码,请将目录更改为解压后的文件目录“Tongsuo-8.3-stable”并执行以下命令,

代码语言:javascript复制
cd Tongsuo-8.3-stable
 mkdir bld
 ../config
 make

BabaSSL的安装会放于/usr/local/bin 和 /usr/local/lib64以及相应的默认安装路径。

注意:默认安装不会替换任何标准操作系统系统自带的OpenSSL档案,而是将其放入/usr/local作为選用安装。

代码语言:javascript复制
sudo make install

更改/etc/profile并附加以下内容,

代码语言:javascript复制
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH

退出终端并重新登录虚拟机。

以SSH连接到附加了新库路径的计算VM(来自更新过的/etc/profile)。

并检查BabaSSL和SMx加密,执行以下命令并验证是否安装BabaSSL成功,

代码语言:javascript复制
openssl version
openssl -v ciphers|grep SM

结果显示如下,

代码语言:javascript复制
BabaSSL 8.3.2-dev
OpenSSL 1.1.1h  22 Sep 2020
TLS_SM4_GCM_SM3         TLSv1.3 Kx=any      Au=any  Enc=SM4-GCM(128) Mac=AEAD
TLS_SM4_CCM_SM3         TLSv1.3 Kx=any      Au=any  Enc=SM4-CCM(128) Mac=AEAD

利用yum存储库安装MySQL 8.0.30。

在SSH终端上,执行以下命令来安装mysql社区版本,

代码语言:javascript复制
sudo yum install https://dev.mysql.com/get/mysql80-community-release-el8-4.noarch.rpm
sudo yum module disable mysql
sudo dnf install mysql-server

启动mysqld服务,修改密码并查看连接信息。

这个时候的TLS连接时使用操作系统上的OpenSSL (=没开通的国密TLS),

代码语言:javascript复制
sudo systemctl start mysqld

查看root的临时密码,以临时密码登陆的是不可以使用正常SQL命令。要先改密码,

代码语言:javascript复制
sudo cat /var/log/mysqld.log|grep temp
mysql –uroot –h127.0.0.1 –p
mysql > set password=‘…..’;
mysql > status

查看“status”信息结果,显示使用Cipher是TLS_AES_256_GCM_SHA384。

修改/etc/my.cnf以使用SMx密码附加TLS设置,

代码语言:javascript复制
require_secure_transport=ON
tls_ciphersuites=TLS_SM4_GCM_SM3:TLS_SM4_CCM_SM3
tls_version=TLSv1.3

更改mysqld的系统服以至使用BabaSSL库路径。

更新mysqld.service并添加带有LD_LIBRARY_PATH的ENVIRONMENT行以采用BabaSSL,

代码语言:javascript复制
sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service

查找文件上的“Environment=MYSQLD_PARENT_PID=1”一行,并在后面添加以下一行,

代码语言:javascript复制
Environment=LD_LIBRARY_PATH=/usr/local/lib64

重新加载并重启mysqld服务。

执行以下命令重新加载系统服务并启动mysqld,

代码语言:javascript复制
sudo systemctl daemon-reload
sudo systemctl restart mysqld

从/var/log/mysqld.log检查mysqd.log加密连接支持信息正确无错,

日志消息显示TLS连接已配置。

MySQL (mysql) 客户端与BabaSSL库通过TLS与SMx连接。

要使用SMx连接通过TLS登录MySQL,“mysql”客户端必须与 BabaSSL库一起运行。确保LD_LIBRARY_PATH具有/usr/local/lib64并将mysql客户端登录到MySQL服务器,

代码语言:javascript复制
mysql -uroot -h127.0.0.1 -P3306 -p -e "status;"

状态屏幕显示SSL连接使用的Ciphers是TLS_SM4_GCM_SM3。

在mysql客户端执行以下SQL命令来看看TLS/SSL信息,

代码语言:javascript复制
mysql > show variables like '%tls%';
mysql > show status like '%tls%';

结果显示,

代码语言:javascript复制
mysql> show variables like '%tls%';
 ------------------------ --------------------------------- 
| Variable_name          | Value                           |
 ------------------------ --------------------------------- 
| admin_tls_ciphersuites |                                 |
| admin_tls_version      | TLSv1.2,TLSv1.3                 |
| tls_ciphersuites       | TLS_SM4_GCM_SM3:TLS_SM4_CCM_SM3 |
| tls_version            | TLSv1.3                         |
 ------------------------ --------------------------------- 
4 rows in set (0.00 sec)


mysql> show status like '%tls%';
 -------------------------- --------------------------------- 
| Variable_name            | Value                           |
 -------------------------- --------------------------------- 
| Current_tls_ca           | ca.pem                          |
| Current_tls_capath       |                                 |
| Current_tls_cert         | server-cert.pem                 |
| Current_tls_cipher       |                                 |
| Current_tls_ciphersuites | TLS_SM4_GCM_SM3:TLS_SM4_CCM_SM3 |
| Current_tls_crl          |                                 |
| Current_tls_crlpath      |                                 |
| Current_tls_key          | server-key.pem                  |
| Current_tls_version      | TLSv1.3                         |
| Tls_library_version      | OpenSSL 1.1.1h  22 Sep 2020     |
 -------------------------- --------------------------------- 
10 rows in set (0.01 sec)

VM上的MySQL服务器/客户端使用SMx TLS连接运行BabaSSL 8.3.2。

参考链接,

https://zhuanlan.zhihu.com/p/132352160

https://github.com/Tongsuo-Project/Tongsuo

https://dev.mysql.com/downloads/repo/yum/

如果您认为这篇文章有些帮助,还请不吝点下文章末尾的"点赞"和"在看",或者直接转发pyq,

0 人点赞