7

我正在研究如何使用 Vault 0.11.1 和 Spring Vault 2.0.2.RELEASE。我已经建立了一个开发保险库:

vault server -dev

并添加了一些数据

vault kv put secret/certs/jan cert=ABCD

我可以用 Spring Vault 阅读

      @Autowired
      private VaultOperations operations;

            String path = "secret/data/certs/jan";
            System.out.println(operations.read(path).getData());

请注意,奇怪的是,我必须在路径中插入“data/”才能再次找到它。

删除数据也可以正常工作:

            operations.delete(path);

但是用

            Secret secret = new Secret("ABCD");
            operations.write(path, secret);

失败了

org.springframework.vault.VaultException: Status 400 secret/data/certs/jan: no data provided

Secret 是一个简单的 bean:

@AllArgsConstructor
@NoArgsConstructor
@Data
public class Secret {
    String cert;
}

并且 jason 转换似乎很顺利:

DEBUG org.springframework.web.client.RestTemplate - Writing [Secret(cert=ABCD)] using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@add0edd]

只是试图写一个字符串

            operations.write(path, "foo=bar");

也失败了:

Status 400 secret/data/certs/jan: failed to parse JSON input: invalid character 'o' in literal false (expecting 'a')
4

1 回答 1

16

看起来您正在使用 Vault 的版本化键值对后端。Vault 0.10 和更新版本的新实例默认安装版本化后端,secret/这需要您使用特定的 API。

未版本化 (v1) 和版本化 (v2) 键值后端之间存在细微的 API 差异,它们向上下文路径和实际 JSON 有效负载添加了额外的元素。

Key-Value 后端 v1 的示例:

POST /v1/secret/certs/jan

{"key":"value"}

Key-Value 后端 v2 的示例:

POST /v1/secret/data/certs/jan

{"data":{"key":"value"}}

对于使用 Spring Vault,这意味着您需要升级到 2.1.0 版本并使用VaultKeyValueOperationsAPI:

VaultKeyValueOperations keyValue = vaultOperations.opsForKeyValue("secret", KeyValueBackend.versioned());
keyValue.put("certs/jan", secret);
于 2018-10-02T09:08:34.390 回答