当使用非加密方式连接MySQL数据库时,在网络中传输的所有信息都是明文的,可以被网络中所有人截取,敏感信息可能被泄露。在传送敏感信息(如密码)时,可以采用SSL连接的方式。
配置MySQL服务端支持SSL连接,MySQL 5.7.6以前版本的配置方法。
使用命令手工创建SSL文件
创建CA文件: # openssl genrsa 2048 > ca-key.pem # openssl req -new -x509 -nodes -days 3600 \ > -key ca-key.pem -out ca.pem 创建服务端公钥和私钥: # 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 # chown mysql.mysql *.pem
修改MySQL服务端配置文件/etc/my.cnf,增加以下参数
[mysqld] ssl-ca=ca.pem ssl-cert=server-cert.pem ssl-key=server-key.pem
MySQL5.7.6及以后版本的配置方法
使用MySQL提供的脚本创建SSL文件,会创建到数据库所在目录中
# pwd /usr/local/mysql # ./bin/mysql_ssl_rsa_setup
修改MySQL服务端配置文件/etc/my.cnf,增加以下参数:
[mysqld] ssl-ca=ca.pem ssl-cert=server-cert.pem ssl-key=server-key.pem
配置客户端以SSL方式连接MySQL:
在服务器端配置了SSL参数后,客户端发起连接时默认使用SSL方式。
命令行方式使用SSL连接:
# mysql -h192.168.0.2 -P 3306 -uroot -p
以非加密方式连接MySQL:
# mysql -h192.168.0.2 -P 3306 -uroot -p --ssl-mode=DISABLED
设置用户必须以SSL方式连接MySQL数据库:
mysql> create user lmlphp@'%' identified by '123456' require ssl; mysql> grant select on *.* to lmlphp@'%'; 此时以非加密方式连接会报错: # mysql -h192.168.0.2 -P 3306 -ulmlphp -p --ssl-mode=DISABLED Enter password: ERROR 1045 (28000): Access denied for user 'lmlphp'@'192.168.0.2' (using password: YES)
启用X509身份认证
使用上述步骤创建的符合X509格式的CA文件、公钥、私钥可以对连接进行身份认证,进一步提高连接的安全性。需先将CA文件、公钥、私钥分发给客户端。
设置用户必须以X509方式验证身份后连接数据库:
mysql> create user lmlphp@'%' identified by '123456' require x509; mysql> grant select on *.* to lmlphp@'%';
在客户端使用分发的CA文件、公钥、私钥连接数据库:
# mysql -h192.168.0.2 -P 3306 -ulmlphp -p --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem Enter password: 此时若不指定CA文件、公钥、私钥,仅使用SSL连接数据库会报错: # mysql -h192.168.0.2 -P 3306 -ulmlphp -p Enter password: ERROR 1045 (28000): Access denied for user 'lmlphp'@'192.168.0.2' (using password: YES)