首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果配置包含加密条目,则嵌入式自配置Spring服务器启动失败。

如果配置包含加密条目,则嵌入式自配置Spring服务器启动失败。
EN

Stack Overflow用户
提问于 2016-11-13 23:39:31
回答 1查看 1.6K关注 0票数 0

我目前正在玩,在试图从它的存储库中运行嵌入式配置服务器时遇到了一个问题。在我将加密的值添加到服务器的配置文件之前,一切都很好。一旦我这样做,服务器启动就会失败,只有这个例外:

代码语言:javascript
复制
java.lang.IllegalStateException: Cannot decrypt: key=config-server.test.prop
    at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:201) ~[spring-cloud-context-1.1.5.RELEASE.jar:1.1.5.RELEASE]
    at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:165) ~[spring-cloud-context-1.1.5.RELEASE.jar:1.1.5.RELEASE]
    at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.initialize(EnvironmentDecryptApplicationInitializer.java:95) ~[spring-cloud-context-1.1.5.RELEASE.jar:1.1.5.RELEASE]
    at org.springframework.boot.SpringApplication.applyInitializers(SpringApplication.java:635) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
    at org.springframework.boot.SpringApplication.prepareContext(SpringApplication.java:349) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175) [spring-boot-1.4.2.RELEASE.jar:1.4.2.RELEASE]
    at test.configserver.Application.main(Application.java:13) [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:152) ~[spring-cloud-context-1.1.5.RELEASE.jar:1.1.5.RELEASE]
    at org.springframework.cloud.bootstrap.encrypt.EnvironmentDecryptApplicationInitializer.decrypt(EnvironmentDecryptApplicationInitializer.java:193) ~[spring-cloud-context-1.1.5.RELEASE.jar:1.1.5.RELEASE]
    ... 8 common frames omitted

密钥库配置应该是正确的,因为加密的值是使用服务器的/encrypt端点创建的。

此外,当我在没有加密值的情况下启动嵌入式服务器时,然后更改添加加密值的配置时,服务器将检测到配置更改,并调用/<name>/<profile>显示正确的解密值。

我的测试应用程序如下所示:

Application.java

代码语言:javascript
复制
@SpringBootApplication
@EnableConfigServer
public class Application {
    public static void main(final String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

bootstrap.yml

代码语言:javascript
复制
server:
    port: 8888
spring:
    application:
        name: config-server
    cloud:
        config:
            server:
                bootstrap: true
                git:
                    uri: file:///config_server/repo

application.yml

代码语言:javascript
复制
encrypt:
    keyStore:
        location: classpath:/configserver.jks
        alias: configserver

(encrypt.keyStore.password是通过-D选项设置的)

工作于的示例配置

代码语言:javascript
复制
config-server:
    test:
        prop: testvalue

示例配置,使服务器失败

代码语言:javascript
复制
config-server:
    test:
        prop: '{cipher}AQBsAuCDKbDgmFMkxcNPbbDMiLq4SZbBgrHX73KSBJAgisTC2O3iTxXyHhY1MWxXhuzYX4EMy2v9enV3iY3IQz4O2GprO/GjQSggW+jHE1TV7MOcvH01nvg6SUKDkAmWHQqWiqQI0G9NPp2KzOHNcMeKm+q8wbvwFSBhA4A8y8F+++mgC8XK1Kc942jepppI17dCSV25/+iUrDDVdBv6rAqu2D9eyuTZmLl6Q2/SLOGBc+Il8B8L3ylyDHrBdQD92C0aAdh6HcY5Jze1wQSNSxTIzT3nKi22DTF69ilwq9SPz5re4Hm+Y1S+be10wHh34L+fdexrdcpFz9ApqsSKDv2TzXiTCNJIKo3xsOWb6QVIL1DjyKexPri/FZWtBu4EX0dWY2OxiMDmkFf+xVIkE4kw'

我在Java8上使用Spring-Framework4.3.4、Spring-Boot1.4.2和Spring Camden.SR2。

编辑

要设置一个示例项目来重现问题,只需使用上面的Application.javabootstrap.ymlapplication.yml代码片段即可。

下面是该项目的pom.xml

代码语言:javascript
复制
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>test</groupId>
    <artifactId>config-server</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>config-server</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <compiler-plugin.version>3.5.1</compiler-plugin.version>
        <spring-framework.version>4.3.4.RELEASE</spring-framework.version>
        <spring-boot.version>1.4.2.RELEASE</spring-boot.version>
        <spring-cloud.version>Camden.SR2</spring-cloud.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>${compiler-plugin.version}</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-framework-bom</artifactId>
                <version>${spring-framework.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>
</project>

对于git,只需创建一个文件夹,在其中调用git init,并添加一个名为config-server.yml的文件,并使用描述的示例配置作为内容。

可以使用keytool生成密钥存储库,如Spring-Cloud-Config文档中所述(对于我的测试,我没有设置-secret)。

然后,您应该能够从IDE启动项目,并访问localhost:8888上的配置服务器。

步骤来再现问题

  1. 启动配置服务器
  2. curl localhost:8888/config-server/default -应该输出添加到git中的配置。
  3. 加密一个值:curl localhost:8888/encrypt -d test
  4. 将加密的值添加到config-server.yml (前缀为{cipher},并以单引号括起来)
  5. curl localhost:8888/config-server/default -应该输出解密后的值
  6. 重新启动配置服务器-错误失败
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-05 21:12:37

将密钥存储加密配置放在bootstrap.yml中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40580040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档