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.ymlbootstrap.properties 有效。 抱歉,yml 文件中出现错字【参考方案2】:
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-rsa</artifactId>
    <version>1.0.8.RELEASE</version>
</dependency>

我在配置客户端遇到了同样的问题。为了解决这个问题,我在pom.xmlbootstarp.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全局刷新(十六)

Spring Cloud 系列之 Config 配置中心

Spring Cloud 系列之 Config 配置中心

Spring Cloud Config - RSA简介以及使用RSA加密配置文件

spring cloud config客户端未从配置服务器加载配置