Spring Cloud构建微服务架构:分布式配置中心

最近正好想发一篇关于配置中心加密的细节内容,结果发现基础的加密解密竟然漏了,因此在这个入门系列中补充一下。后面再更新一下,使用配置中心的一些经验和教训。java

在微服务架构中,咱们一般都会采用DevOps的组织方式来下降因团队间沟通形成的巨大成本,以加速微服务应用的交付能力。这就使得本来由运维团队控制的线上信息将交由微服务所属组织的成员自行维护,其中将会包括大量的敏感信息,好比:数据库的帐户与密码等。很显然,若是咱们直接将敏感信息以明文的方式存储于微服务应用的配置文件中是很是危险的。针对这个问题,Spring Cloud Config提供了对属性进行加密解密的功能,以保护配置文件中的信息安全。好比下面的例子:spring

spring.datasource.username=didi数据库

spring.datasource.password={cipher}dba6505baa81d78bd08799d8d4429de499bd4c2053c05f029e7cfbf143695f5b安全

在Spring Cloud Config中经过在属性值前使用 {cipher}前缀来标注该内容是一个加密值,当微服务客户端来加载配置时,配置中心会自动的为带有 {cipher}前缀的值进行解密。经过该机制的实现,运维团队就能够放心的将线上信息的加密资源给到微服务团队,而不用担忧这些敏感信息遭到泄露了。下面咱们来具体介绍如何在配置中心使用该项功能。架构

使用前提运维

在使用Spring Cloud Config的加密解密功能时,有一个必要的前提须要咱们注意。为了启用该功能,咱们须要在配置中心的运行环境中安装不限长度的JCE版本(Unlimited Strength Java Cryptography Extension)。虽然,JCE功能在JRE中自带,可是默认使用的是有长度限制的版本。咱们能够从Oracle的官方网站中下载到它,它是一个压缩包,解压后能够看到下面三个文件:curl

README.txt分布式

local_policy.jar微服务

US_export_policy.jar工具

咱们须要将 local_policy.jar和 US_export_policy.jar两个文件复制到 $JAVA_HOME/jre/lib/security目录下,覆盖原来的默认内容。到这里,加密解密的准备工做就完成了。

相关端点

在完成了JCE的安装后,能够尝试启动配置中心。在控制台中,将会输出了一些配置中心特有的端点,主要包括:

  • /encrypt/status:查看加密功能状态的端点

  • /key:查看密钥的端点

  • /encrypt:对请求的body内容进行加密的端点

  • /decrypt:对请求的body内容进行解密的端点

能够尝试经过GET请求访问 /encrypt/status端点,咱们将获得以下内容:

{

 "description": "No key was installed for encryption service",

 "status": "NO_KEY"

}

该返回说明当前配置中心的加密功能还不能使用,由于没有为加密服务配置对应的密钥。

配置密钥

咱们能够经过 encrypt.key属性在配置文件中直接指定密钥信息(对称性密钥),好比:

encrypt.key=didispace

加入上述配置信息后,重启配置中心,再访问 /encrypt/status端点,咱们将获得以下内容:

{

 "status": "OK"

}

此时,咱们配置中心的加密解密功能就已经可使用了,不妨尝试访问一下 /encrypt和 /decrypt端点来进行加密和解密的功能。注意,这两个端点都是POST请求,加密和解密信息须要经过请求体来发送。好比,以 curl命令为例,咱们能够经过下面的方式调用加密与解密端点:

$ curl localhost:7001/encrypt -d didispace

3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7

 

$ curl localhost:7001/decrypt -d  3c70a809bfa24ab88bcb5e1df51cb9e4dd4b8fec88301eb7a18177f1769c849ae9c9f29400c920480be2c99406ae28c7

didispace

这里,咱们经过配置 encrypt.key参数来指定密钥的实现方式采用了对称性加密。这种方式实现比较简单,只须要配置一个参数便可。另外,咱们也可使用环境变量 ENCRYPT_KEY来进行配置,让密钥信息外部化存储。

