基于 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-ca
,ssl-cert
和 ssl-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)