MySQL数据库SSL连接测试

server/2024/9/25 3:07:57/

环境信息:Centos7 + MySQL 5.7.21

在该环境上进行SSL连接测试。

MySQL Server 配置:

vi /etc/my.cnf

[mysql]
default-character-set = utf8mb4[client]
default-character-set = utf8mb4# ssl_mode = [ DISABLED | PREFERRED(default if not set) | REQUIRED | VERIFY_CA | VERIFY_IDENTITY ]
# ssl_mode 为客户端可选参数,如果客户端连接时指定了则生效的是客户端连接时指定的参数,如果客户端连接未指定则使用服务端的[client]中的配置参数,如果未配置默认为PREFRED。
#   DISABLED: 非SSL连接。
#   PREFERRED: SSL/no-ssl。如果不配置、默认就是该行为。先尝试SSL连接、如果失败则尝试非SSL连接。
#   REQUIRED: SSL连接。仅尝试SSL连接,SSL连接失败则失败、不会尝试非SSL连接。
#   VERIFY_CA: SSL连接,双向认证。校验ca证书、但不校验证书中的server host name。
#   VERIFY_IDENTITY: SSL连接,双向认证。校验ca证书、同时校验证书中的server host name。
#ssl_mode = PREFERRED
ssl_mode = VERIFY_CA[mysqld]datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sockvalidate_password=off# for ssl enable
# 服务器端配置强制SSL连接、禁止非SSL连接
require_secure_transport = ON
# 下面3个参数如果不配置或者值配置成ca.pem, server-cert.pem, server-key.pem,不加路径,则MySQL默认行为是读取数据目录下的三个文件
ssl-ca=/var/lib/mysql/ca.pem
ssl-cert=/var/lib/mysql/server-cert.pem
ssl-key=/var/lib/mysql/server-key.pem#for mysqlbinlog enable
server-id=1
log-bin=/var/lib/mysql/mysql-bin
binlog_format=row
expire_logs_days=15
max_binlog_size=500m#utf8mb4
character-set-client-handshake=false
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'# for blob input, default value is 4194304 (4M) if not set
#max_allowed_packet = 100M# for other performance settings
max_connections = 2000
max_connect_errors = 500
back_log = 1000
thread_cache_size = 64
table_open_cache_instances = 500
###show global status like '%open%table%'; Open_tables / Opened_tables 85%~95%
table_open_cache = 10000
table_definition_cache = 2000
innodb_thread_concurrency = 0
max_tmp_tables = 100## common sql commands
## -- show engine innodb status \G;
## -- show global variables like '%thread%';
## -- show global status like '%thread%';
## -- show global status like '%open%table%';
## -- show variables like '%table%';# Disablinr symbolic-links is recommended to prevent assorted security risks
symbolic-links=0log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

编写测试脚本:

vi cmd.sh

