MySQL配置SSL加密訪問(wèn)的實(shí)現(xiàn)步驟
要為MySQL配置SSL加密訪問(wèn),核心目標(biāo)是讓客戶端與MySQL服務(wù)端之間的網(wǎng)絡(luò)傳輸數(shù)據(jù)被SSL/TLS加密,防止數(shù)據(jù)在傳輸過(guò)程中被竊聽(tīng)、篡改或偽造。以下是完整的配置步驟(涵蓋自建證書、服務(wù)端配置、客戶端驗(yàn)證),分為「測(cè)試環(huán)境(自建自簽名證書)」和「生產(chǎn)環(huán)境(CA簽發(fā)證書)」兩種場(chǎng)景。
這里著重講解自建方案,個(gè)人感覺(jué)自建方案可操作性強(qiáng),CA簽發(fā)證書一年需要更新一次,對(duì)于數(shù)據(jù)庫(kù)來(lái)講誰(shuí)也受不了。
一、前提說(shuō)明
MySQL版本要求:5.7及以上默認(rèn)支持SSL,8.0+內(nèi)置簡(jiǎn)易證書生成工具(推薦使用);
核心邏輯:MySQL通過(guò)SSL證書完成服務(wù)端/客戶端身份驗(yàn)證,同時(shí)加密傳輸數(shù)據(jù);
證書類型:
- 自簽名證書:適合測(cè)試/內(nèi)網(wǎng)環(huán)境,無(wú)需CA認(rèn)證,但客戶端需信任該證書;
- CA簽發(fā)證書:適合生產(chǎn)環(huán)境,安全性更高,需向可信CA申請(qǐng)證書。
二、步驟1:生成SSL證書(自建自簽名,測(cè)試環(huán)境)
方式1:MySQL內(nèi)置工具自動(dòng)生成(推薦,8.0+)
MySQL 8.0+提供mysql_ssl_rsa_setup工具,可一鍵生成自簽名SSL證書:
# 1. 進(jìn)入MySQL數(shù)據(jù)目錄(需確認(rèn)目錄權(quán)限,通常為/var/lib/mysql/) cd /var/lib/mysql chown mysql:mysql . # 確保mysql用戶有讀寫權(quán)限 # 2. 生成SSL證書(--datadir指定證書存放目錄) mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql # 3. 查看生成的證書文件(關(guān)鍵文件如下) ls -l /var/lib/mysql/*.pem # 核心文件說(shuō)明: # ca.pem → CA根證書(客戶端需信任) # server-cert.pem → 服務(wù)端證書 # server-key.pem → 服務(wù)端私鑰 # client-cert.pem → 客戶端證書 # client-key.pem → 客戶端私鑰
方式2:手動(dòng)生成(適配5.7+/8.0,通用)
若mysql_ssl_rsa_setup不可用,用openssl手動(dòng)生成:
# 1. 創(chuàng)建證書目錄(建議與MySQL數(shù)據(jù)目錄分離) 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. 生成服務(wù)端證書(填寫信息時(shí),Common Name需為MySQL服務(wù)端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ū)分服務(wù)端) 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. 調(diào)整權(quán)限(僅mysql用戶可讀寫,防止私鑰泄露) chmod 600 *.pem chown mysql:mysql *.pem
三、步驟2:配置MySQL服務(wù)端啟用SSL
1. 修改MySQL配置文件
編輯MySQL配置文件(Linux:/etc/my.cnf//etc/mysql/my.cnf;Windows:my.ini),添加以下配置:
[mysqld] # 啟用SSL(強(qiáng)制服務(wù)端使用SSL) ssl=ON # 指定證書路徑(根據(jù)實(shí)際生成路徑修改) ssl-ca=/var/lib/mysql/ca.pem # CA根證書 ssl-cert=/var/lib/mysql/server-cert.pem # 服務(wù)端證書 ssl-key=/var/lib/mysql/server-key.pem # 服務(wù)端私鑰 # 可選:強(qiáng)制所有客戶端連接必須使用SSL(生產(chǎn)環(huán)境建議開(kāi)啟) # require_secure_transport=ON # 可選:指定SSL協(xié)議版本(避免老舊協(xié)議,生產(chǎn)環(huán)境建議) tls_version=TLSv1.2,TLSv1.3
2. 重啟MySQL服務(wù)
# Linux(Systemd) systemctl restart mysqld # Linux(SysV) service mysqld restart # Windows net stop mysql && net start mysql
3. 驗(yàn)證服務(wù)端SSL是否啟用
登錄MySQL服務(wù)端,執(zhí)行以下命令:
-- 查看SSL狀態(tài)(Ssl_enabled為YES表示啟用成功) SHOW VARIABLES LIKE '%ssl%'; /* 預(yù)期輸出: +---------------+---------------------------+ | 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連接
場(chǎng)景1:客戶端連接時(shí)手動(dòng)指定SSL(非強(qiáng)制)
客戶端連接MySQL時(shí),通過(guò)參數(shù)指定SSL證書,實(shí)現(xiàn)加密連接:
# 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
參數(shù)說(shuō)明:
-
--ssl-mode=REQUIRED:強(qiáng)制使用SSL連接,無(wú)SSL則拒絕(可選值:DISABLED/REQUIRED/VERIFY_CA/VERIFY_IDENTITY); -
--ssl-ca:指定CA根證書(驗(yàn)證服務(wù)端證書合法性); -
--ssl-cert/--ssl-key:客戶端證書/私鑰(服務(wù)端驗(yàn)證客戶端身份時(shí)需用)。
場(chǎng)景2:授權(quán)用戶必須使用SSL連接(生產(chǎn)環(huán)境)
為MySQL用戶配置“僅允許SSL加密連接”,防止明文連接:
-- 授權(quán)root用戶僅能通過(guò)SSL從任意主機(jī)訪問(wèn)(替換為你的用戶/IP) GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密碼' REQUIRE SSL; -- 刷新權(quán)限 FLUSH PRIVILEGES; -- 查看用戶的SSL權(quán)限(Ssl_type為SSL表示強(qiáng)制) SELECT user, host, ssl_type FROM mysql.user WHERE user='root';
場(chǎng)景3:客戶端配置文件持久化SSL(無(wú)需每次輸參數(shù))
編輯客戶端~/.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即可自動(dòng)使用SSL連接。
五、步驟4:驗(yàn)證SSL加密是否生效
1. 客戶端驗(yàn)證連接狀態(tài)
登錄MySQL后,執(zhí)行以下命令:
-- 查看當(dāng)前連接的SSL狀態(tài)(Ssl_cipher非空表示加密生效) SHOW STATUS LIKE 'Ssl_cipher'; /* 預(yù)期輸出: +---------------+-----------------------------+ | Variable_name | Value | +---------------+-----------------------------+ | Ssl_cipher | TLS_AES_256_GCM_SHA384 | +---------------+-----------------------------+ */
2. 網(wǎng)絡(luò)層面驗(yàn)證(可選)
用tcpdump/wireshark抓包,查看MySQL端口(3306)的流量:
- 未加密:能看到明文的SQL語(yǔ)句(如
SELECT * FROM user); - 已加密:流量為亂碼,無(wú)明文SQL。
六、關(guān)鍵注意事項(xiàng)
生產(chǎn)環(huán)境建議:
- 不要使用自簽名證書,改用Let’s Encrypt等可信CA簽發(fā)的證書;
- 啟用
require_secure_transport=ON,強(qiáng)制所有連接使用SSL; - 限制SSL協(xié)議版本為
TLSv1.2+,禁用TLSv1.0/TLSv1.1(老舊協(xié)議有安全漏洞)。
2. 權(quán)限安全:
- 證書文件(尤其是私鑰
.pem)必須僅對(duì)mysql用戶可讀寫(權(quán)限600),防止泄露; - 客戶端證書不要隨意外傳,僅分發(fā)給可信客戶端。
3. 性能影響:
- SSL加密會(huì)增加少量CPU開(kāi)銷(約5%-10%),高并發(fā)場(chǎng)景可通過(guò)硬件加速優(yōu)化;
- 若內(nèi)網(wǎng)環(huán)境已做網(wǎng)絡(luò)隔離,可僅對(duì)跨公網(wǎng)的連接啟用SSL。
4. 常見(jiàn)問(wèn)題:
- 連接失敗提示
SSL connection error:檢查證書路徑/權(quán)限、MySQL服務(wù)端SSL是否啟用; - 客戶端驗(yàn)證失?。捍_保CA證書一致,服務(wù)端/客戶端證書的Common Name匹配;
- MySQL 5.7以下:需手動(dòng)編譯啟用SSL,建議升級(jí)到5.7+。
到此這篇關(guān)于MySQL配置SSL加密訪問(wèn)的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)MySQL配置SSL加密訪問(wèn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL無(wú)法啟動(dòng)1067錯(cuò)誤的又一種解決方法(機(jī)房斷電)
今早在對(duì)一張table 創(chuàng)建primay key過(guò)程中發(fā)生了斷電,當(dāng)電腦再次啟動(dòng)時(shí)候,發(fā)現(xiàn)mysql 服務(wù)無(wú)法啟動(dòng),使用 net start 提示 1067錯(cuò)誤,折騰了2個(gè)小時(shí)無(wú)法解決,后來(lái)只能通過(guò)手工刪除數(shù)據(jù)文件,日志文件,再啟動(dòng)服務(wù),然后導(dǎo)入數(shù)據(jù)來(lái)完成2013-01-01
在idea中如何操作MySQL數(shù)據(jù)庫(kù)
這篇文章主要介紹了在idea中如何操作MySQL數(shù)據(jù)庫(kù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
淺談MySQL數(shù)據(jù)庫(kù)的備份與恢復(fù)
MYSQL數(shù)據(jù)庫(kù)的備份、恢復(fù)等是每一位信息管理人員應(yīng)必備的能力,因此掌握MYSQL數(shù)據(jù)庫(kù)管理的技巧會(huì)使您的工作事半功倍,這里我們來(lái)簡(jiǎn)單總結(jié)下。2017-01-01
MySQL中字符集與排序規(guī)則的實(shí)現(xiàn)
本文主要介紹了MySQL中字符集與排序規(guī)則的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2026-01-01
CentOS7環(huán)境安裝包部署并配置MySQL5.7教程
文章詳細(xì)介紹了卸載和重新安裝MySQL 5.7的步驟,包括卸載舊版本、查看和卸載相關(guān)服務(wù)、下載和解壓新版本安裝包、創(chuàng)建用戶和目錄、配置my.cnf、初始化數(shù)據(jù)庫(kù)、啟動(dòng)和修改密碼等過(guò)程,同時(shí),還解決了客戶端不支持問(wèn)題以及配置遠(yuǎn)程登錄的步驟2026-02-02
探索MySQL?8中utf8mb4釋放多語(yǔ)言數(shù)據(jù)的強(qiáng)大潛力
這篇文章主要為大家介紹了探索MySQL?8中utf8mb4釋放多語(yǔ)言數(shù)據(jù)的強(qiáng)大潛力,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12
mysql 無(wú)法連接問(wèn)題的定位和修復(fù)過(guò)程分享
開(kāi)發(fā)的一款網(wǎng)站防護(hù)產(chǎn)品中出現(xiàn)了一個(gè)客戶端上安裝后Mysql每隔一段時(shí)間就出現(xiàn)問(wèn)題,這個(gè)問(wèn)題是客戶反饋的,所以需要去復(fù)現(xiàn)和定位2013-03-03

