如何生成生成证书?
使用 openssl req 创建 X.509 证书,下面的命令创建有效期10年的私钥, 生成2个文件:
私钥 wfs-key.pem 和请求证书 wfs-req.pem
openssl req -newkey rsa:2048 -days 3650 -nodes -keyout wfs-key.pem -out wfs-req.pem
Country Name (2 letter code) [XX]:CN
Locality Name (eg, city) [Default City]:KS
Organization Name (eg, company) [Default Company Ltd]:ECI
#其他输出略
生成公钥 ca.pem/ca-key.pem (数据库服务器的自签名的 CA 证书 和 CA 私钥)
#必须在数据库服务器上执行
openssl x509 -req -in wfs-req.pem -days 3650 -CA /var/lib/mysql/ca.pem -CAkey /var/lib/mysql/ca-key.pem -set_serial 01 -out wfs-cert.pem
校验公钥的有效性 (注: server-cert.pem 是服务器证书)
openssl verify -CAfile /var/lib/mysql/ca.pem /var/lib/mysql/server-cert.pem wfs-cert.pem
创建只有证书没有密码的账号
需要先卸载
component_validate_password 组件后才能创建无密码的账号
use mysql
select * from component;
uninstall component 'file://component_validate_password';
CREATE USER wfs REQUIRE SUBJECT '/C=CN/L=KS/O=ECI';
使用证书登录
这3个文件可用于其他机器 MySQL 客户端或 navicat 使用证书登录
#使用mysql客户端登录
mysql -h 192.168.55.44 -uwfs --ssl-cert wfs-cert.pem --ssl-key wfs-key.pem -p --ssl_ca=/var/lib/mysql/ca.pem
#使用证书登录 mysqlsh
mysqlsh mysql://wfs@192.168.55.44 --ssl-cert wfs-cert.pem --ssl-key wfs-key.pem
使用navicat 登录的话在登录窗口 ssl 页面处分别填入 key, cert, ca
补充:测试下三种认证方式 X509, SSL, none的区别
create user test_x509 identified by '123456' require X509;
create user test_any identified by '123456' require ssl;
create user test_none identified by '123456' require none;
select user,ssl_type from mysql.user;
三个账号 ssl_type 分别为 X509, ANY, 空(默认是require none, 也就是说不写 require字句的话默认是空)
登录
client-cert.pem 和 client-key.pem 在数据库目录
mysql -h 192.168.55.44 -utest_x509 -p123456 --ssl-cert client-cert.pem --ssl-key client-key.pem
mysql -h 192.168.55.44 -utest_any -p123456
mysql -h 192.168.55.44 -utest_none -p123456 --ssl-mode=DISABLED
总结
三个账号均可以使用参数 --ssl-cert --ssl-key 登录, 登录后输入 \s 可以看到使用了 ssl,
test_x509 必须使用参数 --ssl-cert --ssl-key 登录, 否则不能登录
test_any, test_none 可以使用密码登录, 登录后输入 \s 可以看到使用了 ssl,
test_none 可以使用 --ssl-mode=DISABLED, 登录后输入 \s 显示 ssl 未使用,
test_any 不可以使用参数 --ssl-mode=DISABLED
test_none在服务器上通过 IP/127.0.0.1/主机名 登录时, 登录后输入 \s 可以看到使用了 ssl 且通过tcp协议, 通过 localhost 或不指定-h 登录时, 登录后输入 \s 可以看到是通过了socket连接,未使用ssl