加密和解密
要使用加密和解密功能,您需要在 JVM 中安装完整版本的 JCE(默认情况下不包含)。您可以从 Oracle 下载“Java 加密扩展 (JCE) 无限制强度权限策略文件”,并按照安装说明进行操作(基本上,您需要将 JRE lib/security 目录中的两个策略文件替换为您下载的文件)。 |
如果远程属性源包含加密内容(以{cipher}
开头的值),则在通过 HTTP 发送到客户端之前对其进行解密。此设置的主要优点是属性值在“存储时”(例如,在 git 存储库中)不必以纯文本形式存在。如果无法解密某个值,则将其从属性源中删除,并添加一个具有相同键但以invalid
为前缀的附加属性,以及表示“不适用”的值(通常为<n/a>
)。这主要用于防止使用密文作为密码并意外泄露。
如果您为配置客户端应用程序设置了远程配置存储库,则它可能包含一个类似于以下内容的application.yml
spring:
datasource:
username: dbuser
password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
application.properties
文件中加密的值不能用引号括起来。否则,该值不会被解密。以下示例显示了可以正常工作的值
spring.datasource.username: dbuser spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
您可以安全地将此纯文本推送到共享的 git 存储库,并且秘密密码仍然受到保护。
服务器还公开了/encrypt
和/decrypt
端点(假设这些端点是安全的,并且仅由授权代理访问)。如果您编辑远程配置文件,则可以通过 POST 到/encrypt
端点来使用 Config Server 加密值,如以下示例所示
$ curl localhost:8888/encrypt -s -d mysecret 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
如果您使用 curl 进行测试,则使用--data-urlencode (而不是-d )并在要加密的值前添加= (curl 需要此操作)或设置显式的Content-Type: text/plain 以确保 curl 在存在特殊字符('+' 特别棘手)时正确编码数据。 |
请确保不要在加密值中包含任何 curl 命令统计信息,这就是示例使用-s 选项将其静默的原因。将值输出到文件可以帮助避免此问题。 |
反向操作也可以通过/decrypt
获得(前提是服务器配置了对称密钥或完整的密钥对),如以下示例所示
$ curl localhost:8888/decrypt -s -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda mysecret
在将加密值放入 YAML 或属性文件以及提交并将其推送到远程(可能不安全)存储之前,请在前面添加{cipher}
前缀。
/encrypt
和/decrypt
端点也都可以接受/*/{application}/{profiles}
形式的路径,当客户端调用主环境资源时,可用于在每个应用程序(名称)和每个配置文件的基础上控制加密。
要以这种细粒度的方式控制加密,您还必须提供一个类型为TextEncryptorLocator 的@Bean ,该@Bean 为每个名称和配置文件创建不同的加密器。默认情况下提供的加密器不会这样做(所有加密都使用相同的密钥)。 |
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 参数是强制性的(尽管有-- 前缀)。 |