在当前的形势下,各种国产技术的需求,比以往都要紧迫,借鉴徐老师的这篇文章《国密算法 + 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登录,
ssh -i <privatekey> opc@<public IP>
sudo yum update
sudo yum install wget
下载BabaSSL 8.3.2稳定源代码
要下载8.3稳定源zip文件,并执行以下命令和解压zip文件,
wget https://github.com/Tongsuo-Project/Tongsuo/archive/refs/heads/8.3-stable.zip
unzip 8.3-stable.zip
要Compile代码,请将目录更改为解压后的文件目录“Tongsuo-8.3-stable”并执行以下命令,
cd Tongsuo-8.3-stablemkdir bld../configmake
BabaSSL的安装会放于/usr/local/bin 和 /usr/local/lib64以及相应的默认安装路径。
注意:默认安装不会替换任何标准操作系统系统自带的OpenSSL档案,而是将其放入/usr/local作为選用安装。
sudo make install
更改/etc/profile并附加以下内容,
export LD_LIBRARY_PATH=/usr/local/lib64:$LD_LIBRARY_PATH
退出终端并重新登录虚拟机。
以SSH连接到附加了新库路径的计算VM(来自更新过的/etc/profile)。
并检查BabaSSL和SMx加密,执行以下命令并验证是否安装BabaSSL成功,
openssl version
openssl -v ciphers|grep SM
结果显示如下,
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社区版本,
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),
sudo systemctl start mysqld
查看root的临时密码,以临时密码登陆的是不可以使用正常SQL命令。要先改密码,
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设置,
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,
sudo vi /etc/systemd/system/multi-user.target.wants/mysqld.service
查找文件上的“Environment=MYSQLD_PARENT_PID=1”一行,并在后面添加以下一行,
Environment=LD_LIBRARY_PATH=/usr/local/lib64
重新加载并重启mysqld服务。
执行以下命令重新加载系统服务并启动mysqld,
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服务器,
mysql -uroot -h127.0.0.1 -P3306 -p -e "status;"
状态屏幕显示SSL连接使用的Ciphers是TLS_SM4_GCM_SM3。
在mysql客户端执行以下SQL命令来看看TLS/SSL信息,
mysql > show variables like '%tls%';
mysql > show status like '%tls%';
结果显示,
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,
近期更新的文章:
《MySQL中timestamp数据类型定义》
《魔方的征途 - 魔方如何选择?》
《MySQL中用户密码存在特殊字符的使用场景》
《企业IT运维故障定位方法及工具》
《技术高手是如何炼成的?》
近期的热文:
《"红警"游戏开源代码带给我们的震撼》
文章分类和索引:
《公众号1100篇文章数据统计》