《Spring Cloud Config官方文档》加密和解密

原文链接

5.2 健康指标

Config Server 附带一个健康指标(Health Indicator),用于检查配置的 EnvironmentRepository 是否正常工作。默认情况下,它会为 EnvironmentRepository请求一个名为 app 的应用程序,这个默认的profile和label由EnvironmentRepository的实现提供。

你可以使用自定义的profiles和labels配置健康指标以检查更多的应用程序。例如:

spring:
  cloud:
    config:
      server:
        health:
          repositories:
            myservice:
              label: mylabel
            myservice-dev:
              name: myservice
              profiles: development

可以使用这个配置项来禁用健康指标:spring.cloud.config.server.health.enabled=false

5.3 安全

你可以自由的使用任何对你有意义的方式去保护你的 Config Server (从物理网络的安全到OAuth2 bearer tokens),Spring SecuritySpring Boot 以简单的方式将这些做的更好。

想要使用 Spring Boot 默认配置的 HTTP Basic 认证的话,只需要将 Spring Security 包含进classpath即可(可以引入 spring-boot-starter-security 包)。默认情况下使用了 user 这个用户名和随机生成的密码,这在实际情况下并不会很有用,所以我们建议你手动配置你的密码(通过 security.user.password)并对其进行加密(请参考下面的教程来学习怎样做到这一点)。

5.4 加密和解密

重要

先决条件:要使用加密和解密功能,需要在你的JVM中安装全功能的JCE(默认情况下不会被安装)。你可以从Oracle下载 "Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files" ,并参考安装说明来进行安装(基本上就是将JRE 的 lib/security 目录下的两个策略文件替换为你下载的那些文件)。

如果远程属性源中包含加密了的内容(以 cipher 开头的值),则在通过HTTP发送给客户端之前,他们将被解密。这种配置的主要优点是,属性值在“静止”(译注:原文为”at rest”)时(例如,在git存储库中)不必是纯文本的。如果某个值无法被解密,它将被从属性源中移除,同时一个新的属性将使用同样的key被添加进来。这个新的属性前缀为 invalid ,值被设置为含义为”不适用”的一个值(通常使用 <n/a>)。这主要是为了防止在文本中存储密码而意外泄露。

如果你正在为你的config client配置远程存储仓库,那么它应该包含一个像下面这样的 application.yml 配置文件。例如:

application.yml.

spring:
  datasource:
    username: dbuser
    password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'

使用 .properties 文件进行配置时,被加密的值不能包含在引号中,否则这个只不会被解密:

application.properties.

spring.datasource.username: dbuser
spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ

你可以安全得将这个纯文本推送到共享的git存储库中,这个密码将受到保护。

Config Server还公开了 /encrypt/decrypt 这两个接口(请确保这两个接口是受到保护的并且只能被已经授权的代理访问到)。如果你在编辑一个远程的配置文件,你可以发送POST请求来使用Confog Server的 /encrypt 接口。例如:

$ curl localhost:8888/encrypt -d mysecret 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda

如果你正在加密的字符是需要被 URLencode 的值,则需要使用 --data-urlencode 选项来让 curl 正确的编码它们。

请确保不要在加密值中包含任何 curl 统计命令。 将该值输出到文件可以帮助避免此问题。

可以使用 /decrypt 来进行相反的操作(如果服务器配置了对称加密使用的密钥或者完整的密钥对):

$ curl localhost:8888/decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret

如果你使用 curl 进行测试,那么使用 --data-urlencode 来代替 -d 或者使用 Content-type: text/plain 来确保在含有特殊字符时curl 能正确的进行编码(+尤其棘手)。

当你将一个值放在YAML文件或者properties文件中,然后将这个文件提交并推送到远程的可能不安全的存储区之前,请为这个值添加 {cipher} 前缀。

/encrypt/decrypt 这两个接口也接受格式为 /*/{name}/{profiles} 的路径。当客户端调用主环境的资源时,该路径可以用来控制对每个应用程序 {name} 和配置 {profiles} 的分别加密。

要使用这种细粒度的方式控制加密的话,你还必须提供一个类型为 TextEncryptorLocator@Bean。它根据不同的应用程序 {name} 和配置 {profiles}来创建不同的加密器。当然,这不是默认的行为(默认情况所有的加密使用同一个key)。

Spring 的命令行客户端(需要安装 Spring Cloud CLI 扩展)也可以用来加密和解密。例如:

$ spring encrypt mysecret --key foo
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret

如果需要使用存在文件中的密钥(例如,一个用于RSA加密的公钥),需要为密钥值添加 @ 前缀并提供这个文件的路径。例如:

$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub
AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...

命令中的 key 参数是必须的(尽管有一个 -- 前缀)。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/98434.html

(0)
上一篇 2021年8月21日 00:02
下一篇 2021年8月21日 00:03

相关推荐

发表回复

登录后才能评论