微服务架构学习-进阶篇--09,分布式配置中心(下)

第六节,采用对称加密算法,实现敏感数据加密

在这里插入图片描述
例子:
(1)在config模块下,新建maven项目,命名为config-server-encrypt-symmetric,该项目作为配置中心的服务端(能对想加密的数据进行加密)。
(2)修改pom文件,加入如下配置:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-config-server</artifactId>
</dependency>

(3)添加一个配置文件:

spring.application.name=config-server
server.port=8124

eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/

spring.cloud.config.label=master
spring.cloud.config.server.git.uri=https://github.com/tanwenfang/GitRepository.git
spring.cloud.config.server.git.search-paths=config


#设置密钥的key
encrypt.key=twf

(4)添加一个启动类。

package com.twf.config.server.encrypt.symmetric;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigServerEncryptSymmetricApplication {

	public static void main(String[] args) {
		SpringApplication.run(ConfigServerEncryptSymmetricApplication.class, args);
	}
}

(5)启动,浏览器访问local host://8124/encrypt/status。
在这里插入图片描述
出现上面这个结果是因为未配置Jce,下面配置Jce。
(6)配置Jce。
浏览器访问:https://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下载如下file。
在这里插入图片描述
解压之后,文件如下:
在这里插入图片描述
将这两个jar文件拷贝到java安装目录下:
JDK:将两个jar文件放到%JDK_HOME%\jre\lib\security下
JRE:将两个jar文件放到%JRE_HOME%\lib\security下

然后浏览器再次访问localhost://8124/encrypt/status,得到如下结果:
在这里插入图片描述
(7)测试加解密。
在这里插入图片描述
在这里插入图片描述
(8)下面我们再新建一个项目,作为配置中心的客户端,命名为config-encrypt-symmetric-product-core,拷贝以前的项目e-book-product-core的文件及pom的依赖到该项目。该项目要通过配置中心对数据库的用户名和密码进行加密。
(9)pom文件再添加如下依赖:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-config</artifactId>
</dependency>

(10)修改配置文件名称为bootstrap.properties,并加入如下配置:

spring.application.name=e-book-config-product
server.port=8125

eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/

#默认false,这里设置true,表示开启读取配置中心的配置
spring.cloud.config.discovery.enabled=true
#对应eureka中的配置中心serviceId,默认是configserver
spring.cloud.config.discovery.serviceId=config-server

(11)通过上面提到的方法对“root”加密,得到密文,由于每次加密的结果都不同,所以用户名和密码相同时的密文可以不同,这没有关系。
(12)新建配置文件e-book-config-product.properties,加入如下代码,其中用户名和密码的密文就是上一步得到的:

