--with-vio --with-openssl)mysql_fix_privilege_tables升級)SHOW VARIABLES LIKE 'have_openssl'; 返回YES| 文件 | 用途 | 獲取方式 |
|---|---|---|
CA證書 (ca-cert.pem) |
信任錨點,驗證雙端證書 | 商業CA購買 或 自簽生成 |
服務器證書 (server-cert.pem) |
服務端身份證明 | CA簽發 或 自簽 |
服務器私鑰 (server-key.pem) |
解密客戶端加密數據 | 配對生成,嚴格保護權限chmod 600 |
客戶端證書 (client-cert.pem) |
客戶端身份證明(雙向認證時) | 同CA簽發 |
客戶端私鑰 (client-key.pem) |
客戶端解密服務端數據 | 配對生成 |
my.cnf [mysqld]段)[mysqld]
ssl-ca=/usr/local/mysql/data/ca-cert.pem
ssl-cert=/usr/local/mysql/data/server-cert.pem
ssl-key=/usr/local/mysql/data/server-key.pem
重啟服務生效。驗證:SHOW VARIABLES LIKE 'have_ssl'; 應為YES。
~/.my.cnf(推薦持久化)[mysql]
ssl-ca=/home/user/ca-cert.pem
ssl-cert=/home/user/client-cert.pem
ssl-key=/home/user/client-key.pem
mysql --ssl-ca=ca-cert.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
# JDBC
jdbc:mysql://host:3306/db?useSSL=true&verifyServerCertificate=true&
trustCertificateKeyStoreUrl=file:/path/keystore&
trustCertificateKeyStorePassword=secret
# Python mysql-connector
cnx = mysql.connector.connect(ssl_ca='ca.pem', ssl_cert='cert.pem', ssl_key='key.pem')
mysql> \s
# 或
mysql> SHOW STATUS LIKE 'Ssl_cipher';
+---------------+---------------------+
| Variable_name | Value |
+---------------+---------------------+
| Ssl_cipher | TLS_AES_256_GCM_SHA384 |
+---------------+---------------------+
顯示加密套件即確認SSL握手成功。未加密連接顯示空值。
GRANT ALL ON db.* TO 'secure_user'@'%' IDENTIFIED BY 'pwd' REQUIRE SSL;
# 或僅要求加密不驗證證書
GRANT ALL ON db.* TO 'ssl_user'@'%' IDENTIFIED BY 'pwd' REQUIRE X509;
#!/bin/bash
openssl genrsa -out ca-key.pem 2048
openssl req -new -x509 -nodes -days 3650 -key ca-key.pem -out ca-cert.pem -subj "/CN=MySQL-CA"
openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem -subj "/CN=mysql-server"
openssl x509 -req -in server-req.pem -days 365 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
# 客戶端證書同理生成
chmod 600 *-key.pem