该版本仍在开发中,尚未被视为稳定。最新稳定版请使用Spring Vault 4.0.0spring-doc.cadn.net.cn

支持避难所的秘密引擎

Spring Vault 配备了多个扩展套件,以支持其各种秘密引擎。spring-doc.cadn.net.cn

具体来说,Spring Vault 附带的扩展内容包括:spring-doc.cadn.net.cn

你可以通过 的方法使用所有其他后端VaultTemplate直接(VaultTemplate.read(...),VaultTemplate.write(...)).spring-doc.cadn.net.cn

密钥值版本1(“无版本密钥”)

千伏secrets engine用于在配置的 Vault 物理存储中存储任意机密。spring-doc.cadn.net.cn

在运行千伏秘密引擎采用非版本化方式,只保留最近写入的密钥值。非版本化 kv 的好处是每个键的存储容量更小,因为不会存储额外的元数据或历史。此外,发送到后端的请求性能更高,因为存储调用更少,且每个请求不会被锁定。spring-doc.cadn.net.cn

Spring Vault 自带专用的键值 API,用于封装各个键值 API 实现之间的差异。保险库键值作遵循 Vault CLI 设计。这是 Vault 的主要命令行工具,提供以下命令Vault KV Get,金库KV卖权诸如此类。spring-doc.cadn.net.cn

您可以通过指定版本和挂载路径,将该API用于两个键值引擎版本。以下示例使用键值版本1:spring-doc.cadn.net.cn

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");

保险库键值作支持所有键值作,例如,获取,删除,列表.spring-doc.cadn.net.cn

或者,API也可以通过以下方式使用VaultTemplate由于其直接映射和简单使用,键和响应直接映射到输入和输出键。以下示例展示了在 的写入和读取秘密我的钥匙. 这千伏秘密引擎安装于秘密:spring-doc.cadn.net.cn

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 的更多详细信息。spring-doc.cadn.net.cn

Vault 决定了通过 Vault 的坐骑路径系统/内部/界面/挂载/......端点。确保你的策略允许访问该路径,否则你将无法使用键值 API。

密钥值版本2(“版本化秘密”)

你可以运行千伏秘密引擎有两个版本之一。本节解释了使用版本2的情况。当运行版本2时千伏后端密钥可以保留可配置的版本数量。你可以检索旧版本的元数据和数据。此外,你还可以使用检查与设置作,避免无意中覆盖数据。spring-doc.cadn.net.cn

类似于密钥值版本1(“未版本密钥”),Spring Vault 自带专用的密钥值 API,用于封装各个密钥值 API 实现之间的差异。Spring Vault 自带专用的密钥值 API,用于封装各个密钥值 API 实现之间的差异。保险库键值作遵循 Vault CLI 设计。这是 Vault 的主要命令行工具,提供以下命令Vault KV Get,金库KV卖权,依此类推。spring-doc.cadn.net.cn

您可以通过指定版本和挂载路径,将该API用于两个键值引擎版本。以下示例使用键值版本2:spring-doc.cadn.net.cn

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");

保险库键值作支持所有键值作,例如,获取,删除,列表.spring-doc.cadn.net.cn

你还可以交互版本控制的密钥值 API 的具体内容。如果你想获取某个特定秘密或需要访问元数据,这非常有用。spring-doc.cadn.net.cn

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 提供了不同的上下文路径和输入/输出表示方式。 具体来说,与实际秘密的交互需要对数据部分进行封装和展开,并引入数据/挂载与密钥之间的路径段。spring-doc.cadn.net.cn

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 的更多详细信息。spring-doc.cadn.net.cn

Vault 决定了通过 Vault 的坐骑路径系统/内部/界面/挂载/......端点。确保你的策略允许访问该路径,否则你将无法使用键值 API。

PKI(公钥基础设施)

PKISecrets Engine 通过实现证书授权中心作,代表证书的后端。spring-doc.cadn.net.cn

PKI 机密引擎生成动态的 X.509 证书。 借助该秘密引擎,服务无需经历通常的手动生成私钥和CSR、提交CA以及等待验证和签名流程的过程即可获得证书。 Vault 内置的认证和授权机制提供了验证功能。spring-doc.cadn.net.cn

