基於 Debian 的系統的設定

(這假定 MySQL 已經安裝並且正在使用 sudo。)

生成 CA 和 SSL 金鑰

確保安裝了 OpenSSL 和庫:

apt-get -y install openssl
apt-get -y install libssl-dev

接下來製作並輸入 SSL 檔案的目錄:

mkdir /home/ubuntu/mysqlcerts
cd /home/ubuntu/mysqlcerts

要生成金鑰,請建立證書頒發機構(CA)以對金鑰進行簽名(自簽名):

openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem

在每個提示符處輸入的值不會影響配置。接下來為伺服器建立一個金鑰,並使用之前的 CA 進行簽名:

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout server-key.pem -out server-req.pem
openssl rsa -in server-key.pem -out server-key.pem

openssl x509 -req -in server-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem

然後為客戶端建立一個金鑰:

openssl req -newkey rsa:2048 -days 3600 -nodes -keyout client-key.pem -out client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -req -in client-req.pem -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem

要確保所有內容都已正確設定,請驗證金鑰:

openssl verify -CAfile ca.pem server-cert.pem client-cert.pem

將金鑰新增到 MySQL

開啟 MySQL 配置檔案 。例如:

vim /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] 部分下,新增以下選項:

ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/server-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/server-key.pem

重啟 MySQL。例如:

service mysql restart

測試 SSL 連線

以相同的方式連線,使用生成的客戶端金鑰傳遞額外選項 ssl-cassl-certssl-key。例如,假設 cd /home/ubuntu/mysqlcerts

mysql --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -h 127.0.0.1 -u superman -p

登入後,驗證連線確實是安全的:

superman@127.0.0.1 [None]> SHOW VARIABLES LIKE '%ssl%';
+---------------+-----------------------------------------+
| Variable_name | Value                                   |
+---------------+-----------------------------------------+
| have_openssl  | YES                                     |
| have_ssl      | YES                                     |
| ssl_ca        | /home/ubuntu/mysqlcerts/ca.pem          |
| ssl_capath    |                                         |
| ssl_cert      | /home/ubuntu/mysqlcerts/server-cert.pem |
| ssl_cipher    |                                         |
| ssl_crl       |                                         |
| ssl_crlpath   |                                         |
| ssl_key       | /home/ubuntu/mysqlcerts/server-key.pem  |
+---------------+-----------------------------------------+

你也可以檢查一下:

superman@127.0.0.1 [None]> STATUS;
...
SSL:                    Cipher in use is DHE-RSA-AES256-SHA
...

執行 SSL

這是通過 GRANT,使用 REQUIRE SSL

GRANT ALL PRIVILEGES ON *.* TO 'superman'@'127.0.0.1' IDENTIFIED BY 'pass' REQUIRE SSL;
FLUSH PRIVILEGES;

現在,superman 必須通過 SSL 連線。

如果你不想管理客戶端金鑰,請使用之前的客戶端金鑰,並自動將其用於所有客戶端。開啟 MySQL 配置檔案 ,例如:

vim /etc/mysql/mysql.conf.d/mysqld.cnf

[client] 部分下,新增以下選項:

ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/client-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/client-key.pem

現在 superman 只需鍵入以下內容即可通過 SSL 登入:

mysql -h 127.0.0.1 -u superman -p

從另一個程式(例如在 Python 中)連線通常只需要連線函式的附加引數。一個 Python 示例:

import MySQLdb
ssl = {'cert': '/home/ubuntu/mysqlcerts/client-cert.pem', 'key': '/home/ubuntu/mysqlcerts/client-key.pem'}
conn = MySQLdb.connect(host='127.0.0.1', user='superman', passwd='imsoawesome', ssl=ssl)

參考文獻和進一步閱讀: