druid数据库加密,mysql8.0,druid1.1.21

使用框架版本:

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:\develop\repository\com\alibaba\druid\1.1.21
1.2开始cmd:
java -cp druid-1.1.21.jar com.alibaba.druid.filter.config.ConfigTools Root123!@# >> password.txt
命令解释: >> 输出结果到当前文件夹目录的 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走一波:
filterList
可以看到我们yml中配置的三个filter都已经加载,直接进入configFilter init()
configFilter
进入是否需要解密方法
decrypt
源码中定义常量 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启动项目
update
发现更新之后的配置,已经正常获取了.项目正常启动
同时验证了最上面的猜想.所以网上找的针对(Public Key Retrieval is not allowed)解决方案:
1.连接数据库的url中,加上allowPublicKeyRetrieval=true参数,经过验证解决该问题。
对该场景无效!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值