文章目录
一、环境及场景
场景: ConfigServer是允许匿名访问的。在正式发布环境情况下,通过直接调用配置中心接口,就可以直接看到你的数据库信息,这样是不安全的:例:http://xxx.xxx.xx.xx:xxxx/microservice-user.yml,为了防止内容外泄,需要做一些操作保护信息。
环境:
Springboot:2.3.10.RELEASE
spring-cloud:Hoxton.SR11
二、用户认证
SpringCloud是在调用接口的时候,对用户进行一个登陆验证,本文是一个基于HTTP Basic的用户验证。
1.添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
2.在application.yml中添加配置
spring:
security:
user:
password: user123 #配置登陆的密码是user123
name: user #配置登陆的账户是user
这样的就很简单的为ConfigServer添加了一个基于HTTP Basic的认证,如果不设置密码的话,密码是一串随机值,会在你的ConfigServer启动的时候打印出来
3.展示效果:
4.客户端使用需要用户认证的ConfigServer
4.1 使用Curl风格的URL。示例:
spring:
cloud:
config:
uri: http://user:user123@localhost:7001/
4.2 指定ConfigServer的账户密码。示例:
spring:
cloud:
config:
label: ${spring.profiles.active} #指定Git仓库的分支,对应config server 所获取的配置文件的{label}
discovery:
enabled: true #表示使用服务发现组件中的configserver ,而不是自己指定config server的uri,默认为false
service-id: microservice-config-server #服务发现中configserver的serverId
fail-fast: true #失败快速响应
username: user
password: user123
指定账户密码的优先级要高于URI
三、配置内容加解密
安装JCE
默认情况下我们的JRE中自带了JCE(Java Cryptography Extension),但是默认是一个有限长度的版本,我们这里需要一个不限长度的JCE,
Java 6 JCE地址:https://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
Java 7 JCE地址:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
Java 8 JCE的地址:http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下载完成之后解压,把得到到两个Jar包复制到$JAVA_HOME\jre\lib\security目录下。
1.对称加密
1.1 设置一个加密用到的Key
在我们的configserver项目中的bootstrap.yml配置文件中加入如下配置项:
encrypt:
key: Thisismysecretkey
1.2 对内容加密,解密
注意:如果你已经添加了HTTP Basic用户认证,那么你直接使用postman请求会报错:
解决办法:
这里是post请求,不是get,有些博客说的是get
加密:
使用encrypt端点请求即可:
Spring Security的CSRF验证
使用postman进行加密解密的时候,如果还是请求失败,阅读下面这两个文章,你会找到原因和解决办法
1.使用Spring Security的Basic Auth认证后Postman的POST请求不成功原因
2.Spring Security - 什么时候禁用CSRF
解密:
同理使用decrypt端点请求
1.3 存储加密的内容
拉取的你配置仓库的数据,将你需要加密的数据替换:
需要使用{cipher}的密文形式,单引号不要忘记了。然后push到远程。
例如:
root: '{cipher}e031665915e85d9653baab673e6781cdb348c42771a55c2977334edf1017bc5e'
1.4 测试
再次请求配置内容。返回:
root: abc
说明ConfigServer能自动解密配置内容。有时候,我们需要ConfigServer返回密文本身,而不是解密后的内容。
1.5 设置返回密文
在bootstrap.yml文件添加配置:
spring:
cloud:
config:
server:
encrypt:
enabled: false #配置后请求内容为加密后的,不会再自动解密
1.6 客户端自行解密
客户端解密也比较简单
1.6.1 添加依赖
<!--客户端解密-->
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-rsa</artifactId>
<version>1.0.10.RELEASE</version>
</dependency>
1.6.2 设置配置
添加配置:客户端的解密key也必须放到bootstrap.yml中。
encrypt:
key: Thisismysecretkey
2.非对称加密
执行以下命令,并按照提示操作,即可创建一个Key Store。
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文件复制到项目的classpath下。
在bootstrap.yml中添加以下内容。
encrypt:
keyStore:
location: classpath:/server.jks # jks文件的路径
password: letmein # storepass
alias: mytestkey # alias
secret: changeme # keypass
这样,我们使用命令
curl http://localhost:8080/encrypt -d mysecret
尝试加密时 ,就会得到类似以下的结果。
AQB38UyNckYzW64rvsaIhy0OV4MUmS7krdHrw+VLUdqXJ4ZVdZL8/ouwSOAYM+6MSjKvzmkaU8Iv2cQ5MWhlZhCrm0f0d2ubc1MH96KBHTix9AroajeTiofPwPoBnWfBo9cC4PU1vD+rcvAvwvdR5q7rYbFc4yut4uJZRzpAXGgf680kAtb6tEtLx7c4/35PEaGXFWd2m8gn21vzWdvhbP6cdC9YlburL0Rq/0H1G+uEX99ZVIWJ0hVn4rplLWPMLUGA2ZVEyVRorIRX/2z5MU7cVPtJ6X1JZDpU4GVz8/3rD5BnbVFTGo6DfBrEzJn58Bzjl6aqo9ca/3j42RHOoQDOHXGqRX/843RbPdvMqTZd0rTOBHTUrVG9E15sCajiLkw=
相对于对称加密,非对称加密的安全性更高,但对称加密相对方便