JDBC以SSL方式连接MYSQL

网络上推荐的做法是配置useSSL=false
但是如果服务器配置了强行SSL连接呢,就会报这个错
Connections using insecure transport are prohibited while --require_secure_transport=ON.
所以只能配置

useSSL=true

但是紧接着又会报这个错
java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Path does not chain with any of the trust anchors
这个时候网上推荐的做法是配置

verifyServerCertificate=false

这个配置的意义是无脑信任一切SSL证书,这肯定是不安全的
那么就需要信任证书了,这个时候需要做的就是信任证书啦
这时候网络上推荐的做法是往JDK导入证书

keytool -import -trustcacerts -v -alias Mysql -file "C:\ProgramData\MySQL\MySQL Server 8.0\Data\ca.pem" -keystore "C:\Program Files\Java\jdk1.8.0_192\jre\lib\security\cacerts"

这样做没问题,但不是完美的解决方案。
这样做,自己一个人开发,一点问题都没有。但是放到生产就问题大了。
现在的生产系统一般都是分布式,N台机器部署,每台机器都需要执行一次导入证书命令,N台机器就要执行N次命令。
如果数据库换个证书,那么所有的机器都要执行一次导入证书命令
mysql 的jdbc驱动提供了一个办法
将证书导入证书库

keytool -import -trustcacerts -v -alias Mysql -file "C:\ProgramData\MySQL\MySQL Server 8.0\Data\ca.pem" -keystore "mysql.ks"

然后将证书放http服务器上,或ftp服务器上
连接字符串里配置

trustCertificateKeyStoreUrl=http://localhost:8080/static/mysql.ks

trustCertificateKeyStorePassword=123456

最终的连接字符串为

jdbc:mysql://localhost:3306/shopxxb2b2c?useUnicode=true&useSSL=true&trustCertificateKeyStorePassword=123456&trustCertificateKeyStoreUrl=http://localhost:8080/static/mysql.ks&serverTimezone=Asia/Shanghai

你可能感兴趣的:(MySQL)