Mysql8.0.42啟用SSL安全連接完整步驟(等保整改、docker部署)
概述
Mysql 8 默認(rèn)啟用SSL安全連接,也可以強(qiáng)制必須啟用。建議手動生成自簽名證書和key并配置到服務(wù)端和客戶端路徑里,也可以直接使用mysql默認(rèn)生成的,默認(rèn)在數(shù)據(jù)存儲目錄下,如圖所示:

開啟SSL
步驟一:修改配置文件my.cnf
[mysqld] # SSL配置 # 強(qiáng)制所有連接使用SSL require_secure_transport = ON # 可以自行創(chuàng)建ca證書、服務(wù)端證書和KEYy,以下三個配置也可以不寫,使用默認(rèn)配置 ssl_ca=ca.pem ssl_cert=server-cert.pem ssl_key=server-key.pem # 其他安全配置 tls_version = TLSv1.2,TLSv1.3 # 限制支持的TLS版本 ssl-cipher = HIGH:!aNULL:!MD5 # 限制加密套件
踩坑:這里我嘗試過修改證書存放目錄,mysql可以啟動成功,但是ssl會開啟失敗,日志中會出現(xiàn)失敗提示,倒騰了半天也沒找出原因,所以不建議修改證書存放路徑
audit-mysql | 2025-09-29T07:57:32.455742Z 0 [Warning] [MY-013595] [Server] Failed to initialize TLS for channel: mysql_main. See below for the description of exact issue. audit-mysql | 2025-09-29T07:57:32.461268Z 0 [Warning] [MY-010069] [Server] Failed to set up SSL because of the following SSL library error: SSL_CTX_set_default_verify_paths failed
步驟二:編寫docker-compose.yml文件
version: '3.8'
services:
# MySQL 8.0.42
mysql:
# build: ./mysql
image: mysql:8.0.42
container_name: audit-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: Admin@123
MYSQL_DATABASE: grzsk
MYSQL_USER: grzsk-user
MYSQL_PASSWORD: Admin@123
TZ: Asia/Shanghai
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf.d:/etc/mysql/conf.d
- ./mysql/audit-logs:/var/log/mysql
ports:
- "12001:3306"
networks:
- backend
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 5s
timeout: 10s
retries: 5步驟三:將配置文件my.cnf放入 ./mysql/conf.d文件夾中
步驟四:啟動docker容器,docker-compose up -d

