Spring Cloud Config 未解密配置服务器密码
Posted
技术标签:
【中文标题】Spring Cloud Config 未解密配置服务器密码【英文标题】:Spring Cloud Config not decrypting the config server password 【发布时间】:2016-06-26 14:37:29 【问题描述】:我已经在 Spring Cloud Config 上工作了一段时间。我需要保护配置数据。根据 Spring Cloud 文档,我已经配置了 server.jks 并添加到类路径中。现在我可以加密和解密远程配置数据了。
为了使配置服务器安全,我添加了 Spring Security Starter 并分配了凭据(密码解密)。由于某种原因,应用程序抛出了类路径上没有密钥存储的异常。谷歌搜索了一段时间后,我发现密钥库应该转到 bootstrap.yml 而不是 application.yml。这也不起作用,我在这里缺少什么?
您可以在 GitHub 上找到 yml 配置文件: SpringConfigData
例外:
java.lang.IllegalStateException: Cannot decrypt: key=security.user.password
at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:195) ~[spring-cloud-context-1.1.0.BUILD-SNAPSHOT.jar:1.1.0.BUILD-SNAPSHOT]
at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:164) ~[spring-cloud-context-1.1.0.BUILD-SNAPSHOT.jar:1.1.0.BUILD-SNAPSHOT]
at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.initialize(EnvironmentDecryptApplicationInitializer.java:94) ~[spring-cloud-context-1.1.0.BUILD-SNAPSHOT.jar:1.1.0.BUILD-SNAPSHOT]
at org.springframework.cloud.bootstrap.BootstrapApplicationListener$DelegatingEnvironmentDecryptApplicationInitializer.initialize(BootstrapApplicationListener.java:333) ~[spring-cloud-context-1.1.0.BUILD-SNAPSHOT.jar:1.1.0.BUILD-SNAPSHOT]
at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:640) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
at org.springframework.boot.SpringApplication.createAndRefreshContext(SpringApplication.java:343) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:307) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1191) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1180) [spring-boot-1.3.3.RELEASE.jar:1.3.3.RELEASE]
at com.test.TestConfigServerApplication.main(TestConfigServerApplication.java:12) [classes/:na]
Caused by: java.lang.UnsupportedOperationException: No decryption for FailsafeTextEncryptor. Did you configure the keystore correctly?
at org.springframework.cloud.bootstrap.encrypt.EncryptionBootstrapConfiguration$FailsafeTextEncryptor.decrypt(EncryptionBootstrapConfiguration.java:151) ~[spring-cloud-context-1.1.0.BUILD-SNAPSHOT.jar:1.1.0.BUILD-SNAPSHOT]
at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:187) ~[spring-cloud-context-1.1.0.BUILD-SNAPSHOT.jar:1.1.0.BUILD-SNAPSHOT]
... 9 common frames omitted
【问题讨论】:
您是否按照文档中的说明安装了 JCE? projects.spring.io/spring-cloud/docs/1.0.3/… 是的,我已经设置好了。加密/解密适用于我的 svn 中的远程属性。 在再次浏览文档后,我还有一个观察结果。我已经尝试了环境变量。 (-Dencrypt.keyStore.location=classpath:/server.jks -Dencrypt.keyStore.password=springcloudconfigserver -Dencrypt.keyStore.alias=springcloudconfigserver -Dencrypt.keyStore.secret=springcloudconfigserver) 这次它工作了。对于所有对不对称配置摸不着头脑的人来说,这是一种解决方法。 【参考方案1】:使用环境变量传递而不是bootstrap.yml
。
-Dencrypt.keyStore.location=classpath:/server.jks
-Dencrypt.keyStore.password=springcloudconfigserver
-Dencrypt.keyStore.alias=springcloudconfigserver
-Dencrypt.keyStore.secret=springcloudconfigserver
配置服务器 无法找到 bootstrap.yml
中的属性以实现非对称安全性。对称效果很好
【讨论】:
bootstrap.xml
不是有效文件,bootstrap.yml
或 bootstrap.properties
有效。
抱歉,yml 文件中出现错字【参考方案2】:
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-rsa</artifactId>
<version>1.0.8.RELEASE</version>
</dependency>
我在配置客户端遇到了同样的问题。为了解决这个问题,我在pom.xml
和bootstarp.properties
/bootstrap.yml
文件中添加了这个依赖项,我在使用对称加密时添加了encrypt.key
属性。
希望对你有帮助。
【讨论】:
【参考方案3】:我遇到此错误是因为我的应用程序使用本地 bootstrap.yml
而不是服务器中的云配置。这就是它无法解密并且失败的原因。
确保本地bootstrap.yml
有这个属性,表示使用config.uri
从服务器读取配置:
spring:
cloud:
config:
enabled: true
【讨论】:
【参考方案4】:我遇到过这个问题。要在最新版本的 Spring Cloud 中设置对称加密,您只需在 bootstap.yml(或 .properties) 中使用所需的密钥设置 encrypt.key
属性(建议将密钥设置为操作系统环境变量并在文件中引用该变量。这是为了提高安全性)
但是,正如您发现的那样,bootsrap 文件中的属性不再被导入。您必须将以下依赖项添加到您的 pom 文件中才能加载该文件中的属性:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
完成此操作后,一切都会顺利进行。
【讨论】:
【参考方案5】:简单的答案是:将所有属性从bootstrap.yaml
移动到application.yaml
。
【讨论】:
【参考方案6】:我在 IntelliJ IDEA 中运行项目并具有以下项目结构时遇到了这个问题:
.
├── config
│ └── application.yaml
├── api-users
│ ├── pom.xml
│ └── src
└── config-server
├── pom.xml
└── src
该项目在启动时也使用了文件config/application.yaml
,这就是发生此错误的原因。
将config
目录重命名为configuration
后,这个问题就解决了。
【讨论】:
以上是关于Spring Cloud Config 未解密配置服务器密码的主要内容,如果未能解决你的问题,请参考以下文章
Spring Cloud Config 配置中心 自动加解密功能
SpringCloud - Spring Cloud 之 Config分布式配置;加解密;配置信息局部刷新;Spring Cloud Bus+RabbitMQ全局刷新(十六)