接下来,我们进行了一些配置。我们学习了如何运行 Vault 服务器、配置根 CA 以及设置中间 CA。然后,我们探讨了 Vault Agent、其重要性以及如何配置和运行它来颁发证书。
最后,我们创建了一个 Spring Boot 应用程序并将其配置为热重新加载证书。
SSL证书
应用程序和设备使用SSL证书来保护连接。它们有助于保护服务器和客户端之间的通信。这些证书有到期时间,需要更换。
手动进行替换非常耗时,并且可能导致停机或糟糕的用户体验。在本文中,我们将学习如何热重载它们。我们将在 Spring Boot 应用程序中使用 HashiCorp Vault执行此操作。
SSL代表安全套接字层,这是一种在 Web 服务器和 Web 浏览器之间创建加密链接的安全协议。
SSL 证书是一种数字证书,用于验证网站或服务器的身份并建立加密连接。此证书包含颁发机构名称、收件人、公钥、到期日期等信息,以及用于验证网站或服务器真实性的其他详细信息。
在本文中,当我们使用“证书”一词时,我们指的是 SSL 证书。
X.509 证书
X.509是定义数字证书的标准之一。它是互联网上最常用的标准。它包含网站或服务器的身份和公钥,由证书颁发机构签名或自签名。
根 CA
在 SSL 领域,有少数机构受到广泛信任并颁发证书。这些机构称为根 CA(证书颁发机构),例如 GeoTrust、DigiCert 等。它们颁发的证书称为根证书。操作系统和浏览器识别这些受信任的根 CA,允许它们验证其他证书。该系统确保用户可以安全地连接到网站并验证其身份。
中间 CA
直接公开根 CA 证书可能会带来某些安全问题。为了缓解这种情况,我们创建了一个中间 CA(证书颁发机构),作为根 CA 和最终用户证书之间的纽带。我们可以根据需要创建任意数量的中间 CA。每个中间 CA 都代表其父 CA 颁发证书,从而创建信任链,而无需直接公开根 CA 的私钥。
此设置可确保根 CA 安全,同时允许中间 CA 验证和颁发证书,从而增强安全性。浏览器和设备依靠此信任链来确保与网站和服务的安全连接。
HashiCorp 安全库
Vault是一种安全存储和访问敏感信息(如令牌、密码、密钥、数字证书等)的工具。HashiCorp 是一家拥有许多产品的公司,Vault 就是其中一款产品。它可以存储机密、轮换机密、加密数据,还可以颁发证书。
PKI 机密引擎
在 HashiCorp Vault 中,我们使用 PKI机密引擎来生成动态 X.509 证书。借助此机密引擎,服务无需经过通常的手动流程(生成私钥和 CSR、提交给 CA 并等待验证和签名过程完成)即可获得证书。
库代理
它是一个客户端守护进程,用于与 Vault 服务器通信并请求颁发证书。我们可以配置它定期在特定目录中生成证书。借助 Vault Agent,我们将实现证书的热重载。
到目前为止,我们已经了解了一些与 SSL 世界和 HashiCorp Vault 相关的基本概念。现在,让我们了解这些组件如何协同工作,以使我们的 Spring Boot 应用程序能够热重新加载 HashiCorp Vault 颁发的证书。
简而言之,我们将允许应用程序在证书过期后从配置的目录中重新加载证书。Vault Agent 是一个单独的进程,它会定期请求 Vault 服务器颁发证书,然后将其写入目录。
配置 Vault 服务器
我们已经看到,使用中间 CA 比使用根 CA 更好。在本节中,我们将设置 Vault 服务器,配置根 CA,然后配置中间 CA。
1. 在 Vault 服务器中配置根 CA
首先,按照本指南安装 Vault,并通过运行vault -v命令来验证其版本。
现在逐个运行这些命令来设置根 CA:
vault server -dev -dev-root-token-id=root |
在这里,我们以开发模式启动 Vault 服务器。默认情况下,它在localhost:8200上运行。我们已将root设置为令牌。我们还可以从浏览器访问localhost:8200上的 Vault 服务器的 GUI。
我们正在导出地址和令牌,它将在后续命令中使用。我们正在启用 路径/pki处的 PKI 机密引擎来颁发有效期最长为 24 小时的证书。
我们还指定了 CRL 位置和颁发证书的位置。最后,创建一个名为localhost-12 的角色,该角色可以颁发最长有效期为 12 小时的根证书。
2.在Vault 服务器 中配置中间 CA
就像上面的部分一样,我们将运行一些命令来设置中间 CA:
vault secrets enable -path=pki-int pki |
这里我们在路径/pki-int 启用了另一个 PKI 脚本引擎,其最大有效时间为 12 小时。
然后,我们生成中间证书签名请求并保存在文件pki-intermediate.csr中。使用此签名请求,使用我们的根 CA 对其进行签名。此后,我们将中间证书颁发机构签名证书设置为根签名证书。
最后,我们创建一个角色localhost-3 来颁发 3 小时后过期的证书。
现在,我们的中级证书颁发机构已配置完毕。我们可以使用以下命令对其进行测试:
vault write pki-int/issue/localhost-3 common_name="localhost" ttl=1h |
此命令应在终端上生成有效期为 1 小时的证书。
这是生成证书的手动方式。为了自动从中级 CA 生成证书,我们将使用 Vault Agent。
配置Vault代理
要使用中间 CA,我们将策略与角色localhost-3绑定,以便它可以使用 PKI 秘密引擎:
path "pki-int/issue/localhost-3" { |
将上述代码片段保存在名为policy.hcl 的文件中,并运行以下命令来创建此策略:
vault policy write vault-agent-policy path/to/policy.hcl |
现在,我们将启用类似AppRole 的身份验证方法:
vault auth enable approle |
上述命令将角色localhost-3与vault-agent-policy 绑定。
将role-id和secret-id写入文件。
vault read auth/approle/role/localhost/role-id |
现在我们将配置一个模板并将其保存在文件template.tpl中:
{{- with pkiCert "pki-int/issue/localhost-3" "common_name=localhost" "alt_names=localhost" "ttl=5m" -}} |
在这个模板中,我们之前创建的角色localhost-3 将生成有效期为 5 分钟的证书并将其保存到文件中。每次证书到期之前,它都会要求 Vault 服务器颁发证书并将其写入这些文件。
最后,我们需要一个 Vault Agent 的配置文件:
pid_file = "/paht/to/pidfile.pid" |
将此配置保存在名为 vault_agent.hcl 的文件中。 在此文件中,我们提到了 Vault 服务器地址、身份验证方法、template.tpl文件的位置以及Vault Agent 写入所有证书和密钥的目标文件all-certs 。然后,创建一个文件pidfile.pid ,Vault Agent 使用它来写入其进程 ID。
现在运行以下命令来启动 Vault Agent:
sudo vault agent -config=/path/to/vault_agent.hcl |
我们的 Vault Agent 已启动。我们可以在文件private_key.key、ca.pem、certificate.crt 和 all-certs文件中验证证书的生成。我们使用sudo命令运行以避免任何权限问题。
至此,我们已经配置了 Vault 服务器和 Vault Agent。接下来,让我们配置 Spring Boot 应用。
配置Spring Boot应用
首先,我们使用spring-boot-starter-web和spring-cloud-starter-vault-config创建一个 Spring Boot 应用程序:
<dependency> |
其次,我们在application.properties文件中添加以下 Spring Boot 属性来读取和热重新加载证书:
server.ssl.bundle=demo |
上述属性指的是template.tpl文件中提到的private_key.key和certificate.crt文件的位置。当内容发生变化时,Spring Boot 会自动从这些位置读取并重新加载证书。
只有证书有效时,应用程序才会成功启动。我们也可以通过查看日志来验证。如果我们监控日志超过五分钟,那么我们将看到以下类型的日志:
Connector [https-jsse-nio-8080], TLS virtual host [_default_], certificate type [UNDEFINED] configured from keystore [/Users/$HOME/.keystore] using alias [tomcat] with trust store [null] |
重新加载证书时,上述日志仍继续出现。