#!/bin/sh# ssl-test-qftoolsSQL_SSL="
# check if server start with --ssl:\n
# -- show variables like '%have_ssl%';\n
\n
# check if server force accpet ssl session request ( deny no-ssl requests ):\n
# -- show variables like 'require_secure_transport';\n
\n
# client connected and check current session ssl status:\n
# -- show session status like 'Ssl_cipher';\n
\n
# check ssl configs:\n
# -- show variables like '%ssl%';\n
"
# java keystore.jks generate cmd: keytool -importcert -trustcacerts -file ca.pem -keystore keystore216.jks -storepass 1q2w3eHOST=192.168.1.216
PORT=3306
USER=root
DIR=./ssl_1.216# for MySQL old Versin
#$SSLOPT=--ssl
#$SSLOPT="--ssl --ssl-verify-server-cert"# for MySQL new Version
SSLOPT_DISABLED="--ssl-mode=DISABLED"
SSLOPT_PREFERRED="--ssl-mode=PREFERRED"
SSLOPT_REQUIRED="--ssl-mode=REQUIRED"
# ssl && also perform verification against the server CA certificate but no against the server host name in its certificate.
SSLOPT_CA="--ssl-mode=VERIFY_CA"
# ssl && also perform verification against the server CA certificate and (with VERIFY_IDENTITY) against the server host name in its certificate.
SSLOPT_IDENTITY="--ssl-mode=VERIFY_IDENTITY"CA=$DIR/ca.pem
CERT=$DIR/client-cert.pem
KEY=$DIR/client-key.pem# 客户端连接时不指定相关参数、由服务器配置决定最终行为
CMD0="mysql -h$HOST -P$PORT -u$USER -p "
# 客户端连接指定配置
# no-ssl
CMD1="mysql -h$HOST -P$PORT -u$USER -p $SSLOPT_DISABLED"
# ssl/no-ssl 先尝试SSL连接、如果失败则尝试非SSL连接
CMD2="mysql -h$HOST -P$PORT -u$USER -p $SSLOPT_PREFERRED"
# ssl单向,SSL连接失败则失败、不会尝试非SSL连接
CMD3="mysql -h$HOST -P$PORT -u$USER -p $SSLOPT_REQUIRED"
# ssl单向、虽然多余传ca证书、客户端证书和秘钥(实际上无需传),实际效果还是单向。MySQL Server my.cnf [client] 中如果配置为 ssl_mode = VERIFY_CA ,连接时客户端如果指定ssl_mode参数则会覆盖,以客户端配置优先
CMD4="mysql -h$HOST -P$PORT -u$USER -p $SSLOPT_REQUIRED --ssl-ca=$CA  --ssl-cert=$CERT --ssl-key=$KEY"
# ssl双向认证,不验证hostname
CMD5="mysql -h$HOST -P$PORT -u$USER -p $SSLOPT_CA --ssl-ca=$CA  --ssl-cert=$CERT --ssl-key=$KEY"
# ssl双向认证 && 验证hostname
CMD6="mysql -h$HOST -P$PORT -u$USER -p $SSLOPT_IDENTITY --ssl-ca=$CA  --ssl-cert=$CERT --ssl-key=$KEY"if [ ! $# -eq 1 ] || [ "$1" == "-h" ];thenecho ""echo "Please user: $0 {type}"echo "  type: 0 | 1 | 2 | 3 | 4 | 5 | 6"echo "  type 0 for run: $CMD0"echo "  type 1 for run: $CMD1"echo "  type 2 for run: $CMD2"echo "  type 3 for run: $CMD3"echo "  type 4 for run: $CMD4"echo "  type 5 for run: $CMD5"echo "  type 6 for run: $CMD6"echo -e "\n---------------------\n"echo "About sql for show ssl infos after mysql connected: "echo -e $SQL_SSLexit
fiinputType=$1
if [ -z inputType ];theninputType=1
fiecho "inputType = $inputType"if [ $inputType -eq 0 ];thenecho $CMD0$CMD0
elif [ $inputType -eq 1 ];thenecho $CMD1$CMD1
elif [ $inputType -eq 2 ];thenecho $CMD2$CMD2
elif [ $inputType -eq 3 ];thenecho $CMD3$CMD3
elif [ $inputType -eq 4 ];thenecho $CMD4$CMD4
elif [ $inputType -eq 5 ];thenecho $CMD5$CMD5
elif [ $inputType -eq 6 ];thenecho $CMD6$CMD6
elseecho "ERROR: inputType unsupport!"exit
fi

从MySQL Server服务器拷贝证书和Key到客户端机器上,然后客户端机器上执行相关测试:
[root@localhost ssl_test]# ls -l
total 4
-rwxr--r-- 1 root root 3165 Apr 25 01:40 cmd.sh
drwxr-xr-x 2 root root   62 Apr 24 21:45 ssl_1.216
[root@localhost ssl_test]# ls -l ssl_1.216/
total 12
-rw-r--r-- 1 root root 1107 Apr 24 21:45 ca.pem
-rw-r--r-- 1 root root 1107 Apr 24 21:45 client-cert.pem
-rw------- 1 root root 1679 Apr 24 21:45 client-key.pem


SSL连接测试失败的情况:
./cmd.sh 0
./cmd.sh 1
./cmd.sh 6

SSL连接失败的执行详细信息:
[root@localhost ssl_test]# ./cmd.sh 0
inputType = 0
mysql -h192.168.1.216 -P3306 -uroot -p
Enter password: 
ERROR 2026 (HY000): SSL connection error: CA certificate is required if ssl-mode is VERIFY_CA or VERIFY_IDENTITY
[root@localhost ssl_test]# 

[root@localhost ssl_test]# ./cmd.sh 1
inputType = 1
mysql -h192.168.1.216 -P3306 -uroot -p --ssl-mode=DISABLED
Enter password: 
ERROR 3159 (HY000): Connections using insecure transport are prohibited while --require_secure_transport=ON.
[root@localhost ssl_test]# 

[root@localhost ssl_test]# ./cmd.sh 6
inputType = 6
mysql -h192.168.1.216 -P3306 -uroot -p --ssl-mode=VERIFY_IDENTITY --ssl-ca=./ssl_1.216/ca.pem --ssl-cert=./ssl_1.216/client-cert.pem --ssl-key=./ssl_1.216/client-key.pem
Enter password: 
ERROR 2026 (HY000): SSL connection error: SSL certificate validation failure
[root@localhost ssl_test]# 

SSL连接测试成功的情况:
./cmd.sh 2
./cmd.sh 3
./cmd.sh 4
./cmd.sh 5
 


http://www.ppmy.cn/server/14730.html

相关文章

openEuler 22.03 LTS SP3(华为欧拉)一键安装 Oracle 12CR2 RAC(220118) 数据库

前言 Oracle 一键安装脚本,演示 openEuler 22.03 LTS SP3 一键安装 Oracle 12CR2 RAC(220118) 过程(全程无需人工干预):(脚本包括 ORALCE PSU/OJVM 等补丁自动安装) ⭐️ 脚本下载…

亚马逊云科技提高企业生产力神器Amazon Q评测分析

一年一度的全球云计算春晚,亚马逊云科技Re:invent在2023年11月27于Vegas震撼来袭,其中最令人关注的就是CEO Adam在Keynote中分享的内容。其中一个新内容就是提升生产力神器: Amazon Q,可以说它重新定义了企业的工作模式。那具体它神在哪里呢&…

Android Binder——Java层通信实例(十六)

前面的文章中我们介绍了 Java 层服务的注册流程,以及代理文件的查找。这里我们看一个 Binder 通信的实例,为了方便我们就以 Android 源码中现有的功能 PMS 的 install 为例,PMS 在进行 APK 安装时,会进行 dex 的翻译,依赖守护进程 installd 完成。 一、源码分析 1. AIDL…

springboot基于点餐码 二维码在线点餐系统vue.js+java

Maven: 项目管理和构建自动化工具,用于java项目。 java: 广泛使用的编程语言,适用于构建跨平台应用。 Springmvc:从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架。 MyBatis: java持久层框架,支持定制化SQL、存…

从0到1学习typescript(更新版)

1、常用ts基本命令 (1)下载 npm install typescript -g(2)检查ts版本 tsc -v(3)将ts编译为js tsc index.ts2、定义变量 首先要明确一个概念,ts中确定了类型之后,就不能再修改类…

详解JVM类加载

从类被加载到虚拟机内存中开始,到释放内存总共有7个步骤:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Ini…

企业微信hook接口协议,开放平台id转企业用户id

开放平台id转企业用户id 参数名必选类型说明uuid是String每个实例的唯一标识,根据uuid操作具体企业微信 请求示例 {"uuid":"3240fde0-45e2-48c0-90e8-cb098d0ebe43","openid":["woO9o4EAAAUg47yCUh1mDYVh71AJ8R3w"] } …

Linux-内存文件

1. 基础IO操作 1.1 c语言的IO接口 fopen:打开一个文件,按照指定方式 参数:filename 文件名,也可以是路径,mode:打开方式 返回打开的文件指针 fread:从指定流中读数据 参数:从FIL…