首页 > 解决方案 > Spring 云服务器未从 Vault 后端访问所有配置文件

问题描述

我是 HashiCorp Vault 的新手,并设置了 Spring Cloud 配置服务器,将 Vault 作为后端来存储机密、密钥等。

问题是我能够访问以默认级别存储的机密,例如:

curl -X "GET" "http://localhost:8888/myapp/default" -H "X-Config-Token: XXX"

但是,我无法访问我存储在 Vault 中的配置文件特定机密。无论我将秘密存储在哪个配置文件中,API 始终返回默认值而不是配置文件特定值。

例如:

curl -X "GET" "http://localhost:8888/myapp/prod" -H "X-Config-Token: XXX"

这是我存储在 Vault 开发实例(版本 1.1.3)上的秘密:

1. vault kv put secret/myapp foo=myappsdefault
2. vault kv put secret/myapp/prod foo=myappsprod

Spring Cloud 配置服务器 application.yml:

spring:
  profiles:
    active: vault
  cloud.config.server.vault.kvVersion: 2
server:
  port: 8888

Spring云服务器pom.xml:

            <parent>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-parent</artifactId>
                <version>2.0.6.RELEASE</version>
                <relativePath/>
            </parent>

            <properties>
                <spring-cloud.version>Finchley.SR2</spring-cloud.version>
            </properties>

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

                <dependency>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-test</artifactId>
                    <scope>test</scope>
                </dependency>
            </dependencies>    

预期的:

curl -X "GET" "http://localhost:8888/myapp/prod" -H "X-Config-Token: XXX"

{
"name": "myapp",
"profiles": [
  "prod"
],
"label": null,
"version": null,
"state": null,
"propertySources": [
  {
"name": "vault:myapp",
"source": {
"foo": "myappsprod"
}
}
],
}

实际的:

{
"name": "myapp",
"profiles": [
  "prod"
],
"label": null,
"version": null,
"state": null,
"propertySources": [
  {
"name": "vault:myapp",
"source": {
"foo": "myappsdefault"
}
}
],
}

以下是保险库输出:

vault kv get secret/myapp/prod


=== Data ===
Key    Value
---    -----
foo    myappsprod


vault kv get secret/myapp

=== Data ===
Key    Value
---    -----
foo    myappsdefault

那么问题就变成了为什么 spring 云服务器只查询默认配置文件机密而不是特定于环境?

顺便说一句,配置文件被应用于我存储在 repo 中的 GIT 文件,同时将 spring 云服务器与 GIT 集成为后端,我期待与 Vault 类似的东西。

标签: javaspringspring-cloudhashicorp-vault

解决方案


在与配置进行了很多斗争之后。我尝试在我的 application.yml 中添加其他属性,这对我来说很有帮助。

application.yml 的快照:

server:
  port: 8888

spring:
  profiles:
    active: vault
  cloud:
    config:
      server:
        vault:
          port: 8200
          host: 127.0.0.1
          kvVersion: 1
          backend: kv
          profileSeparator: /
          #skipSslValidation: true
          #defaultKey: signing

management:
  endpoints:
    web:
      exposure:
        include: '*'

额外的事情是:1.我将后端从秘密更改为kv(我的自定义秘密引擎)2.配置文件分隔符为/(在.yml中使用/)

在我的情况下,“profileSeparator”键成功了


推荐阅读