首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL SSL 連線完整配置指南:OpenSSL 憑證產生、Server/Client 設定、Docker 實戰驗證

     編輯:MySQL 資料庫相關知識

前置檢查


SHOW VARIABLES LIKE 'have_ssl';
-- have_ssl = YES 表示已編譯支援

方法一:OpenSSL 手動產生完整憑證鏈 (8 個檔案)

1. 建立 CA


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 可填

2. 伺服器端憑證


# 私鑰 + 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

3. 客戶端憑證 (同樣流程)


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

4. 產出檔案清單

  • CA:`ca-cert.pem` (公鑰)、`ca-key.pem` (私鑰)
  • Server:`server-cert.pem`、 `server-key.pem`
  • Client:`client-cert.pem`、 `client-key.pem`
  • 中間:`server-req.pem`、`client-req.pem` (可刪除)

方法二:MySQL 5.7+ 內建工具 `mysql_ssl_rsa_setup` (一鍵產生)


mkdir ~/ssl && cd ~/ssl
mysql_ssl_rsa_setup --datadir ./
# 產生同樣 8 個檔案,命名略異 (ca.pem、private_key.pem、public_key.pem 等)

伺服器端配置 (my.cnf → [mysqld])


[mysqld]
ssl-ca=/etc/mysql/ca-cert.pem
ssl-cert=/etc/mysql/server-cert.pem
ssl-key=/etc/mysql/server-key.pem
bind-address = *  # 允許遠端連線

重啟服務生效。

建立強制 SSL 登入帳號


CREATE USER 'ssl_test'@'%' IDENTIFIED BY 'ssl_test' REQUIRE SSL;
GRANT ALL PRIVILEGES ON *.* TO 'ssl_test'@'%';
FLUSH PRIVILEGES;

驗證伺服器 SSL 狀態


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

配置檔 ~/.my.cnf


[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  -- 出現此行即成功
...

Docker 實戰部署 (完整可複製)

目錄結構


~/mysql-ssl/
├── cert/           # 掛載憑證
│   ├── ca-cert.pem
│   ├── server-cert.pem
│   ├── server-key.pem
│   ├── client-cert.pem
│   └── client-key.pem
├── config/         # 掛載 my.cnf
│   └── my.cnf
└── data/           # 掛載資料目錄

my.cnf 內容


[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 = *

啟動 Server 容器


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

驗證 Server SSL


docker run -it --rm --link mysql-ssl:db mysql:5.7 \
  sh -c 'exec mysql -uroot -proot -h db -e "SHOW VARIABLES LIKE \"%ssl%\""'

建立 SSL 強制帳號 (在 Server 容器內)


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;"'

啟動 Client 容器驗證雙向 SSL


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 connectbind-address / 防火牆 / 帳號 host 限制bind-address=*、安全組放行 3306、帳號 @'%'

生產環境建議

  • 使用 **有效 CA 簽發憑證** (Let's Encrypt / 企業 CA),避免自簽憑證信任鏈問題
  • 啟用 **TLS 1.2+** (`tls_version=TLSv1.2,TLSv1.3`),禁用舊協議
  • 配置 **Cipher Suite** 白名單 (`ssl_cipher=ECDHE-RSA-AES256-GCM-SHA384:...`)
  • 定期輪換憑證 (自動化 Cert Manager / Vault PKI)
  • 結合 **防火牆/安全組/VPC** 限制 3306 存取來源

MySQL SSL 連線透過標準 TLS 保障傳輸層機密性與完整性,OpenSSL 手動流程雖繁瑣但可完整掌控鏈路;5.7+ 內建工具與 Docker 卷掛載大幅簡化部署,**REQUIRE SSL** 帳號策略是強制加密的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved