【问题标题】:Accessing Docker Vault secrets using Spring Cloud Starter Vault Config Could Not Resolve使用 Spring Cloud Starter Vault Config 访问 Docker Vault 机密无法解决
【发布时间】:2018-10-02 22:38:30
【问题描述】:

我在dev 模式下运行Docker Vault container,但我无法读取位于/secret/mobsters/ 的名为password 的秘密。

这里是Spring logs

运行vault kv get secret/mobsters 返回密码键值对。我也可以在本地访问 Vault 服务器。

这是我引用秘密的方式:

@Value("${password}")
String password;

@PostConstruct
private void postConstruct() {
    System.out.println("My password is: " + password);
}

Spring Cloud Vault 配置是使用bootstrap.yml 文件设置的:

spring.application.name: mobsters
spring.cloud.vault:
host: localhost
port: 8200
scheme: http
authentication: TOKEN
token: ...

我收到消息异常(完全异常here):

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'password' in value "${password}"`

来自保险柜用户界面:

【问题讨论】:

标签: docker spring-cloud spring-cloud-vault-config spring-vault


【解决方案1】:

在 HashiCorp Vault 0.10.0 中使用 Spring Vault/Spring Cloud Vault 不起作用,因为键/值后端安装时默认启用版本控制。这具有一定的意义,因为版本化的 API 已经完全改变并破坏了现有的客户端实现。上下文路径和响应结构不同。

你有两个选择:

  1. 使用较旧的 Vault 版本(例如 0.9.5)
  2. 尝试应对 API 更改,直到 Spring Cloud Vault 找到使用新 API 的方法。你需要:
    • 在您的引导配置中设置 spring.cloud.vault.generic.backend=secret/data
    • 为属性名称添加前缀data.,因此@Value("${hello.world}") 变为@Value("${data.hello.world}")

【讨论】:

  • 在我的例子中,我设置了 spring.cloud.config.server.vault.backend=secret/data 并在我的属性名称前加上“数据”。 ——有效!看起来我有 Vault v1.0.1
【解决方案2】:

看来有办法解决这个问题。

在您的bootstrap.yml 中,确保generic.enabled 为假,kv.enabled 为真。

spring:
  ...
  cloud.vault:
      ...
      kv.enabled: true
      generic.enabled: false

this answer on GitHub

这两者的主要区别在于 kv 注入数据 在上下文路径中分段并解开嵌套的数据响应。

如果你运行的是 2.0 之前的 [springboot] 版本,那么你需要实现一个 org.springframework.cloud.vault.config.VaultConfigurer bean 是 暴露于引导上下文。 SecretBackendConfigurer 接受一个 路径和一个在之前转换属性的 PropertyTransformer 将它们公开为 PropertySource。

【讨论】:

    猜你喜欢
    • 2020-07-22
    • 2023-01-20
    • 1970-01-01
    • 2020-11-04
    • 2020-08-27
    • 2018-01-12
    • 2018-05-21
    • 2018-07-25
    • 2017-06-23
    相关资源
    最近更新 更多