非对称加密

Spring Cloud Config的配置中心不只可使用对称性加密,也可使用非对称性加密(好比:RSA密钥对)。虽然非对称性加密的密钥生成与配置相对复杂一些,可是它具备更高的安全性。下面,咱们来具体介绍一下如何使用非对称加密。

首先,咱们须要经过 keytool工具来生成密钥对。 keytool是JDK中的一个密钥和证书管理工具。它使用户可以管理本身的公钥/私钥对及相关证书,用于(经过数字签名)自我认证(用户向别的用户/服务认证本身)或数据完整性以及认证服务。在JDK 1.4之后的版本中都包含了这一工具,它的位置在: %JAVA_HOME%\bin\keytool.exe

生成密钥的具体命令以下:

$ keytool -genkeypair -alias config-server -keyalg RSA -keystore config-server.keystore

输入密钥库口令:

再次输入新口令:

您的名字与姓氏是什么?

 [Unknown]:  zhaiyongchao

您的组织单位名称是什么?

 [Unknown]:  company

您的组织名称是什么?

 [Unknown]:  organization

您所在的城市或区域名称是什么?

 [Unknown]:  city

您所在的省/市/自治区名称是什么?

 [Unknown]:  province

该单位的双字母国家/地区代码是什么?

 [Unknown]:  china

CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china是否正确?

 [否]:  y

 

输入 <config-server> 的密钥口令

       (若是和密钥库口令相同, 按回车):

再次输入新口令:

另外,若是咱们不想逐步的输入那些提示信息,可使用 -dname来直接指定,而密钥库口令与密钥口令可以使用 -storepass和 -keypass来直接指定。因此,咱们能够经过下面的命令直接建立出与上述命令同样的密钥库:

$ keytool -genkeypair -alias config-server -keyalg RSA \

 -dname "CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china" \

 -keypass 222222 \

 -keystore config-server.keystore \

 -storepass 111111 \

默认状况下,上述命令建立的密钥只有90天有效期。若是咱们想要调整它的有效期,能够经过增长 -validity参数来实现,好比咱们能够经过下面的命令,让密钥的有效期延长到一年:

$ keytool -genkeypair -alias config-server -keyalg RSA \

 -dname "CN=zhaiyongchao, OU=company, O=organization, L=city, ST=province, C=china" \

 -keypass 222222 \

 -keystore config-server.keystore \

 -storepass 111111 \

 -validity 365 \

上述的三种命令生成方式,最终都会在命令的当前执行目录下生成一个 config-server.keystore文件。下面,咱们须要将它保存在配置中心的文件系统中的某个位置,好比放在当前的用户目录下,而后在配置中心中加入相关的配置信息:

encrypt.key-store.location=file://${user.home}/config-server.keystore

encrypt.key-store.alias=config-server

encrypt.key-store.password=111111

encrypt.key-store.secret=222222

若是咱们将 config-server.keystore放在配置中心的 src/main/resource目录下,也能够直接这样配置: encrypt.key-store.location=config-server.keystore。另外,非对称加密的配置信息也能够经过环境变量的方式进行配置,它们对应的具体变量名以下:

ENCRYPT_KEY_STORE_LOCATION

ENCRYPT_KEY_STORE_ALIAS

ENCRYPT_KEY_STORE_PASSWORD

ENCRYPT_KEY_STORE_SECRET

经过环境变量来配置密钥库相关信息能够得到更好的安全性,因此咱们能够将敏感的口令信息存储在配置中心的环境变量中是一种不错的选择

欢迎学Java和大数据的朋友们加入java架构交流: 855835163

加群连接:https://jq.qq.com/?_wv=1027&k=5dPqXGI

群内提供免费的架构资料还有:Java工程化、高性能及分布式、高性能、深刻浅出。高架构。性能调优、Spring,MyBatis,Netty源码分析和大数据等多个知识点高级进阶干货的免费直播讲解 能够进来一块儿学习交流哦

相关文章
相关标签/搜索