|
该版本仍在开发中,尚未被视为稳定。最新稳定版请使用Spring Vault 4.0.0! |
支持避难所的秘密引擎
Spring Vault 配备了多个扩展套件,以支持其各种秘密引擎。
具体来说,Spring Vault 附带的扩展内容包括:
-
变换(企业功能)
-
系统后端
你可以通过 的方法使用所有其他后端VaultTemplate直接(VaultTemplate.read(...),VaultTemplate.write(...)).
密钥值版本1(“无版本密钥”)
这千伏secrets engine用于在配置的 Vault 物理存储中存储任意机密。
在运行千伏秘密引擎采用非版本化方式,只保留最近写入的密钥值。非版本化 kv 的好处是每个键的存储容量更小,因为不会存储额外的元数据或历史。此外,发送到后端的请求性能更高,因为存储调用更少,且每个请求不会被锁定。
Spring Vault 自带专用的键值 API,用于封装各个键值 API 实现之间的差异。保险库键值作遵循 Vault CLI 设计。这是 Vault 的主要命令行工具,提供以下命令Vault KV Get,金库KV卖权诸如此类。
您可以通过指定版本和挂载路径,将该API用于两个键值引擎版本。以下示例使用键值版本1:
VaultOperations operations = new VaultTemplate(new VaultEndpoint());
VaultKeyValueOperations keyValueOperations = operations.opsForKeyValue("secret",
VaultKeyValueOperationsSupport.KeyValueBackend.KV_1);
keyValueOperations.put("elvis", Collections.singletonMap("password", "409-52-2002"));
VaultResponse read = keyValueOperations.get("elvis");
read.getRequiredData().get("social-security-number");
保险库键值作支持所有键值作,例如放,获取,删除,列表.
或者,API也可以通过以下方式使用VaultTemplate由于其直接映射和简单使用,键和响应直接映射到输入和输出键。以下示例展示了在 的写入和读取秘密我的钥匙. 这千伏秘密引擎安装于秘密:
VaultOperations operations = new VaultTemplate(new VaultEndpoint());
operations.write("secret/elvis", Collections.singletonMap("social-security-number", "409-52-2002"));
VaultResponse read = operations.read("secret/elvis");
read.getRequiredData().get("social-security-number");
您可以在 Vault 参考文档中找到关于 Vault Key-Value 版本 1 API 的更多详细信息。
Vault 决定了通过 Vault 的坐骑路径系统/内部/界面/挂载/......端点。确保你的策略允许访问该路径,否则你将无法使用键值 API。 |
密钥值版本2(“版本化秘密”)
你可以运行千伏秘密引擎有两个版本之一。本节解释了使用版本2的情况。当运行版本2时千伏后端密钥可以保留可配置的版本数量。你可以检索旧版本的元数据和数据。此外,你还可以使用检查与设置作,避免无意中覆盖数据。
类似于密钥值版本1(“未版本密钥”),Spring Vault 自带专用的密钥值 API,用于封装各个密钥值 API 实现之间的差异。Spring Vault 自带专用的密钥值 API,用于封装各个密钥值 API 实现之间的差异。保险库键值作遵循 Vault CLI 设计。这是 Vault 的主要命令行工具,提供以下命令Vault KV Get,金库KV卖权,依此类推。
您可以通过指定版本和挂载路径,将该API用于两个键值引擎版本。以下示例使用键值版本2:
VaultOperations operations = new VaultTemplate(new VaultEndpoint());
VaultKeyValueOperations keyValueOperations = operations.opsForKeyValue("secret",
VaultKeyValueOperationsSupport.KeyValueBackend.KV_2);
keyValueOperations.put("elvis", Collections.singletonMap("social-security-number", "409-52-2002"));
VaultResponse read = keyValueOperations.get("elvis");
read.getRequiredData().get("social-security-number");
保险库键值作支持所有键值作,例如放,获取,删除,列表.
你还可以交互版本控制的密钥值 API 的具体内容。如果你想获取某个特定秘密或需要访问元数据,这非常有用。
VaultOperations operations = new VaultTemplate(new VaultEndpoint());
VaultVersionedKeyValueOperations versionedOperations = operations.opsForVersionedKeyValue("secret");
Versioned.Metadata metadata = versionedOperations.put("elvis", (1)
Collections.singletonMap("social-security-number", "409-52-2002"));
Version version = metadata.getVersion(); (2)
Versioned<Object> ssn = versionedOperations.get("elvis", Version.from(42)); (3)
Versioned<SocialSecurityNumber> mappedSsn = versionedOperations.get("elvis", (4)
Version.from(42), SocialSecurityNumber.class);
Versioned<Map<String,String>> versioned = Versioned.create(Collections (5)
.singletonMap("social-security-number", "409-52-2002"),
Version.from(42));
versionedOperations.put("elvis", version);
| 1 | 商店秘密猫 王在秘密/安装。 |
| 2 | 在版本化后端存储数据会返回元数据,如版本号。 |
| 3 | 版本化的键值API允许检索通过版本号识别的特定版本。 |
| 4 | 版本控制的密钥-值秘密可以映射到值对象中。 |
| 5 | 在使用 CAS 更新版本化秘密时,输入必须指向之前获得的版本。 |
在使用千伏V2 Secrets 引擎通过VaultTemplate有可能。
这并不是最方便的方法,因为 API 提供了不同的上下文路径和输入/输出表示方式。
具体来说,与实际秘密的交互需要对数据部分进行封装和展开,并引入数据/挂载与密钥之间的路径段。
VaultOperations operations = new VaultTemplate(new VaultEndpoint());
operations.write("secret/data/elvis", Collections.singletonMap("data",
Collections.singletonMap("social-security-number", "409-52-2002")));
VaultResponse read = operations.read("secret/data/ykey");
Map<String,String> data = (Map<String, String>) read.getRequiredData().get("data");
data.get("social-security-number");
您可以在 Vault 参考文档中找到关于 Vault Key-Value 版本 2 API 的更多详细信息。
Vault 决定了通过 Vault 的坐骑路径系统/内部/界面/挂载/......端点。确保你的策略允许访问该路径,否则你将无法使用键值 API。 |
PKI(公钥基础设施)
这PKISecrets Engine 通过实现证书授权中心作,代表证书的后端。
PKI 机密引擎生成动态的 X.509 证书。 借助该秘密引擎,服务无需经历通常的手动生成私钥和CSR、提交CA以及等待验证和签名流程的过程即可获得证书。 Vault 内置的认证和授权机制提供了验证功能。
Spring Vault 支持通过以下方式签发、签名、撤销证书和 CRL 检索VaultPkiOperations.
所有其他PKI功能都可以通过以下方式使用。金库运营.
以下示例简要说明如何签发和撤销证书:
VaultOperations operations = new VaultTemplate(new VaultEndpoint());
VaultPkiOperations pkiOperations = operations.opsForPki("pki");
VaultCertificateRequest request = VaultCertificateRequest.builder() (1)
.ttl(Duration.ofHours(48))
.altNames(Arrays.asList("prod.dc-1.example.com", "prod.dc-2.example.com"))
.withIpSubjectAltName("1.2.3.4")
.commonName("hello.example.com")
.build();
VaultCertificateResponse response = pkiOperations.issueCertificate("production", request); (2)
CertificateBundle certificateBundle = response.getRequiredData();
KeyStore keyStore = certificateBundle.createKeyStore("my-keystore"); (3)
KeySpec privateKey = certificateBundle.getPrivateKeySpec(); (4)
X509Certificate certificate = certificateBundle.getX509Certificate();
X509Certificate caCertificate = certificateBundle.getX509IssuerCertificate();
pkiOperations.revoke(certificateBundle.getSerialNumber()); (5)
| 1 | 通过使用VaultCertificateRequest架构工人。 |
| 2 | 向Vault申请证书。
Vault 作为证书授权中心,并响应一份签名的 X.509 证书。
实际的回应是证书捆绑包. |
| 3 | 你可以直接获得生成的 Java KeyStore 证书,其中包含公钥和私钥以及发行方证书。KeyStore 用途广泛,因此该格式适合配置(例如 HTTP 客户端、数据库驱动程序或 SSL 保护的 HTTP 服务器)。 |
| 4 | 证书捆绑包允许通过 Java 加密扩展 API 直接访问私钥以及公证书和发行者证书。 |
| 5 | 一旦证书不再使用(或被盗),你可以通过其序列号撤销。 Vault 在其 CRL 中包含被吊销的证书。 |
您可以在Vault参考文档中找到关于Vault PKI秘密API的更多详细信息。
Tokens认证后端
这个后端是一个认证后端,不与实际的秘密进行交互。 相反,它提供了访问Tokens管理权限。 你可以在认证方法章节中了解更多关于基于Tokens的认证。
这Tokens认证方法内置,并自动提供于/auth/Tokens.
它允许用户使用Tokens进行身份验证,也可以创建新Tokens、通过Tokens撤销秘密等。
当任何其他认证方法返回身份时,Vault 核心调用Tokens方法为该身份创建一个新的唯一Tokens。
你也可以用Tokens存储绕过其他认证方法。你可以直接创建Tokens,也可以对Tokens执行各种作,比如续期和撤销。
Spring Vault 利用该后端来续签和撤销由配置认证方法提供的会话Tokens。
以下示例展示了如何在应用内请求、续期和撤销VaultTokens:
VaultOperations operations = new VaultTemplate(new VaultEndpoint());
VaultTokenOperations tokenOperations = operations.opsForToken();
VaultTokenResponse tokenResponse = tokenOperations.create(); (1)
VaultToken justAToken = tokenResponse.getToken();
VaultTokenRequest tokenRequest = VaultTokenRequest.builder().withPolicy("policy-for-myapp")
.displayName("Access tokens for myapp")
.renewable()
.ttl(Duration.ofHours(1))
.build();
VaultTokenResponse appTokenResponse = tokenOperations.create(tokenRequest); (2)
VaultToken appToken = appTokenResponse.getToken();
tokenOperations.renew(appToken); (3)
tokenOperations.revoke(appToken); (4)
| 1 | 通过应用角色默认设置创建Tokens。 |
| 2 | 通过构建器 API,你可以为Tokens请求定义细粒度设置。
请求Tokens返回VaultToken(金库Tokens),作为金库Tokens的值对象。 |
| 3 | 你可以通过Token API续期Tokens。通常,这由会话管理器用于跟踪 Vault 会话Tokens。 |
| 4 | 如果需要,可以通过TokensAPI撤销Tokens。通常,这由会话管理器用于跟踪 Vault 会话Tokens。 |
您可以在 Vault 参考文档中找到关于 Vault Tokens认证方法 API 的更多细节。
Transit 后端
传输机密引擎处理传输中数据的加密功能。 Vault 不会存储发送到该 secrets 引擎的数据。 它也可以被视为“密码学作为一项服务”或“加密作为一项服务”。 该中转机密引擎还可以签名和验证数据,生成数据的哈希和HMAC,并作为随机字节源。
传输的主要用例是加密应用数据,同时将加密数据存储在某个主要数据存储中。 这减轻了应用开发者在适当加密和解密上的负担,并将责任转嫁给了 Vault 的运营者。
Spring Vault 支持多种交通运营:
-
密钥创建
-
密钥重配置
-
加密/解密/重封装
-
HMAC计算
-
签名与签名验证
所有运营通过都围绕着钥匙展开。
Transit 引擎支持密钥的版本化以及多种密钥类型。
注意,密钥类型可能会限制作的使用范围。
以下示例展示了如何创建密钥以及如何加密和解密数据:
VaultOperations operations = new VaultTemplate(new VaultEndpoint());
VaultTransitOperations transitOperations = operations.opsForTransit("transit");
transitOperations.createKey("my-aes-key", VaultTransitKeyCreationRequest.ofKeyType("aes128-gcm96")); (1)
String ciphertext = transitOperations.encrypt("my-aes-key", "plaintext to encrypt"); (2)
String plaintext = transitOperations.decrypt("my-aes-key", ciphertext); (3)
| 1 | 首先,我们需要一把钥匙。
每个键都需要指定类型。AES128-GCM96支持加密、解密、密钥派生和收敛加密,本例中需要加密与解密。 |
| 2 | 接下来,我们对 a 进行加密字符串其中包含应加密的纯文本。
输入字符串使用默认字符集将字符串编码为其二进制表示。
请求Tokens返回VaultToken(金库Tokens),作为金库Tokens的值对象。
这加密方法返回 Base64 编码密文,通常以库:. |
| 3 | 要将密文解密为明文,请调用解密方法。
它解密密文并返回字符串该函数通过默认字符集解码。 |
前面的例子使用简单的字符串进行密码学作。 虽然这是一种简单的方法,但存在字符集配置错误的风险,且不具备二进制安全。 当纯文本对图像、压缩数据或二进制数据结构等数据使用二进制表示时,二进制安全是必需的。
byte [] plaintext = "plaintext to encrypt".getBytes();
Ciphertext ciphertext = transitOperations.encrypt("my-aes-key", Plaintext.of(plaintext)); (1)
Plaintext decrypttedPlaintext = transitOperations.decrypt("my-aes-key", ciphertext); (2)
明文和密文带上一个上下文物品,VaultTransitContext.
它用于提供收敛加密的nonce值,以及用于密钥推导的上下文值。
Transit允许对明文进行签名,并验证该明文的签名。 符号作需要非对称密钥,通常使用椭圆曲线密码学(RSA)。
| 签名使用公私钥分割来确保真实性。签名 者使用其私钥创建签名。否则,任何人都可以以你的名义签署信息。 验证者使用公钥部分来验证签名。实际签名通常是哈希值。 内部,哈希值会被计算并使用私钥加密,以生成最终签名。验证过程解密签名消息,计算明文的哈希值,并比较两个哈希值以确认签名是否有效。 |
byte [] plaintext = "plaintext to sign".getBytes();
transitOperations.createKey("my-ed25519-key", VaultTransitKeyCreationRequest.ofKeyType("ed25519")); (1)
Signature signature = transitOperations.sign("my-ed25519-key", Plaintext.of(plaintext)); (2)
boolean valid = transitOperations.verify("my-ed25519-key", Plaintext.of(plaintext), signature); (3)
您可以在Vault参考文档中找到关于Vault Transit后端的更多细节。