返回 导航

SpringBoot / Cloud

hangge.com

分布式配置中心Spring Cloud Config使用详解11(加密解密)

作者:hangge | 2020-08-21 08:10

十一、加密解密

1,基本介绍

    在微服务架构中,我们通常会采用 Devops 的组织方式来降低因团队间沟通造成的巨大成本,以加速微服务应用的交付能力。这就使得原本由运维团队控制的线上信息将交由微服务所属组织的成员自行维护,其中将会包括大量的敏感信息,比如数据库的账户与密码等。显然,如果我们直接将敏感信息以明文的方式存储于微服务应用的配置文件中是非常危险的。
(1)针对这个问题,Spring Cloud Config 提供了对属性进行加密解密的功能,以保护配置文件中的信息安全。比如下面例子:
spring.datasource.username=hangge
spring.datasource.password={cipher}029907bc57984e549f269a3dbbcc14971226ecc590e377a8d3fd56101b0ffb8b651aeec1ba9135421d566cefb759cb933ecc767275d7f84c395c2b364de85afe

(2)在 Spring Cloud Config 中通过在属性值前使用 {cipher} 前缀来标注该内容是一个加密值,当微服务客户端加载配置时,配置中心会自动为带有 {cipher} 前缀的值进行解密。通过该机制的实现,运维团队就可以放心地将线上信息的加密资源给到微服务团队,而不用担心这些敏感信息遭到泄露了。

2,对称加密

(1)在使用 Spring Cloud Config 的加密解密功能时,有一个必要的前提是需要在配置中心的运行环境中安装不限长度的 JCE 版本(UnlimitedStrength Java Cryptography Extension)。
注意:虽然 JCE 功能在 JRE 中自带,但是默认使用的是有长度限制的版本。所以需要手动安装不限长度的 JCE 版本。

(2)我们可以从 Oracle 的官方网站下载到它(点击跳转),它是一个压缩包,解压后可以看到下面三个文件:

(3)我们需要将 local_policy.jar US_export_policy.jar 两个文件复制到 $JAVA_HOME/jre/lib/security 目录下,覆盖原来的默认内容。到这里加密解密的准备工作就完成了。
注意$JAVA_HOME 目录地址可以通过 echo $JAVA_HOME 命令查看。

(4)在完成了 JCE 的安装之后,配置中心 Config-Server 中会有如下几个端点:
  • /encrypt/status:查看加密功能状态的端点
  • /key:查看密钥的端点
  • /encrypt:对请求的 body 内容进行加密的端点
  • /decrypt:对请求的 body 内容进行解密的端点

(5)比如我们尝试通过 Get 请求访问 /encrypt/status 端点,会得到如下内容。"The encryption algorithm is not strong enough"错误是因为我们没有配置密钥:

(6)在 bootstrap.properties 配置文件中配置密钥:
注意:加密的 key 一定要写在 bootstrap.properties 或者 bootstrap.yml 文件中,没有就新建一个(resources 文件夹)。另外,我们也可以使用环境变量 ENCRYPT_KEY 来进行配置,让密钥信息外部化存储。
encrypt.key=hangge123

(7)重启配置中心,再次请求访问 /encrypt/status 端点,出现如下内容则说明我们配置中心的加密解密功能已经可以使用了。

(8)下面尝试访问下 /encrypt /decrypt 端点来使用加密解密功能。
注意:这两个端点都是 POST 请求,加密和解密信息需要通过请求体来发送。这里以 curl 命令为例分别调用加密和解密端点。

  • 解密curl localhost:7001/decrypt -d c41877ea7a4547a7f746cca9ba83c89e5acf86f4f1736fc4f8d1a5fda6a0f438

(9)也就是说仓库里配置文件里是如下形式的加密值(以 {cipher} 前缀),那么客户端经由配置中心自动会得到解密后的值(也就是 hangge

3,非对称加密

    Spring Cloud Config 的配置中心不仅可以使用对称性加密,也可以使用非对称性加密(比如 RSA 密钥对)。虽然非对称性加密的密钥生成与配置相对复杂一些,但是它具有更高的安全性。

(1)这里我们使用 keytoo1 工具来生成密钥对。它的位置在 $JAVA_H0ME\bin\keytoo1.exe
    keytoo1JDK 中的一个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向其他用户朋艮务认证自己)或数据完整性以及认证服务。在 JDK I.4 以后的版本中都包含了这一工具。

(2)我们执行如下命令生产密钥:
参数说明:
  • -alias config-server”含义是设置自定义证书名称为 config-server
  • -keystore /Users/hangge/config-server.keystore”含义是设置证书文件的保存路径,证书文件名称是 config-server.keystore
  • -validity 36500”含义是证书有效期,36500 表示 100 年,默认值是 90 天;
keytool -genkeypair -alias config-server -keyalg RSA -keystore /Users/hangge/config-server.keystore -validity 36500

(3)上面命令执行后会生成一个 config-server.keystore 文件,假设我们将其放在当前用户目录下,那么在配置中心加入如下相关的配置信息即可:
注意:下面一定要写在 bootstrap.properties 或者 bootstrap.yml 文件中,没有就新建一个(resources 文件夹)。
encrypt.key-store.location=file://${user.home}/config-server.keystore
encrypt.key-store.alias=config-server
encrypt.key-store.password=hangge
encrypt.key-store.secret=123456

(4)如果我们将 config-server.keystore 文件放在配置中心的 src/main/resources 目录下,则可以直接使用如下配置:
encrypt.key-store.location=config-server.keystore
encrypt.key-store.alias=config-server
encrypt.key-store.password=hangge
encrypt.key-store.secret=123456

(5)当然我们也可以跟对称解密介绍的一样,将非对称加密的配置信息通过环境变量的方式进行配置,它们对应的具体变量名如下:
    通过环境变量来配置密钥库相关信息可以获得更好的安全性,所以我们可以将敏感的口令信息存储在配置中心的环境变量中是一种不错的选择。
  • ENCRYPT_KEY_STORE_LOCATION
  • ENCRYPT_KEY_STORE_ALIAS
  • ENCRYPT_KEY_STORE_PASSWORD
  • ENCRYPT_KEY_STORE_SECRET
评论

全部评论(0)

回到顶部