因業務需求,需對 MySQL 通訊進行 SSL 加密。本文記錄在 Server 端與 Client 端部署 Stunnel 實現 MySQL 連線加密的完整流程,包含憑證生成、配置檔編寫、防火牆設定與驗證測試。
# 安裝
yum install mysql-server mysql
# 啟動並授權遠程存取
mysql -uroot
grant all privileges on *.* to root@'172.31.12.139' identified by "passwordformysql";
# 安裝
yum install stunnel
# 生成自簽名憑證(有效期 10 年)
cd /etc/stunnel
openssl req -x509 -nodes -days 36500 -newkey rsa:1024 -keyout stunnel.pem -out stunnel.pem
參數說明:
req:PKCS#10 憑證請求與生成工具-x509:生成自簽名憑證而非請求檔-days:憑證有效天數-nodes:不加密私鑰vi /etc/stunnel/stunnel.conf
cert = /etc/stunnel/stunnel.pem
setuid = nobody
setgid = nobody
pid = /tmp/stunnel.pid
debug = 7
output = /var/log/stunnel.log
[mysqls]
accept = 3309 # 對外監聽端口
connect = 3306 # 實際 MySQL 服務端口
# 啟動
stunnel
# 檢查監聽端口
netstat -npl
# 防火牆規則(僅允許特定 IP 存取 3309)
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -s 172.31.12.139 -p tcp --dport 3309 -j ACCEPT
yum install mysql
將伺服器端生成的 stunnel.pem 複製至客戶端 /etc/stunnel/ 目錄。
vi /etc/stunnel/stunnel.conf
cert = /etc/stunnel/stunnel.pem
pid = /tmp/stunnel.pid
setuid = nobody
setgid = nobody
debug = 7
output = /var/log/stunnel.log
client = yes # 必須啟用客戶端模式
[mysqls]
accept = 3309 # 本地監聽端口
connect = 172.31.12.198:3309 # 伺服器 IP 與端口
# 啟動客戶端 stunnel
stunnel
# 連線測試(連接本地 3309,經由 stunnel 加密轉發至伺服器)
mysql -h 127.0.0.1 -uroot -p -P 3309
查看雙端日誌,出現 SSL connected / SSL accepted 即代表通訊已加密:
2010.09.02 14:04:27 LOG6[1852]: SSL connected: previous session reused
2010.09.02 13:58:18 LOG6[22948]: SSL accepted: previous session reused
2010.09.02 13:58:18 LOG7[22948]: MySQLs1 connecting 127.0.0.1:3306
日誌確認 MySQL 客戶端與伺服器端通訊已通過 SSL 加密傳輸。