步驟五:編寫ssl證書生成腳本: ssl-genrenal.sh
#!/bin/bash
set -e # 遇到錯誤立即退出
# ==============================================
# 配置參數(shù)
# ==============================================
SSL_DIR="./mysql/ssl" # 證書存儲目錄
CA_DAYS=3650 # CA證書有效期(10年)
CERT_DAYS=3650 # 服務(wù)器/客戶端證書有效期(10年)
COUNTRY="CN" # 國家代碼
STATE="guangzhou" # 省份/州
CITY="guangzhou" # 城市
ORG="zuzhi" # 組織
UNIT="DBA" # 部門
COMMON_NAME="mysql-server" # 服務(wù)器通用名稱
CLIENT_COMMON_NAME="mysql-client" # 客戶端通用名稱
EMAIL="admin@zuzhi.com" # 聯(lián)系郵箱
# ==============================================
# 清理舊證書并創(chuàng)建目錄
# ==============================================
echo "===== 準(zhǔn)備證書目錄 ====="
if [ -d "$SSL_DIR" ]; then
echo "刪除舊證書目錄: $SSL_DIR"
rm -rf "$SSL_DIR"
fi
echo "創(chuàng)建新證書目錄: $SSL_DIR"
mkdir -p "$SSL_DIR" || { echo "錯誤:無法創(chuàng)建目錄 $SSL_DIR"; exit 1; }
cd "$SSL_DIR" || { echo "錯誤:無法進(jìn)入目錄 $SSL_DIR"; exit 1; }
chmod 700 . # 限制目錄訪問權(quán)限
# ==============================================
# 生成CA根證書
# ==============================================
echo -e "\n===== 生成CA根證書 ====="
echo "生成CA私鑰 (ca-key.pem)..."
openssl genrsa -out ca-key.pem 2048 || { echo "錯誤:CA私鑰生成失敗"; exit 1; }
echo "生成CA根證書 (ca-cert.pem)..."
openssl req -new -x509 -nodes -days "$CA_DAYS" \
-key ca-key.pem \
-out ca.pem \
-subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORG/OU=$UNIT/CN=$COMMON_NAME/emailAddress=$EMAIL" || {
echo "錯誤:CA根證書生成失敗"; exit 1; }
# 驗(yàn)證CA私鑰格式
echo "驗(yàn)證CA私鑰格式..."
if ! grep -- "-----BEGIN RSA PRIVATE KEY-----" ca-key.pem >/dev/null 2>&1; then
echo "錯誤:CA私鑰格式不正確,缺少起始標(biāo)記"
exit 1
fi
# ==============================================
# 生成服務(wù)器證書(移除PKCS#8轉(zhuǎn)換)
# ==============================================
echo -e "\n===== 生成服務(wù)器證書 ====="
echo "生成服務(wù)器私鑰 (server-key.pem)..."
openssl genrsa -out server-key.pem 2048 || { echo "錯誤:服務(wù)器私鑰生成失敗"; exit 1; }
# 驗(yàn)證服務(wù)器私鑰格式
if ! grep -- "-----BEGIN RSA PRIVATE KEY-----" server-key.pem >/dev/null 2>&1; then
echo "錯誤:服務(wù)器私鑰格式不正確,缺少起始標(biāo)記"
exit 1
fi
echo "生成服務(wù)器證書請求 (server-req.pem)..."
openssl req -new -key server-key.pem -out server-req.pem \
-subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORG/OU=$UNIT/CN=$COMMON_NAME/emailAddress=$EMAIL" || {
echo "錯誤:服務(wù)器證書請求生成失敗"; exit 1; }
echo "用CA簽名服務(wù)器證書 (server-cert.pem)..."
openssl x509 -req -in server-req.pem -days "$CERT_DAYS" \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem || {
echo "錯誤:服務(wù)器證書簽名失敗"; exit 1; }
# ==============================================
# 生成客戶端證書(移除PKCS#8轉(zhuǎn)換)
# ==============================================
echo -e "\n===== 生成客戶端證書 ====="
echo "生成客戶端私鑰 (client-key.pem)..."
openssl genrsa -out client-key.pem 2048 || { echo "錯誤:客戶端私鑰生成失敗"; exit 1; }
# 驗(yàn)證客戶端私鑰格式
if ! grep -- "-----BEGIN RSA PRIVATE KEY-----" client-key.pem >/dev/null 2>&1; then
echo "錯誤:客戶端私鑰格式不正確,缺少起始標(biāo)記"
exit 1
fi
echo "生成客戶端證書請求 (client-req.pem)..."
openssl req -new -key client-key.pem -out client-req.pem \
-subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORG/OU=$UNIT/CN=$CLIENT_COMMON_NAME/emailAddress=$EMAIL" || {
echo "錯誤:客戶端證書請求生成失敗"; exit 1; }
echo "用CA簽名客戶端證書 (client-cert.pem)..."
openssl x509 -req -in client-req.pem -days "$CERT_DAYS" \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial -out client-cert.pem || {
echo "錯誤:客戶端證書簽名失敗"; exit 1; }
# ==============================================
# 清理臨時文件
# ==============================================
echo -e "\n===== 清理臨時文件 ====="
rm -f server-req.pem client-req.pem
# ==============================================
# 生成結(jié)果驗(yàn)證
# ==============================================
echo -e "\n===== 證書生成完成 ====="
echo "證書存儲目錄: $(pwd)"
echo "生成的文件列表:"
ls -l ./*
# 驗(yàn)證關(guān)鍵文件是否存在且非空
REQUIRED_FILES=("ca-key.pem" "ca.pem" "server-key.pem" "server-cert.pem" "client-key.pem" "client-cert.pem")
for file in "${REQUIRED_FILES[@]}"; do
if [ ! -s "$file" ]; then
echo "警告:關(guān)鍵文件 $file 不存在或?yàn)榭?,生成過程可能有問題"
fi
done步驟六:執(zhí)行腳本:sh ssl-genrenal.sh,將ssl文件夾下的文件復(fù)制到./mysql/mysql-data目錄中
步驟七:重啟容器 docker-compose restart,至此ssl開啟成功,可以用客戶端測試連接
客戶端連接
一、Navicat連接
1、將ca.pem、client-key.pem、client-cert.pem三個文件下載到本地,配置好參數(shù)測試連接

二、java程序連接
1、步驟一:將客戶端證書下載到resource文件夾下

2、步驟二:配置連接參數(shù)

url: jdbc:mysql://192.168.140.14:12001/grzsk?useSSL=true&verifyServerCertificate=true&sslCa=classpath:ssl/ca.pem&sslCert=classpath:ssl/client-cert.pem&sslKey=classpath:ssl/client-key.pem&characterEncoding=UTF-8&useUnicode=true&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
3、啟動程序,不出意外的話要出意外了

出現(xiàn)報錯:java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
原因是Java 無法找到信任鏈中可信任的根證書,導(dǎo)致證書路徑驗(yàn)證失敗。
4、使用keytool工具(Java 自帶)導(dǎo)入根證書
通常在 $JAVA_HOME/jre/lib/security/cacerts(JDK 8 及以下)或 $JAVA_HOME/lib/security/cacerts(JDK 9+)。默認(rèn)密碼為 changeit
導(dǎo)入命令如下:
keytool -importcert -alias myrootca -file /path/to/ca.pem -keystore $JAVA_HOME/jre/lib/security/cacerts
5、導(dǎo)入結(jié)果

6、重新啟動程序:啟動成功

總結(jié)
到此這篇關(guān)于Mysql8.0.42啟用SSL安全連接的文章就介紹到這了,更多相關(guān)Mysql啟用SSL安全連接內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySql 5.6.14 Win32位免安裝解壓縮版配置教程
本文給大家介紹mysql 5.6.14 win32 位免安裝解壓縮版配置方法,本文分步驟給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,對mysql5.6.14 免安裝解壓縮版配置方法感興趣的朋友一起看看吧2016-11-11
阿里云ECS centos6.8下安裝配置MySql5.7的教程
阿里云默認(rèn)yum命令下的MySQL是5.17****,安裝mysql5.7之前先卸載以前的版本。下面通過本文給大家介紹阿里云ECS centos6.8下安裝配置MySql5.7的教程,需要的的朋友參考下吧2017-07-07
MySQL中(JOIN/ORDER BY)語句的查詢過程及優(yōu)化方法
sql語句性能達(dá)不到你的要求,執(zhí)行效率讓你忍無可忍,一般會造成很多影響。那么我們?nèi)绾谓鉀Q這些問題呢,下面由小編來和大家簡單講下2019-05-05
詳解標(biāo)準(zhǔn)mysql(x64) Windows版安裝過程
這篇文章主要介紹了標(biāo)準(zhǔn)mysql(x64) Windows版安裝過程,需要的朋友可以參考下2017-08-08

