【随手记录】关于mysql的SSL证书登录

下午连现场mysql库时候报错:

javax.net.ssl.SSLException: closing inbound before receiving peer's close_notify     at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:129)     at java.base/sun.security.ssl.Alert.createSSLException(Alert.java:117) 

这错误出现原因是现场因为三级等保要求开启了mysql的ssl验证(MySQL5.7+默认是开启SSL连接),需要我们主动配置ssl证书信息或者明确指出不适用ssl

1、明确不使用ssl 加参数 useSSL=false

启动ssl增加性能损耗,如果不是为了等保等要求,确保安全情况下,可以不开启ssl:

jdbc:mysql://172.28.77.197:3306/admin?characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false 

2、启用ssl

ssl.cert.path = /home/app/cert ssl.config = true&verifyServerCertificate=true&requireSSL=true&clientCertificateKeyStoreUrl=file:${ssl.cert.path}/keystoremysql&clientCertificateKeyStorePassword=password456&trustCertificateKeyStoreUrl=file:${ssl.cert.path}/truststoremysql&trustCertificateKeyStorePassword=password123  spring.datasource.url = jdbc:mysql://1.2.3.4:3306/db?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=${ssl.config} 

因为加上ssl认证后url太长了,所以提取了两个变量

ssl.cert.path表示生成的两个证书文件存放路径

ssl.config的value里根据证书生成的参数对应修改,如果不需要ssl认证值设置为false即可

3、查看mysql是否启用ssl

可以在mysql输入一下命令

 

show variables like '%ssl%'; 

 

have_openssl和have_ssl为yes表示mysql开启了ssl(这种没有强制)

4、强制用户启动ssl

select ssl_type from user where user = 'xx' ; 

 如果结果为 ANY 则表示强制用户使用ssl

GRANT USAGE ON *.* TO 'xx'@'%' REQUIRE SSL;   

5、开启ssl配置

[mysqld] ssl-ca=/etc/mysql/ca-cert.pem ssl-cert=/etc/mysql/server-cert.pem ssl-key=/etc/mysql/server-key.pem 

修改完配置文件,重启mysql服务