MySQL配置SSL加密訪問的實現步驟
要為MySQL配置SSL加密訪問,核心目標是讓客戶端與MySQL服務端之間的網絡傳輸數據被SSL/TLS加密,防止數據在傳輸過程中被竊聽、篡改或偽造。以下是完整的配置步驟(涵蓋自建證書、服務端配置、客戶端驗證),分為「測試環(huán)境(自建自簽名證書)」和「生產環(huán)境(CA簽發(fā)證書)」兩種場景。
這里著重講解自建方案,個人感覺自建方案可操作性強,CA簽發(fā)證書一年需要更新一次,對于數據庫來講誰也受不了。
一、前提說明
MySQL版本要求:5.7及以上默認支持SSL,8.0+內置簡易證書生成工具(推薦使用);
核心邏輯:MySQL通過SSL證書完成服務端/客戶端身份驗證,同時加密傳輸數據;
證書類型:
- 自簽名證書:適合測試/內網環(huán)境,無需CA認證,但客戶端需信任該證書;
- CA簽發(fā)證書:適合生產環(huán)境,安全性更高,需向可信CA申請證書。
二、步驟1:生成SSL證書(自建自簽名,測試環(huán)境)
方式1:MySQL內置工具自動生成(推薦,8.0+)
MySQL 8.0+提供mysql_ssl_rsa_setup工具,可一鍵生成自簽名SSL證書:
# 1. 進入MySQL數據目錄(需確認目錄權限,通常為/var/lib/mysql/) cd /var/lib/mysql chown mysql:mysql . # 確保mysql用戶有讀寫權限 # 2. 生成SSL證書(--datadir指定證書存放目錄) mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql # 3. 查看生成的證書文件(關鍵文件如下) ls -l /var/lib/mysql/*.pem # 核心文件說明: # ca.pem → CA根證書(客戶端需信任) # server-cert.pem → 服務端證書 # server-key.pem → 服務端私鑰 # client-cert.pem → 客戶端證書 # client-key.pem → 客戶端私鑰
方式2:手動生成(適配5.7+/8.0,通用)
若mysql_ssl_rsa_setup不可用,用openssl手動生成:
# 1. 創(chuàng)建證書目錄(建議與MySQL數據目錄分離) mkdir -p /etc/mysql/ssl chown mysql:mysql /etc/mysql/ssl cd /etc/mysql/ssl # 2. 生成CA根證書(有效期10年) openssl genrsa 2048 > ca-key.pem openssl req -new -x509 -nodes -days 3650 -key ca-key.pem > ca.pem # 3. 生成服務端證書(填寫信息時,Common Name需為MySQL服務端IP/域名) openssl req -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > server-req.pem openssl rsa -in server-key.pem -out server-key.pem openssl x509 -req -in server-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem # 4. 生成客戶端證書(Common Name可任意,建議區(qū)分服務端) openssl req -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem > client-req.pem openssl rsa -in client-key.pem -out client-key.pem openssl x509 -req -in client-req.pem -days 3650 -CA ca.pem -CAkey ca-key.pem -set_serial 02 > client-cert.pem # 5. 調整權限(僅mysql用戶可讀寫,防止私鑰泄露) chmod 600 *.pem chown mysql:mysql *.pem
三、步驟2:配置MySQL服務端啟用SSL
1. 修改MySQL配置文件
編輯MySQL配置文件(Linux:/etc/my.cnf//etc/mysql/my.cnf;Windows:my.ini),添加以下配置:
[mysqld] # 啟用SSL(強制服務端使用SSL) ssl=ON # 指定證書路徑(根據實際生成路徑修改) ssl-ca=/var/lib/mysql/ca.pem # CA根證書 ssl-cert=/var/lib/mysql/server-cert.pem # 服務端證書 ssl-key=/var/lib/mysql/server-key.pem # 服務端私鑰 # 可選:強制所有客戶端連接必須使用SSL(生產環(huán)境建議開啟) # require_secure_transport=ON # 可選:指定SSL協(xié)議版本(避免老舊協(xié)議,生產環(huán)境建議) tls_version=TLSv1.2,TLSv1.3
2. 重啟MySQL服務
# Linux(Systemd) systemctl restart mysqld # Linux(SysV) service mysqld restart # Windows net stop mysql && net start mysql
3. 驗證服務端SSL是否啟用
登錄MySQL服務端,執(zhí)行以下命令:
-- 查看SSL狀態(tài)(Ssl_enabled為YES表示啟用成功) SHOW VARIABLES LIKE '%ssl%'; /* 預期輸出: +---------------+---------------------------+ | Variable_name | Value | +---------------+---------------------------+ | have_ssl | YES | | ssl_ca | /var/lib/mysql/ca.pem | | ssl_cert | /var/lib/mysql/server-cert.pem | | ssl_key | /var/lib/mysql/server-key.pem | +---------------+---------------------------+ */
四、步驟3:配置客戶端SSL連接
場景1:客戶端連接時手動指定SSL(非強制)
客戶端連接MySQL時,通過參數指定SSL證書,實現加密連接:
# MySQL客戶端命令行連接(替換為你的IP/端口/用戶名) mysql -h 192.168.1.100 -P 3306 -u root -p \ --ssl-mode=REQUIRED \ --ssl-ca=/var/lib/mysql/ca.pem \ --ssl-cert=/var/lib/mysql/client-cert.pem \ --ssl-key=/var/lib/mysql/client-key.pem
參數說明:
-
--ssl-mode=REQUIRED:強制使用SSL連接,無SSL則拒絕(可選值:DISABLED/REQUIRED/VERIFY_CA/VERIFY_IDENTITY); -
--ssl-ca:指定CA根證書(驗證服務端證書合法性); -
--ssl-cert/--ssl-key:客戶端證書/私鑰(服務端驗證客戶端身份時需用)。
場景2:授權用戶必須使用SSL連接(生產環(huán)境)
為MySQL用戶配置“僅允許SSL加密連接”,防止明文連接:
-- 授權root用戶僅能通過SSL從任意主機訪問(替換為你的用戶/IP) GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密碼' REQUIRE SSL; -- 刷新權限 FLUSH PRIVILEGES; -- 查看用戶的SSL權限(Ssl_type為SSL表示強制) SELECT user, host, ssl_type FROM mysql.user WHERE user='root';
場景3:客戶端配置文件持久化SSL(無需每次輸參數)
編輯客戶端~/.my.cnf(Linux)或%APPDATA%\MySQL\.my.cnf(Windows):
[client] host=192.168.1.100 port=3306 user=root password=你的密碼 ssl-mode=REQUIRED ssl-ca=/var/lib/mysql/ca.pem ssl-cert=/var/lib/mysql/client-cert.pem ssl-key=/var/lib/mysql/client-key.pem
之后直接執(zhí)行mysql即可自動使用SSL連接。
五、步驟4:驗證SSL加密是否生效
1. 客戶端驗證連接狀態(tài)
登錄MySQL后,執(zhí)行以下命令:
-- 查看當前連接的SSL狀態(tài)(Ssl_cipher非空表示加密生效) SHOW STATUS LIKE 'Ssl_cipher'; /* 預期輸出: +---------------+-----------------------------+ | Variable_name | Value | +---------------+-----------------------------+ | Ssl_cipher | TLS_AES_256_GCM_SHA384 | +---------------+-----------------------------+ */
2. 網絡層面驗證(可選)
用tcpdump/wireshark抓包,查看MySQL端口(3306)的流量:
- 未加密:能看到明文的SQL語句(如
SELECT * FROM user); - 已加密:流量為亂碼,無明文SQL。
六、關鍵注意事項
生產環(huán)境建議:
- 不要使用自簽名證書,改用Let’s Encrypt等可信CA簽發(fā)的證書;
- 啟用
require_secure_transport=ON,強制所有連接使用SSL; - 限制SSL協(xié)議版本為
TLSv1.2+,禁用TLSv1.0/TLSv1.1(老舊協(xié)議有安全漏洞)。
2. 權限安全:
- 證書文件(尤其是私鑰
.pem)必須僅對mysql用戶可讀寫(權限600),防止泄露; - 客戶端證書不要隨意外傳,僅分發(fā)給可信客戶端。
3. 性能影響:
- SSL加密會增加少量CPU開銷(約5%-10%),高并發(fā)場景可通過硬件加速優(yōu)化;
- 若內網環(huán)境已做網絡隔離,可僅對跨公網的連接啟用SSL。
4. 常見問題:
- 連接失敗提示
SSL connection error:檢查證書路徑/權限、MySQL服務端SSL是否啟用; - 客戶端驗證失?。捍_保CA證書一致,服務端/客戶端證書的Common Name匹配;
- MySQL 5.7以下:需手動編譯啟用SSL,建議升級到5.7+。
到此這篇關于MySQL配置SSL加密訪問的實現步驟的文章就介紹到這了,更多相關MySQL配置SSL加密訪問內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
CentOS7環(huán)境安裝包部署并配置MySQL5.7教程
文章詳細介紹了卸載和重新安裝MySQL 5.7的步驟,包括卸載舊版本、查看和卸載相關服務、下載和解壓新版本安裝包、創(chuàng)建用戶和目錄、配置my.cnf、初始化數據庫、啟動和修改密碼等過程,同時,還解決了客戶端不支持問題以及配置遠程登錄的步驟2026-02-02

