此版本仍在开发中,尚未被视为稳定版本。最新的稳定版本请使用 Spring Cloud Config 4.2.0! |
加密和解密
要使用加密和解密功能,您需要在 JVM 中安装全功能 JCE(默认情况下不包含它)。 您可以从 Oracle 下载“Java 加密扩展 (JCE) 无限强度管辖策略文件”并按照安装说明进行作(实质上,您需要将 JRE lib/security 目录中的两个策略文件替换为您下载的文件)。 |
如果远程属性源包含加密内容(以{cipher}
),则在通过 HTTP 发送到客户端之前,会对其进行解密。
这种设置的主要优点是,当属性值处于 “静态” 状态时(例如,在 git 存储库中),它们不需要是纯文本形式。
如果无法解密某个值,则会将其从属性源中删除,并添加具有相同键但前缀为invalid
和一个表示“不适用”的值(通常<n/a>
).
这主要是为了防止密文被用作密码并意外泄露。
如果您为 config 客户端应用程序设置远程 config 存储库,它可能包含一个application.yml
类似于以下内容:
spring:
datasource:
username: dbuser
password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
中的 加密值application.properties
文件不能用引号括起来。否则,该值不会被解密。以下示例显示了有效的值:
spring.datasource.username: dbuser spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
您可以安全地将此纯文本推送到共享的 git 存储库,并且密钥密码将受到保护。
服务器还会公开/encrypt
和/decrypt
endpoints (假设这些是安全的,并且只有授权代理才能访问)。
如果您编辑远程配置文件,则可以使用 Config Server 通过对/encrypt
endpoint,如以下示例所示:
$ curl localhost:8888/encrypt -s -d mysecret 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
如果您使用 curl 进行测试,则使用--data-urlencode (而不是-d ) 并为要加密的值添加前缀(curl 需要这样做)或设置显式= Content-Type: text/plain 确保在存在特殊字符('+' 特别棘手)时对数据进行正确编码。 |
请确保不要在加密值中包含任何 curl 命令统计信息,这就是示例使用-s 选项将其静音。将值输出到文件有助于避免此问题。 |
逆运算也可以通过/decrypt
(前提是服务器是
配置了对称密钥或完整密钥对),如以下示例所示:
$ curl localhost:8888/decrypt -s -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda mysecret
获取加密的值并添加{cipher}
前缀,然后再将其放入 YAML 或属性文件,以及提交并将其推送到远程(可能不安全)存储。
这/encrypt
和/decrypt
端点也都接受/*/{application}/{profiles}
,当客户端调用主环境资源时,它可用于基于每个应用程序(名称)和每个配置文件控制加密。
要以这种精细的方式控制加密,您还必须提供@Bean 的类型TextEncryptorLocator 这将为每个名称和配置文件创建不同的加密器。
默认情况下提供的密钥不会这样做(所有加密都使用相同的密钥)。 |
这spring
命令行客户端(使用 Spring Cloud CLI 扩展
installed) 也可用于加密和解密,如以下示例所示:
$ spring encrypt mysecret --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda $ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda mysecret
要在文件中使用密钥(例如用于加密的 RSA 公钥),请在 key 值替换为 “@” 并提供文件路径,如以下示例所示:
$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...
这--key 参数是必需的(尽管有前缀)。-- |
解密错误
当配置服务器无法解密值时,它将创建一个invalid
属性。
例如
{
"label": null,
"name": "application",
"profiles": [
"prd"
],
"propertySources": [
{
"name": "file:/demo/configserver/application-prd.yaml",
"source": {
"invalid.SharedPassword": "<n/a>"
}
},
{
"name": "file:/demo/configserver/application.yaml",
"source": {
"SharedPassword": "Fill_me_in"
}
}
],
"state": null,
"version": null
}
在上面的示例中,配置服务器无法解密SharedPassword
在application-prd.yaml
因此,配置服务器在属性名称前加上invalid
.
如果 Config Client 收到此响应,然后将其添加到应用的Environment
和客户端
请求的值为SharedPassword
它会得到Fill_me_in
.
如果你不希望 config server 为 properties 添加前缀,它就不能解密 witinvalid
然后,您可以设置spring.cloud.config.server.encrypt.prefix-invalid-properties
自false
.如果您执行此作,则来自
Config Server 将如下所示:
"label": null,
"name": "application",
"profiles": [
"prd"
],
"propertySources": [
{
"name": "file:/demo/configserver/application-prd.yaml",
"source": {
"SharedPassword": "AYBKlpcZpaR36OcRDQjNIQl6fmnddAQhetMw/uyTpnn5fDj+unJ9QOEbqiPc9fX0N+CC8i+EJiN6nlH9Xqu6sH1tX/P6zg1CIy+ct/1RWGNbmQ256jc6vQaXhiN8sA8Mr6QiqYnMoBd+Jni/Miir5G3a7G9MmjbEUASKJOhUlIFKqL1IqB81RBT/cv0bg9kAiy5VBF1WppxP/PwtjECzbeUi2Y1jbpYb98rnc/qmRO3ZJam9fDNcPpW09qGFhGgJIujca257F7G4guS2w/7haVzNoyRiwHzZ14oL8AIxHLMBSJJF19ULlsMAkROj9o9TnwhL9r4rX9sAWk28c5eq77+iVpmlT3yoRdZqvMqffzKiibDlzz95Gmms7V7mctxrhNVOOWTwMSJvk94Y9ZPenljKgPJIV3Z1cqqx+W8JxFFeelOuYvMEe4bOVBh1TepGzzdWVdYbylgXJy35uRTZ2drybUe5+jc0hiAuujHz0zdY1FwOHfwzSsSidlYn4syPeuytnxTzn7fbWXeXetTTtDlmLRf8MBSzXzDFWNH0cNGOCQ=="
}
},
{
"name": "file:/demo/configserver/application.yaml",
"source": {
"SharedPassword": "Fill_me_in"
}
}
],
"state": null,
"version": null
}
在这种情况下,如果配置客户端要接收上述响应并请求该值
之SharedPassword
从Environment
它将取回加密的值,而不是Fill_me_in
.