mybatis.type-aliases-package=com.twf.e.book.product.api.domain
mybatis.mapper-locations=classpath:mybatis/com/twf/book/product/*.xml

spring.datasource.driverClassName=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/book-product?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
spring.datasource.username={cipher}7880c40edc2cbeafd23ca9ea3bc800053229541d92f6ecd678c34839242fc2a6
spring.datasource.password={cipher}7880c40edc2cbeafd23ca9ea3bc800053229541d92f6ecd678c34839242fc2a6

(13)然后将这个配置文件上传到GitHub的这个目录下:https://github.com/tanwenfang/GitRepository/tree/master/config
(14)启动该项目和加密服务端项目,浏览器访问http://localhost:8124/e-book-config-product/default(路径:服务端IP:端口/客户端应用名/类型),得到如下结果:
在这里插入图片描述
看最后一行,可以看到用户名和密码是明文root,这是因为服务端会通过关键字cipher来解密。
(15)然后看看能否通过解密后的数据库的用户名和密码访问数据库。浏览器访问http://localhost:8125/product/list,结果如下:
在这里插入图片描述

第七节,采用非对称加密,实现敏感数据加密

对称和非对称加密的区别?
1,对称加密算法在加密和解密时使用的是同一个密钥;
2,非对称加密算法需要两个密钥来进行加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。

非对称加密的例子
在这里插入图片描述
Keytool介绍
Keytool是一个Java数据证书的管理工具。
Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中。
Keytool文件,包含两种数据:
1,密钥实体(key entity)-密钥(secret key)
2,私钥和配对公钥(采用非对称加密)可信任的证书实体(trusted certificate entries)-只包含公钥

下面是例子:
(1)在config模块下新建maven项目,命名为config-server-encrypt-rsa,作为非对称加密的配置中心的服务端。
(2)修改pom文件。
(3)添加配置文件:

spring.application.name=config-server
server.port=8126

eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/

spring.cloud.config.label=master
spring.cloud.config.server.git.uri=https://github.com/tanwenfang/GitRepository.git
spring.cloud.config.server.git.search-paths=config

#keytool -genkeypair -alias "config-info" -keyalg "RSA" -keystore "encrypt-info.keystore"
#keystore文件的路径
encrypt.key-store.location=encrypt-info.keystore

#alias 指定密钥对的别名,该别名是公开的
encrypt.key-store.alias=config-info

#storepass密钥仓库
encrypt.key-store.password=twf123

#keypass用来保护所生成密钥对中的私钥
encrypt.key-store.secret=twf456

(4)添加一个启动类。
(5)生成keystore文件。
如何生成keystore文件?
在Java的安装目录下,有个如下的keytool.exe文件,我们就是用它来生成keystore文件的。
在这里插入图片描述
下面是步骤:
在这里插入图片描述
上面步骤执行完成之后,可以在jdk的bin目录看到如下文件:
在这里插入图片描述
(注意:要是最后一步报“keytool 错误: java.io.FileNotFoundException: encrypt-info.keystore (拒绝访问).”,就以管理员的身份打开控制台)。
(6)将生成的keystore文件拷贝到项目的resources目录下。
(7)启动项目,浏览器访问http://localhost:8126/encrypt/status,结果如下:
在这里插入图片描述
说明当前项目可以加密。
(8)然后在commons目录下,利用HttpClientUtil.java文件生成非对称加密的密文,注意将url改为http://127.0.0.1:8126/encrypt即可生成,如下。
在这里插入图片描述
(9)然后在GitHub的目录https://github.com/tanwenfang/GitRepository/tree/master/config新建文件,命名为e-book-config-rsa-product.properties,加入如下配置:
在这里插入图片描述
(10)新建非对称加密的配置中心的客户端。在config模块下新建maven项目config-encrypt-rsa-product-core,拷贝config-encrypt-symmetric-product-core的必要文件和代码到该项目。
(11)修改配置文件,客户端的配置文件名需要命名为bootstrap.properties,里面的应用名要和对应的配置中心的配置文件的名称一致(即在配置中心中,至少有一个配置文件的名称要和项目里bootstrap.properties文件里面的应用名一致,否则会报数据库(因为该项目的数据库连接信息放在配置中心里面)方面的错误),代码如下:

spring.application.name=e-book-config-rsa-product
server.port=8127

eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/

#默认false,这里设置true,表示开启读取配置中心的配置
spring.cloud.config.discovery.enabled=true
#对应eureka中的配置中心serviceId,默认是configserver
spring.cloud.config.discovery.serviceId=config-server

(12)然后服务端通过应用名访问对应的配置中心的配置文件,浏览器访问http://localhost:8126/e-book-config-rsa-product/default,结果如下:
在这里插入图片描述
可以看到解密成功。
(13)然后试下能否通过解密后的用户名密码访问数据库,浏览器访问http://localhost:8127/product/list,结果如下:
在这里插入图片描述

第八节,配置中心的用户安全认证

我们先启动config-server-encrypt-symmetric,浏览器访问http://localhost:8124/e-book-config-product/default,结果如下:
在这里插入图片描述

这么随随便便就能访问到数据库的用户名和密码是很危险的,为了降低这种危险性,我们在访问之前加入安全认证。
下面是一个例子:
(1)在config模块下新建一个maven项目,命名为config-server-encrypt-security。
(2)修改pom文件,添加如下依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-config-server</artifactId>
</dependency>
		
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

(3)添加配置文件

spring.application.name=config-server
server.port=8128

eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/

spring.cloud.config.label=master
spring.cloud.config.server.git.uri=https://github.com/tanwenfang/GitRepository.git
spring.cloud.config.server.git.search-paths=config

#设置密钥的key
encrypt.key=twf

#安全认证
#开启基于http basic的安全认证
security.basic.enabled=true
security.user.name=user
security.user.password=123456

(4)添加一个启动类:

package com.twf.config.server.encrypt.security;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ConfigServerEncryptSecurityApplication {

	public static void main(String[] args) {
		SpringApplication.run(ConfigServerEncryptSecurityApplication.class, args);
	}
}

(5)浏览器访问http://localhost:8128/e-book-config-product/default,此时会出现如下弹框:
在这里插入图片描述
我们输入用户名和密码,就能访问到和上面一样的结果了。

(6)然后在config模块下新建一个maven项目,命名为config-encrypt-security-product-core,作为客户端。拷贝config-encrypt-symmetric-product-core的文件和代码到这个项目。
(7)启动该项目,结果报:
在这里插入图片描述
(8)修改配置文件,加入如下两行配置:

#安全保护
spring.cloud.config.username=user
spring.cloud.config.password=123456

然后重新启动成功。

源码点这里

猜你喜欢

转载自blog.csdn.net/tanwenfang/article/details/87940101