java - 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 类似的东西。
解决方案
在与配置进行了很多斗争之后。我尝试在我的 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”键成功了
推荐阅读
- spring-boot - com.couchbase.client.core.endpoint.kv.AuthenticationException:Select Bucket 命令上的身份验证失败
- printing - 如何防止第二页打印颠倒?
- python - 为什么熊猫会违反自己的警告?
- python - 使用pandas按列分组,然后根据条件新建一列
- android - Android Studio上的gradle项目同步失败错误
- c# - 如何处理 Controller 的 Initialize 方法抛出的异常?
- tensorflow - LSTM 或任何其他层的 TimeDistributed 包装器有什么用途
- assertion - 如何在 Junit 中使用 Assert array Equals 比较 2 个对象数组
- php - 更改会话目录 PHP
- python - 为 n 维数组推广 Cython 代码