Spring Vault 支持通过以下方式签发、签名、撤销证书和 CRL 检索VaultPkiOperations. 所有其他PKI功能都可以通过以下方式使用。金库运营.spring-doc.cadn.net.cn

以下示例简要说明如何签发和撤销证书:spring-doc.cadn.net.cn

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的更多详细信息。spring-doc.cadn.net.cn

Tokens认证后端

这个后端是一个认证后端,不与实际的秘密进行交互。 相反,它提供了访问Tokens管理权限。 你可以在认证方法章节中了解更多关于基于Tokens的认证spring-doc.cadn.net.cn

Tokens认证方法内置,并自动提供于/auth/Tokens. 它允许用户使用Tokens进行身份验证,也可以创建新Tokens、通过Tokens撤销秘密等。spring-doc.cadn.net.cn

当任何其他认证方法返回身份时,Vault 核心调用Tokens方法为该身份创建一个新的唯一Tokens。spring-doc.cadn.net.cn

你也可以用Tokens存储绕过其他认证方法。你可以直接创建Tokens,也可以对Tokens执行各种作,比如续期和撤销。spring-doc.cadn.net.cn

Spring Vault 利用该后端来续签和撤销由配置认证方法提供的会话Tokens。spring-doc.cadn.net.cn

以下示例展示了如何在应用内请求、续期和撤销VaultTokens:spring-doc.cadn.net.cn

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 的更多细节。spring-doc.cadn.net.cn

Transit 后端

传输机密引擎处理传输中数据的加密功能。 Vault 不会存储发送到该 secrets 引擎的数据。 它也可以被视为“密码学作为一项服务”或“加密作为一项服务”。 该中转机密引擎还可以签名和验证数据,生成数据的哈希和HMAC,并作为随机字节源。spring-doc.cadn.net.cn

传输的主要用例是加密应用数据,同时将加密数据存储在某个主要数据存储中。 这减轻了应用开发者在适当加密和解密上的负担,并将责任转嫁给了 Vault 的运营者。spring-doc.cadn.net.cn

Spring Vault 支持多种交通运营:spring-doc.cadn.net.cn

所有运营通过都围绕着钥匙展开。 Transit 引擎支持密钥的版本化以及多种密钥类型。 注意,密钥类型可能会限制作的使用范围。spring-doc.cadn.net.cn

以下示例展示了如何创建密钥以及如何加密和解密数据:spring-doc.cadn.net.cn

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 要将密文解密为明文,请调用解密方法。 它解密密文并返回字符串该函数通过默认字符集解码。

前面的例子使用简单的字符串进行密码学作。 虽然这是一种简单的方法,但存在字符集配置错误的风险,且不具备二进制安全。 当纯文本对图像、压缩数据或二进制数据结构等数据使用二进制表示时,二进制安全是必需的。spring-doc.cadn.net.cn

要加密和解密二进制数据,请使用明文密文可以保留二进制值的值对象:spring-doc.cadn.net.cn

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)
1 假设有密钥我的-艾斯-钥匙已经到位了,我们正在加密明文对象。 作为交换,加密方法返回密文对象。
2 密文对象可以直接用于解密,并返回明文对象。

明文密文带上一个上下文物品,VaultTransitContext. 它用于提供收敛加密的nonce值,以及用于密钥推导的上下文值。spring-doc.cadn.net.cn

Transit允许对明文进行签名,并验证该明文的签名。 符号作需要非对称密钥,通常使用椭圆曲线密码学(RSA)。spring-doc.cadn.net.cn

签名使用公私钥分割来确保真实性。签名
者使用其私钥创建签名。否则,任何人都可以以你的名义签署信息。 验证者使用公钥部分来验证签名。实际签名通常是哈希值。

内部,哈希值会被计算并使用私钥加密,以生成最终签名。验证过程解密签名消息,计算明文的哈希值,并比较两个哈希值以确认签名是否有效。
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)
1 签名需要非对称密钥。你可以使用任何椭圆曲线密码学或RSA密钥类型。一旦创建了密钥,你就具备了创建签名的所有前提条件。
2 签名会被创建为纯文本消息。归来者签名包含一个ASCII安全字符串,使用Base64字符。
3 验证签名时,验证需要签名对象和纯文本消息。作为返回值,你会得到签名是否有效。

您可以在Vault参考文档中找到关于Vault Transit后端的更多细节。spring-doc.cadn.net.cn