cmake使用了默认的选项 -DWITH_SSL=bundled,中间参考了博友的文章,表示感谢!
参考: root用户添加grand过程
一、创建证书的过程
1、生成一个 CA 私钥
openssl genrsa 2048 > ca-key.pem
2、通过 CA 私钥生成数字证书
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
3、 创建服务器端的 RSA 私钥和数字证书
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout server-key.pem > server-req.pem
4、 将生成的私钥转换为 RSA 私钥文件格式
openssl rsa -in server-key.pem -out server-key.pem
5、用CA 证书来生成一个服务器端的数字证书
openssl x509 -sha1 -req -in server-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
6、创建客户端的 RSA 私钥和数字证书
openssl req -sha1 -newkey rsa:2048 -days 3650 -nodes -keyout client-key.pem > client-req.pem
7、将生成的私钥转换为 RSA 私钥文件格式
openssl rsa -in client-key.pem -out client-key.pem
8、用CA 证书来生成一个客户端的数字证书
openssl x509 -sha1 -req -in client-req.pem -days 3650 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
9、查看所有生成的SSL文件
-rw-r–r-- 1 root root 1675 Jun 24 14:16 ca-key.pem
-rw-r–r-- 1 root root 1220 Jun 24 14:19 ca.pem
-rw-r–r-- 1 root root 1090 Jun 24 14:29 client-cert.pem
-rw-r–r-- 1 root root 1679 Jun 24 14:28 client-key.pem
-rw-r–r-- 1 root root 952 Jun 24 14:28 client-req.pem
-rw-r–r-- 1 root root 1090 Jun 24 14:24 server-cert.pem
-rw-r–r-- 1 root root 1679 Jun 24 14:23 server-key.pem
-rw-r–r-- 1 root root 952 Jun 24 14:20 server-req.pem
10、将server需要的证书放到/root/ca目录下(ca-cert.pem、server-cert.pem、/server-key.pem)
11、注意事项:
MySQL在生成上面证书的时候需要输入大量用户信息,在CA上创建证书要注意所有的用户信息要和CA中的一致,从国家到部门都要相同,否则会造成证书无法使用,直接全部默认回车即可。
要是用户信息一样则MariaDB会报错:
MariaDB在生成上面证书的时候也是需要输入大量用户信息,和MySQL不同的是输入的用户信息服务端和客户端不能一致。即服务端输入和客户端输入不一样。
具体原因见这里https://mariadb.com/kb/en/library/mariadb-ssl-connection-issues/,
最后可以通过验证ca证书内容:openssl verify -CAfile /root/ca/ca-cert.pem /root/ca/server-cert.pem /root/ca/client-cert.pem
二、mysqld启动配置
[mysqld]
# ssl connection configuration
ssl
ssl-ca=/root/ca/ca-cert.pem
ssl-cert=/root/ca/server-cert.pem
ssl-key=/root/ca/server-key.pem
三、重启mysql服务
/etc/init.d/mysqld restart
确认have_openssl和have_ssl 为yes。
mysql的root登陆,输入如下内容,验证显示内容。
mysql> show variables like ‘%ssl%’;
±--------------±----------------+
| Variable_name | Value |
±--------------±----------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | ca.pem |
| ssl_capath | |
| ssl_cert | server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | server-key.pem |
±--------------±----------------+
9 rows in set (0.01 sec)
四、创建测试用户
1、给root用户增加grant权限:
+关闭mysql原来的服务,通过如下命令开启mysql服务
/usr/bin/mysqld_safe --skip-grant-tables
+ 登陆mysql
mysql -u root
+授权
grant all privileges on . to ‘root’@‘localhost’ identified by ‘root’ with grant option;
出现错误,没有写权限,按照如下方法处理
mysql> set global read_only=0;//(关掉新主库的只读属性)
mysql>flush privileges;
grant all privileges on . to ‘root’@‘localhost’ identified by ‘root’ with grant option;#再次重新授权
mysql>set global read_only=1;//(读写属性)
mysql>flush privileges;
mysql>exit;
2、创建测试用户
创建ssl_test用户,需要ssl链接
GRANT ALL PRIVILEGES ON . TO ‘ssl_test’@’%’ IDENTIFIED BY ‘ssl_test’ REQUIRE SSL;
FLUSH PRIVILEGES;
五、测试链接过程:
测试过程中因为client的证书放在了/root/ca目录下(ca-cert.client-cert.pem、/client-key.pem),所以如下命令行中,路径为/root/ca/开头
mysql --ssl-ca=/root/ca/ca-cert.pem --ssl-cert=/root/ca/client-cert.pem --ssl-key=/root/ca/client-key.pem -h 10.10.5.159 -u ssl_test -p
六、Qt链接mysql ssl方法
通过 QSqlDatabase::setConnectOptions方法设置ssl的参数,如下代码所示:
db.setConnectOptions(“SSL_KEY=client-key.pem;SSL_CERT=client-cert.pem;SSL_CA=ca-cert.pem;CLIENT_IGNORE_SPACE=1”); // use an SSL connection to the server