如何使用Java / Spring Boot读取Vault kv

时间:2018-08-30 15:22:31

标签: spring-boot hashicorp-vault

我正在尝试弄清楚如何在弹簧启动中使用Hashicorp's Vault

最初,我尝试遵循该指南:

https://spring.io/guides/gs/vault-config/#scratch

但是由于api更改,我在Vault CLI中使用了以下命令:

vault kv put secret/gs-vault-config example.username=demouser example.password=demopassword

保存了这两个文件,我可以使用以下命令将其检索

vault kv get secret/gs-vault-config

然后,按照指南中的说明创建了Application.javaMyConfiguration.java。首先,我在没有运行Vault服务器的情况下运行了该程序,这导致connection refused。 然后,我启动了Vault服务器,并从CLI输入了用户名和密码。从日志中,我可以看到它实际上进入了应用程序并写出我们在这里

@SpringBootApplication
public class Application implements CommandLineRunner {

@Autowired
private VaultTemplate vaultTemplate;

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

@Override
public void run(String... strings) throws Exception {

    // You usually would not print a secret to stdout
    System.out.println("Here we gooooo");
    VaultResponse response = vaultTemplate.read("secret/gs-vault-config");
    System.out.println("Value of username");
    System.out.println("-------------------------------");
    System.out.println(response.getData().get("example.username"));
    System.out.println("-------------------------------");
    System.out.println();

但是我无法从保险柜中检索任何数据-可能是由于V1与V2问题

2018-08-30 17:10:07.375 ERROR 21582 --- [           main] o.s.boot.SpringApplication               : Application run failed

java.lang.IllegalStateException: Failed to execute CommandLineRunner
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:800) [spring-boot-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
    at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:781) [spring-boot-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:335) [spring-boot-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255) [spring-boot-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243) [spring-boot-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
    at hello.Application.main(Application.java:23) [classes!/:na]
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181]
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181]
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
    at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48) [gs-vault-config-0.1.0.jar:na]
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87) [gs-vault-config-0.1.0.jar:na]
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:50) [gs-vault-config-0.1.0.jar:na]
    at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51) [gs-vault-config-0.1.0.jar:na]
Caused by: java.lang.NullPointerException: null
    at hello.Application.run(Application.java:34) [classes!/:na]
    at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:797) [spring-boot-2.0.3.RELEASE.jar!/:2.0.3.RELEASE]
    ... 13 common frames omitted

有人知道spring-boot代码段是否有类似的指南,该代码段是从kv引擎输入的,从库中检索数据的吗?

4 个答案:

答案 0 :(得分:1)

代替使用dev启动服务器,而是使用配置文件启动服务器。为此,您可以创建一个名为vault.json的json文件并添加以下代码。

ui = true

listener "tcp" {
  address          = "0.0.0.0:8200"
  cluster_address  = "192.168.56.1:8201"
  tls_disable      = "true"
}
storage "file" {
  path = "data"
}


api_addr = "http://192.168.56.1:8200"
cluster_addr = "https://192.168.56.1:8201"

要运行代码,您可以使用

$vault server -config=vault.json

最后将Vault令牌添加到bootstrap.yml文件中

spring:
    application.name: app-name
    cloud.vault:
        host: 127.0.0.1
        port: 8200
        authentication: TOKEN
        token:  your token
        scheme: http

答案 1 :(得分:1)

我在本页中偶然发现了一个音符: https://cloud.spring.io/spring-cloud-vault/multi/multi_vault.config.backends.html

我在其中说: Spring Cloud Vault在安装路径和实际上下文路径之间添加数据/上下文

所以我试图将代码更改为:

VaultResponse response = vaultTemplate.read("/secret/data/gs-vault-config");

然后它起作用了。

答案 2 :(得分:1)

我遇到了同样的问题,并按照@ johnathan-wan的建议解决了将键值存储版本设置为v1的问题。

我唯一不同的是通过命令行设置了kv商店版本,如下所示:

# first, check if you already have a v2 keystore for that path
vault secrets list -detailed
# if you already have a v2 of secret/gs-vault-config, then:
vault secrets disable secret/gs-vault-config

# create a new version 1 keystore for that path
vault secrets enable -path secret/gs-vault-config -version 1 kv

在遵循以下示例之后,我发现: https://github.com/mp911de/spring-cloud-vault-config-samples

答案 3 :(得分:0)

我认为这是由于V1 vs V2问题引起的。在尝试以下指南时,我遇到了类似的问题: https://spring.io/guides/gs/accessing-vault/

我使用Vault UI创建了一个 V1 机密引擎,并添加了机密,它可以正常工作。 步骤如下:

  1. 登录http://127.0.0.1:8200/,使用令牌方法登录,然后在指南中输入令牌(00000000-0000-0000-0000-000000000000)
  2. 在右上角,点击启用新引擎
  3. 选择“ KV”,然后单击下一步
  4. 确保在版本中选择“ 1”,然后单击“启用引擎”。(请参阅Vault_Secret_Engine_V1.png)
  5. 点击“创建秘密”
  6. 输入“路径”,“键”和“值”,然后单击“保存”
  7. 秘密将通过路径“ kv / github”保存(请参阅Vault_Key.png)
  8. 然后将代码更改为:
  

VaultResponseresponse = vaultTemplate.read(“ kv / github”);

如果在步骤4中将“版本”更改为2,并保持所有其他步骤不变。我会和你一样例外。

Vault_Secret_Engine_V1.png

Vault_Key.png