概述
使用框架版本:
1.springboot:2.1.10.RELEASE
2.druid:1.1.21
3.druid-spring-boot-starter:1.1.21(pom中就单独引入它就够了,不需要重复引入druid)
3.mysql:8.0
4.mysql驱动:8.0.17
事发原因:闲来无事,想看下druid的数据库密钥加密是怎么玩的!
我开始也不会配置啊,怎么办呢??那就巴拉巴拉的网上找配置教程,好了,下面贴出网上的教程篇:
1.
1.1.找到druid jar包位置 E:developrepositorycomalibabadruid1.1.21
1.2开始cmd:
java -cp druid-1.1.21.jar com.alibaba.druid.filter.config.ConfigTools Root123!@# >> password.txt
命令解释: >> 输出结果到当前文件夹目录的 password.txt 文件(密文,公私钥都在该文件中)
2.修改yml文件
spring:
aop:
auto: true
proxy-target-class: true
profiles:
active: dev
application:
name: dphc-core-server
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/dphc_dev?serverTimezone=GMT%2b8&characterEncoding=utf-8&useSSL=false&useUnicode=true&allowMultiQueries=true
username: root
password: Ex2AZOUwUs6BZ5/StyNtf0digoXWcXktWWcXpG1AKz+C5BAC95+COItJMmhXcOP8Bf3iSEO0aYjoKgO7tB7etA==
druid:
#特别提示:配置数据库加密 config这个不能忘掉
filters: stat,wall,config
use-global-data-source-stat: true
# 开启解密config.decrypt=true; 公钥:config.decrypt.key
connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMaghrjC2OF4ccFrHDGyEJ/nw8DxbC4NIhXgUZHclZv/khKPdg5TbnkqaLI+9EMmsfEePqaKCvotkPOj/9dUSW0CAwEAAQ==
好啦,按照教程配置完毕,可以开始启动项目了,啦啦啦~~~~
惊喜来了,Public Key Retrieval is not allowed 大概猜想一下:druid没有正常解密,直接用了密钥去连接数据库:
[ ERROR] [2019-11-24 09:28:50] com.alibaba.druid.pool.DruidDataSource [943] - init datasource error, url: jdbc:mysql://localhost:3306/dphc_dev?serverTimezone=GMT%2b8&characterEncoding=utf-8&useSSL=false&useUnicode=true&allowMultiQueries=true
java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:827)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:447)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:237)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:199)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:156)
at com.alibaba.druid.filter.FilterAdapter.connection_connect(FilterAdapter.java:787)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150)
at com.alibaba.druid.filter.FilterAdapter.connection_connect(FilterAdapter.java:787)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150)
at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:218)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1646)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1710)
at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:939)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1904)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1846)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1774)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:593)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515)
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
我们定位到druid报错代码:
com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:939)
思路:因为之前没有添加加密的时候正常,添加加密之后,就出现问题,而且添加在:filter 所以就从该块找问题。
源码中有一段过滤器的迭代:
for (Filter filter : filters) {
filter.init(this);
}
debug走一波:
可以看到我们yml中配置的三个filter都已经加载,直接进入configFilter init()
进入是否需要解密方法
源码中定义常量 public static final String CONFIG_DECRYPT = “config.decrypt”;
发现connectionProperties.getProperty(CONFIG_DECRYPT)=null
奇怪,yml中明确配置了config.decrypt=true 啊,为什么没生效
仔细查看参数集合:
发现该集合中只有一列数据.而且所有的配置都堆到一起了。所以拿不到config.decrypt值
知道问题了,那就开始解决问题:修改yml:
connect-properties:
druid.stat.mergeSql: true
druid.stat.slowSqlMillis: 1000
druid.stat.logSlowSql: true
config.decrypt: true
config.decrypt.key: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAMaghrjC2OF4ccFrHDGyEJ/nw8DxbC4NIhXgUZHclZv/khKPdg5TbnkqaLI+9EMmsfEePqaKCvotkPOj/9dUSW0CAwEAAQ==
将原本配置的单行写法换成键值对形式
再次debug启动项目
发现更新之后的配置,已经正常获取了.项目正常启动
同时验证了最上面的猜想.所以网上找的针对(Public Key Retrieval is not allowed)解决方案:
1.连接数据库的url中,加上allowPublicKeyRetrieval=true参数,经过验证解决该问题。
对该场景无效!!!
最后
以上就是整齐镜子为你收集整理的druid数据库加密,mysql8.0,druid1.1.21的全部内容,希望文章能够帮你解决druid数据库加密,mysql8.0,druid1.1.21所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复