很多场景下很多场景下,对于某些敏感的配置内容,例如数据库账号密码等应当加密存储。Config Server为配置内容的加密与解密提供了支持。
Config Server的加密解密功能依赖JCE(Java Cryptography Extension)。
jdk8默认提供了,如果未在目录(/Library/Java/JavaVirtcy Machines/jdk1.8.0_151.jdk/Contents/Home/jre/lib/security
)下找到policy
文件夹,可以去官网下载JCE。然后放进去。
在 Config Server 项目中 添加一个bootstrap.yml
,一定要新增加配置文件,在原来的配置文件中添加配置无效。增加以下配置。
encrypt:
key: config
然后启动项目,在终端输入curl http://localhost:8011/encrypt -d user
。可以得到user
的加密串。
weiweideMacBook-Pro:~ pengweiwei$ curl http://localhost:8011/encrypt -d user
b600ed1981ad0a977c219c946274f03c6ffe13626c0f1c1df5a6bc70efdcb883
输入 curl http://localhost:8011/decrypt -d b600ed1981ad0a977c219c946274f03c6ffe13626c0f1c1df5a6bc70efdcb883
weiweideMacBook-Pro:~ pengweiwei$ curl http://localhost:8011/decrypt -d b600ed1981ad0a977c219c946274f03c6ffe13626c0f1c1df5a6bc70efdcb883
user
说明能正常加密解密。
在git上新建一个文件config-dev.yml
或者修改原来的properties
文件。加入数据库配置。
spring:
datasource:
name: user
password: '{cipher}b600ed1981ad0a977c219c946274f03c6ffe13626c0f1c1df5a6bc70efdcb883'
如果不加{cipher}
的话,将不会解析出明文。访问http://localhost:8011/config-dev.yml
。可以看到。
下面这种方式访问也可以。
如果想 Config Server 不解密,直接返回密文本身,由Config Client 自行解密的话。可在Config Server中加入以下配置。
spring:
cloud:
config:
server:
encrypt:
enabled: false
非对称加密相对于对称加密要严格安全一些,但对称加密相对简单。
命令行执行以下命令。
keytool -genkeypair -alias mytestkey -keyalg RSA -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" -keypass changeme -keystore server.jks -storepass letmein
然后将生成的 server.jks
复制到Config Server的resources
目录下。然后在bootstrap.yml
文件中新增配置。
encrypt:
key-store:
location: classpath:/server.jks
password: letmein # 这些参数和 生成server.jks文件的命令里的参数要对应
alias: mytestkey # 这些参数和 生成server.jks文件的命令里的参数要对应
secret: changeme # 这些参数和 生成server.jks文件的命令里的参数要对应
然后pom文件中添加资源路径的配置。
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
<excludes>
<exclude>**/*.jksexclude>
excludes>
resource>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>falsefiltering>
<includes>
<include>**/*.jksinclude>
includes>
resource>
resources>
然后访问curl http://localhost:8011/encrypt -d user
。如果遇到下面的错误。
{"timestamp":"2020-01-05T11:05:26.560+0000","status":500,
"error":"Internal Server Error",
"message":"Unable to initialize due to invalid secret key","path":"/encrypt"}
这就是说明JAVA_HOME/jre/lib/security
下缺少JCE的包。将下载的JCE的两个jar包复制进去就好了。
然后再访问curl http://localhost:8011/encrypt -d user
。就能看到结果了。
weiweideMacBook-Pro:Downloads pengweiwei$ curl http://localhost:8011/encrypt -d user
AQAUpWp6o1qL6HEViPjGe1t87nMDyEoUgMHJccV+czETNYRJWghMlKhr8Kwm39NJBcP9Xtzcu505q1wPKobv05o6+/Qi422ws+y5xg
NzLLniLWlXNO8//mFBfOTPAcOeZEOFe42rSB33CNqX2pSJFETOBJeMeBZWzE/2vqwoxWpGrSj1QpNsgHFqrz0l2cFs/hjbxYNg4c3H
SsZ5RJ6pPHCXB7ZmdlwMa4tvZZikudBw1/SfXXsWEcMelMSvuM+wjdHnRmc9pBDKVwjSpzRUg628fZiYprtXViDVNlXoSpu4I28g4j
RuDNvbS6/3ZzWQO7f5gUjfpi3PLL6bbGNTNDzTqkzmSD+sNZHldmJrdl2eOC3d/2cuSXK2qC6PsY2eaTk=