mysql> SHOW VARIABLES LIKE '%ssl%';
+---------------+----------+
| Variable_name | Value |
+---------------+----------+
| have_ssl | DISABLED |
| have_openssl | DISABLED |
+---------------+----------+
編輯 my.cnf [mysqld] 區塊:
[mysqld]
ssl-ca=/opt/mysql/ssl/ca-cert.pem
ssl-cert=/opt/mysql/ssl/server-cert.pem
ssl-key=/opt/mysql/ssl/server-key.pem
重啟 MySQL,再次檢查應顯示 YES。
mkdir -p /etc/mysql/newcerts && cd /etc/mysql/newcerts
# 1. CA 私鑰
openssl genrsa 2048 > ca-key.pem
# 2. CA 自簽憑證(有效期 1000 天)
openssl req -new -x509 -nodes -days 1000 -key ca-key.pem > ca-cert.pem
# 依序輸入:Country, State, City, Org, OU, Common Name (建議用 MySQL 主機名), Email
# 3. 伺服器私鑰 + CSR
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout server-key.pem > server-req.pem
# Common Name 必須與 MySQL 主機名一致
# 4. CA 簽發伺服器憑證
openssl x509 -req -in server-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
# 5. 客戶端私鑰 + CSR
openssl req -newkey rsa:2048 -days 1000 -nodes -keyout client-key.pem > client-req.pem
# 6. CA 簽發客戶端憑證
openssl x509 -req -in client-req.pem -days 1000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
| 檔案 | 放置位置 | 用途 |
|---|---|---|
| ca-cert.pem | 伺服器 + 所有客戶端 | 驗證對方憑證信任鏈 |
| server-cert.pem | 伺服器 | 伺服器身分證明 |
| server-key.pem | 伺服器(權限 600) | 伺服器私鑰 |
| client-cert.pem | 客戶端 | 客戶端身分證明 |
| client-key.pem | 客戶端(權限 600) | 客戶端私鑰 |
# 伺服器端測試
mysql -uroot -p --ssl-ca=/opt/mysql/ssl/ca-cert.pem \
--ssl-cert=/opt/mysql/ssl/server-cert.pem \
--ssl-key=/opt/mysql/ssl/server-key.pem
# 客戶端測試
mysql -uapp -p -h db-host --ssl-ca=/opt/mysql/ssl/ca-cert.pem \
--ssl-cert=/opt/mysql/ssl/client-cert.pem \
--ssl-key=/opt/mysql/ssl/client-key.pem
連線成功後,執行 SHOW STATUS LIKE 'Ssl_cipher'; 若回傳加密套件名稱(如 TLS_AES_256_GCM_SHA384)即確認 SSL 生效。
chmod 600,否則 OpenSSL 拒絕使用。CREATE USER ... REQUIRE SSL 強制加密連線。將上述步驟封裝為 Shell/Ansible Playbook,參數化:有效天數、主機名、輸出目錄、密碼(或無密碼金鑰),納入基礎設施即代碼管理。