SpringCloud之Spring Config配置中心用户认证及配置内容加解密

一、环境及场景

场景: 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=

相对于对称加密,非对称加密的安全性更高,但对称加密相对方便

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值