SHOW VARIABLES LIKE 'have_ssl';
-- have_ssl = YES 表示已編譯支援
mkdir ~/ssl && cd ~/ssl
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
# 填寫主體資訊 (CN、O、OU 等),Email 可填
# 私鑰 + CSR
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > server-req.pem
# 轉 RSA 格式
openssl rsa -in server-key.pem -out server-key.pem
# CA 簽發伺服器憑證
openssl x509 -sha1 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
openssl req -sha1 -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 -sha1 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
mkdir ~/ssl && cd ~/ssl
mysql_ssl_rsa_setup --datadir ./
# 產生同樣 8 個檔案,命名略異 (ca.pem、private_key.pem、public_key.pem 等)
[mysqld]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem
bind-address = * # 允許遠端連線
重啟服務生效。
CREATE USER 'ssl_test'@'%' IDENTIFIED BY 'ssl_test' REQUIRE SSL;
GRANT ALL PRIVILEGES ON *.* TO 'ssl_test'@'%';
FLUSH PRIVILEGES;
SHOW VARIABLES LIKE '%ssl%';
-- have_ssl=YES, have_openssl=YES, ssl_ca/cert/key 路徑正確
mysql --ssl-ca=/path/ca-cert.pem --ssl-cert=/path/client-cert.pem --ssl-key=/path/client-key.pem -h host -u ssl_test -p
[client]
ssl-ca=/path/ca-cert.pem
ssl-cert=/path/client-cert.pem
ssl-key=/path/client-key.pem
mysql> \s
...
SSL: Cipher in use is DHE-RSA-AES256-SHA -- 出現此行即成功
...
~/mysql-ssl/
├── cert/ # 掛載憑證
│ ├── ca-cert.pem
│ ├── server-cert.pem
│ ├── server-key.pem
│ ├── client-cert.pem
│ └── client-key.pem
├── config/ # 掛載 my.cnf
│ └── my.cnf
└── data/ # 掛載資料目錄
[mysqld]
ssl-ca=/etc/mysql/cert/ca-cert.pem
ssl-cert=/etc/mysql/cert/server-cert.pem
ssl-key=/etc/mysql/cert/server-key.pem
bind-address = *
docker run -d --name mysql-ssl \
-p 3306:3306 \
-e MYSQL_ROOT_PASSWORD=root \
-v ~/mysql-ssl/data:/var/lib/mysql \
-v ~/mysql-ssl/config:/etc/mysql/conf.d \
-v ~/mysql-ssl/cert:/etc/mysql/cert \
mysql:5.7
docker run -it --rm --link mysql-ssl:db mysql:5.7 \
sh -c 'exec mysql -uroot -proot -h db -e "SHOW VARIABLES LIKE \"%ssl%\""'
docker run -it --rm --link mysql-ssl:db mysql:5.7 \
sh -c 'exec mysql -uroot -proot -h db -e "CREATE USER \"ssl_test\"@\"%\" IDENTIFIED BY \"ssl_test\" REQUIRE SSL; GRANT ALL ON *.* TO \"ssl_test\"@\"%\"; FLUSH PRIVILEGES;"'
docker run -it --rm --link mysql-ssl:db \
-v ~/mysql-ssl/cert:/etc/mysql/cert \
mysql:5.7 \
sh -c 'exec mysql --ssl-ca=/etc/mysql/cert/ca-cert.pem --ssl-cert=/etc/mysql/cert/client-cert.pem --ssl-key=/etc/mysql/cert/client-key.pem -h db -u ssl_test -p'
登入後執行 `\s` 確認 `SSL: Cipher in use is ...`
| 現象 | 原因 | 解決 |
|---|---|---|
| ERROR 2026 (HY000): SSL connection error | 憑證路徑錯誤/權限/格式 | 檢查路徑、chmod 600 *.pem、openssl verify |
| Cipher 不顯示 / SSL: Not in use | 未要求 SSL / 帳號無 REQUIRE SSL / 參數缺漏 | 帳號 REQUIRE SSL、客戶端帶三參數、my.cnf ssl-* 路徑正確 |
| Host 'x.x.x.x' is not allowed to connect | bind-address / 防火牆 / 帳號 host 限制 | bind-address=*、安全組放行 3306、帳號 @'%' |
MySQL SSL 連線透過標準 TLS 保障傳輸層機密性與完整性,OpenSSL 手動流程雖繁瑣但可完整掌控鏈路;5.7+ 內建工具與 Docker 卷掛載大幅簡化部署,**REQUIRE SSL** 帳號策略是強制加密的關鍵。