如何使用 java/spring 引导读取 Vault kv
How to read Vault kv with java/spring boot
我正在尝试弄清楚如何将 Hashicorp's Vault
与 spring 引导一起使用。
最初,我尝试遵循指南:
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.java
和 MyConfiguration.java
。起初,我 运行 没有 Vault 服务器 运行 的程序导致 connection refused
。
然后我启动了保险库服务器并从 CLI 输入用户名和密码。从日志中我可以看到它实际上进入了应用程序并写出 Here we goooo
@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();
但我无法从 Vault 检索任何数据 - 可能是由于 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 引擎输入的保险库中检索数据?
不要以开发者身份启动服务器,而是使用配置文件启动服务器。为此,您可以创建一个名为 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
最后在 bootstrap.yml 文件中添加保管库令牌
spring:
application.name: app-name
cloud.vault:
host: 127.0.0.1
port: 8200
authentication: TOKEN
token: your token
scheme: http
我在这个页面中偶然发现了一个注释:
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");
然后就成功了。
我认为这是由于 V1 与 V2 的问题。我在尝试遵循指南时遇到了类似的问题:
https://spring.io/guides/gs/accessing-vault/
我使用 Vault UI 创建了一个 V1 秘密引擎并添加了秘密,它成功了。
以下是步骤:
- 登录http://127.0.0.1:8200/,使用token方式登录,在向导中输入token(00000000-0000-0000-0000-000000000000)
- 在右上角,点击启用新引擎
- Select"KV",点击下一步
- 确保版本select为“1”,然后点击"Enable Engine"。(参考Vault_Secret_Engine_V1.png)
- 点击"Create secret"
- 输入"Path"、"Key"、"Value",然后点击保存
- 秘密将保存在路径"kv/github"(参考Vault_Key.png)
- 然后将代码更改为:
VaultResponseresponse=vaultTemplate.read("kv/github");
如果我在步骤 4 中将版本更改为 2,并保持所有其他步骤相同。我会得到和你一样的例外。
Vault_Secret_Engine_V1.png
Vault_Key.png
我遇到了同样的问题并将键值存储版本设置为 v1 解决了这个问题,正如@johnathan-wan 所建议的那样。
我唯一不同的是通过命令行设置 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
我确认在使用 Key-Value (kv) 引擎时是 V1 与 V2 问题。
这是两个版本的代码示例:
VaultEndpoint endpoint = VaultEndpoint.from(new URI(
"https://my-cluster.smth.hashicorp.cloud:8200"));
VaultTemplate template = new VaultTemplate(endpoint, new TokenAuthentication(token));
// Path kv_version1 uses kv engine version 1
// It must be accessed directly with VaultTemplate
System.out.println(template.read("admin/kv_version1/my-name").getData().get("password"));
// Path kv_version2 uses kv engine version 1
// It must be accessed with VaultVersionedKeyValueTemplate
VaultVersionedKeyValueTemplate kvTemplate =
new VaultVersionedKeyValueTemplate(template, "admin/kv_version2");
System.out.println(kvTemplate.get("my-name").getData().get("password"));
我正在尝试弄清楚如何将 Hashicorp's Vault
与 spring 引导一起使用。
最初,我尝试遵循指南:
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.java
和 MyConfiguration.java
。起初,我 运行 没有 Vault 服务器 运行 的程序导致 connection refused
。
然后我启动了保险库服务器并从 CLI 输入用户名和密码。从日志中我可以看到它实际上进入了应用程序并写出 Here we goooo
@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();
但我无法从 Vault 检索任何数据 - 可能是由于 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 引擎输入的保险库中检索数据?
不要以开发者身份启动服务器,而是使用配置文件启动服务器。为此,您可以创建一个名为 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
最后在 bootstrap.yml 文件中添加保管库令牌
spring:
application.name: app-name
cloud.vault:
host: 127.0.0.1
port: 8200
authentication: TOKEN
token: your token
scheme: http
我在这个页面中偶然发现了一个注释: 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");
然后就成功了。
我认为这是由于 V1 与 V2 的问题。我在尝试遵循指南时遇到了类似的问题: https://spring.io/guides/gs/accessing-vault/
我使用 Vault UI 创建了一个 V1 秘密引擎并添加了秘密,它成功了。 以下是步骤:
- 登录http://127.0.0.1:8200/,使用token方式登录,在向导中输入token(00000000-0000-0000-0000-000000000000)
- 在右上角,点击启用新引擎
- Select"KV",点击下一步
- 确保版本select为“1”,然后点击"Enable Engine"。(参考Vault_Secret_Engine_V1.png)
- 点击"Create secret"
- 输入"Path"、"Key"、"Value",然后点击保存
- 秘密将保存在路径"kv/github"(参考Vault_Key.png)
- 然后将代码更改为:
VaultResponseresponse=vaultTemplate.read("kv/github");
如果我在步骤 4 中将版本更改为 2,并保持所有其他步骤相同。我会得到和你一样的例外。
Vault_Secret_Engine_V1.png
Vault_Key.png
我遇到了同样的问题并将键值存储版本设置为 v1 解决了这个问题,正如@johnathan-wan 所建议的那样。
我唯一不同的是通过命令行设置 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
我确认在使用 Key-Value (kv) 引擎时是 V1 与 V2 问题。
这是两个版本的代码示例:
VaultEndpoint endpoint = VaultEndpoint.from(new URI(
"https://my-cluster.smth.hashicorp.cloud:8200"));
VaultTemplate template = new VaultTemplate(endpoint, new TokenAuthentication(token));
// Path kv_version1 uses kv engine version 1
// It must be accessed directly with VaultTemplate
System.out.println(template.read("admin/kv_version1/my-name").getData().get("password"));
// Path kv_version2 uses kv engine version 1
// It must be accessed with VaultVersionedKeyValueTemplate
VaultVersionedKeyValueTemplate kvTemplate =
new VaultVersionedKeyValueTemplate(template, "admin/kv_version2");
System.out.println(kvTemplate.get("my-name").getData().get("password"));