我们的配置服务器相对不安全,只有少数客户需要加密属性。理想情况下,我们希望服务器只有公钥,每个客户端都可以使用私钥进行解密。问题是,默认情况下,配置服务器将始终尝试为您解密密文。为了防止这种情况,我禁用了默认行为:
@SpringBootApplication(exclude = EncryptionAutoConfiguration.class)
@EnableConfigServer
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
现在,当客户端应用程序从配置服务器获取属性时,它会得到如下内容:
"source": {
"username": foobar,
"password": "{cipher}CiBNmK+y3ZLsXHVgaJMAiuNyLQo3p0e..."
}
我已经实现了TextEncrypter bean并对其进行了测试,以确保它在客户端上正常运行。在客户端应用程序启动时,我希望EnvironmentDecryptApplicationInitializer
类处理客户端的本地引导程序和应用程序属性以及从配置服务器获取的属性。但是我发现只考虑客户端的本地文件。如果我的密文存在于本地bootstrap.yml
中,那么它将被正确解密。但是,如果密文来自配置服务器,则不会解密。有没有办法包括从配置服务器获取的属性?
答案 0 :(得分:2)
这实际上非常简单。根据这个问题:
https://github.com/spring-cloud/spring-cloud-config/issues/365
您所要做的就是配置云配置服务器之类的云配置客户端。这意味着,如果你使用对称加密,你所要做的就是
1。)将以下内容添加到Spring Cloud Config Server上的application.properties,以便服务器在发送到客户端之前不解密属性:
spring.cloud.config.server.encrypt.enabled=false
2.。)在Spring Cloud Config Client上,您需要做的就是将加密密钥添加到bootstrap.properties文件中:
encrypt.key=supersecretpassword
就是这样。当客户端读取属性时,属性将被解密。
对于非对称加密,我假设您可以通过将symetric键属性添加到客户端上的bootstrap.properties文件来完全相同:
encrypt.keyStore.location:classpath:/server.jks
encrypt.keyStore.password:letmein
encrypt.keyStore.alias:mytestkey
encrypt.keyStore.secret:changeme
答案 1 :(得分:0)
我们放弃了客户端解密。相反,我们使用默认行为...配置服务器解密密码。为了安全起见,我们将配置服务器放在一个特殊的安全组(aws)中,我们强制服务器只通过https进行通信。
答案 2 :(得分:0)
如果你想再给它一次,我们就能让它发挥作用。
在配置服务器上:
spring.cloud.config.server.encrypt.enabled=false
在客户端,我们正在使用spring-cloud-config-aws-kms。这样我们就可以使用可以访问密钥的角色授权每个服务。如果您想做其他事情,上面的项目会显示需要的内容。