本指南将引导您完成使用过程弹簧穹顶生成从中加载机密的应用程序桥狮金库,一个机密管理工具。
您将构建的内容
您将加载存储在保管库中的密钥并使用传输加密后端。
你需要什么
- 约15分钟
- 最喜欢的文本编辑器或 IDE
- JDK 17或以后
- 格拉德尔 4+或梅文 3.2+
- 您也可以将代码直接导入到 IDE 中:
如何完成本指南
像大多数春天一样入门指南,您可以从头开始并完成每个步骤,也可以绕过您已经熟悉的基本设置步骤。无论哪种方式,您最终都会得到工作代码。
要从头开始,请继续使用 Gradle 构建.
要跳过基础知识,请执行以下操作:
- 下载并解压缩本指南的源存储库,或使用吉特:
git clone https://github.com/spring-guides/gs-accessing-vault.git
- 光盘成
gs-accessing-vault/initial
- 跳转到安装并启动桥公司保险库.
完成后,您可以根据 中的代码检查结果。gs-accessing-vault/complete
使用 Gradle 构建
使用 Maven 构建
使用 IDE 进行构建
安装并启动桥公司保险库
设置项目后,您可以安装和启动HashiCorp Vault。
如果您使用的是带有自制软件的Mac,则这很简单:
或者,从以下位置下载适用于您的操作系统的保险柜https://www.vaultproject.io/downloads.html:
$ https://releases.hashicorp.com/vault/1.12.2/vault_1.12.2_darwin_amd64.zip
$ unzip vault_1.12.2_darwin_amd64.zip
For other systems with package management, such as Redhat, Ubuntu, Debian, CentOS, and Windows, see instructions at https://www.vaultproject.io/docs/install/index.html.
After you install Vault, launch it in a console window. This command also starts up a server process.
$ vault server --dev --dev-root-token-id="00000000-0000-0000-0000-000000000000"
You should see the following as one of the last output lines:
[INFO ] core: post-unseal setup complete
上述命令使用内存中存储(不带传输加密)在开发模式下启动 Vault。这对于在本地评估保险柜很好。确保使用正确的 SSL 证书和可靠的存储后端以供生产使用。咨询保险柜生产硬化指南了解更多详情。 |
将机密存储在保管库中
保险柜是一个机密管理系统,允许您存储静态加密的敏感数据。非常适合存储敏感的配置详细信息,例如密码、加密密钥、API 密钥。
启动另一个控制台窗口,以使用 Vault 命令行将应用程序配置存储在 Vault 中。
首先,您需要设置两个环境变量,以将保管库 CLI 指向保管库终端节点并提供身份验证令牌。
$ export export VAULT_TOKEN="00000000-0000-0000-0000-000000000000"
$ export VAULT_ADDR="http://127.0.0.1:8200"
现在,您可以在保管库中存储配置键值对:
$ vault kv put secret/github github.oauth2.key=foobar
配置您的应用程序
在这里,您可以使用 配置应用程序。Spring Cloud Vault 配置了引导上下文。application.properties
src/main/resources/application.properties
spring.cloud.vault.token=00000000-0000-0000-0000-000000000000
spring.cloud.vault.scheme=http
创建应用程序类
在这里,您将创建一个包含所有组件的应用程序类。
src/main/java/hello/Application.java
package hello;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.vault.core.VaultKeyValueOperationsSupport.KeyValueBackend;
import org.springframework.vault.core.VaultSysOperations;
import org.springframework.vault.core.VaultTemplate;
import org.springframework.vault.core.VaultTransitOperations;
import org.springframework.vault.support.VaultMount;
import org.springframework.vault.support.VaultResponse;
@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
VaultResponse response = vaultTemplate
.opsForKeyValue("secret", KeyValueBackend.KV_2).get("github");
System.out.println("Value of github.oauth2.key");
System.out.println("-------------------------------");
System.out.println(response.getData().get("github.oauth2.key"));
System.out.println("-------------------------------");
System.out.println();
// Let's encrypt some data using the Transit backend.
VaultTransitOperations transitOperations = vaultTemplate.opsForTransit();
// We need to setup transit first (assuming you didn't set up it yet).
VaultSysOperations sysOperations = vaultTemplate.opsForSys();
if (!sysOperations.getMounts().containsKey("transit/")) {
sysOperations.mount("transit", VaultMount.create("transit"));
transitOperations.createKey("foo-key");
}
// Encrypt a plain-text value
String ciphertext = transitOperations.encrypt("foo-key", "Secure message");
System.out.println("Encrypted value");
System.out.println("-------------------------------");
System.out.println(ciphertext);
System.out.println("-------------------------------");
System.out.println();
// Decrypt
String plaintext = transitOperations.decrypt("foo-key", ciphertext);
System.out.println("Decrypted value");
System.out.println("-------------------------------");
System.out.println(plaintext);
System.out.println("-------------------------------");
System.out.println();
}
}
Spring Cloud Vault 用于与 Vault 交互。库中的属性将映射到以进行类型安全访问。 启用配置属性映射并注册 Bean。VaultOperations
MyConfiguration
@EnableConfigurationProperties(MyConfiguration.class)
MyConfiguration
Application
包括自动连接 的实例的方法。main()
MyConfiguration
构建可执行的 JAR
您可以使用 Gradle 或 Maven 从命令行运行应用程序。您还可以构建一个包含所有必需依赖项、类和资源的可执行 JAR 文件并运行该文件。通过构建可执行 jar,可以轻松地在整个开发生命周期中跨不同环境等将服务作为应用程序进行交付、版本控制和部署。
如果使用 Gradle,则可以使用 .或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:./gradlew bootRun
./gradlew build
java -jar build/libs/gs-accessing-vault-0.1.0.jar
如果使用 Maven,则可以使用 运行应用程序。或者,您可以使用 JAR 文件生成 JAR 文件,然后运行该文件,如下所示:./mvnw spring-boot:run
./mvnw clean package
java -jar target/gs-accessing-vault-0.1.0.jar
此处描述的步骤将创建一个可运行的 JAR。你也可以构建经典 WAR 文件. |
正如我们的实现一样,该方法在启动启动时自动调用。您应该看到如下所示的内容:Application
CommandLineRunner
run
Value of github.oauth2.key
-------------------------------
foobar
-------------------------------
Encrypted value
-------------------------------
vault:v1:2wgVE2PXiR9o55xbyur5KHJl8IwyGDkDU4l1SZScUq6BuqZYgTopwvc4
-------------------------------
Decrypted value
-------------------------------
Secure message
-------------------------------
与使用 URI 来识别文档的文档存储相比,Vault 的机密后端效果很好。文档基于 JSON,允许方便地对 Vault 数据进行对象映射。 |
总结
祝贺!您设置了一个 Vault 服务器并编写了一个简单的应用程序,该应用程序使用 Spring Vault 读取机密并使用强密码加密数据 - 所有这些都无需为实施密钥管理、密码模式和填充而头疼。