Spring启动 - 使用 Spring 云配置重新加载 SSL 证书

SpringBoot - Reload SSL Cert using Spring Cloud Config

我正在学习如何将 SSL 证书 与 Spring 引导一起使用。专门使用 Let's Encrypt 的。

他们有 3 个月后过期的限制,所以他们应该更新,据我所知,更新证书时我们需要重新启动 Spring 启动应用程序以使其加载取而代之的是新的。

前段时间,我在玩弄 Eureka 和 Zuul Gateway,开发微服务...我记得我还设置了一个 git 存储库用作 Spring 云配置.我记不太清楚了,我想我们可以使用 Spring Cloud Config 而无需使用微服务架构。

所以我的问题是:我们能否使用这种 Spring 重新加载属性的云配置 机制 重新加载 SSL 证书 ?这个想法是触发属性重新加载机制,并且由于 ssl 是通过这些属性配置的,我想也许它可以重新加载。

我计划自动化获取和更新 Let's Encrypt 证书的过程,避免我的应用程序停机。

此致!

SSL 证书在 JVM 级别应用 - Spring Boot 和 Spring Cloud Config 都无法对此进行任何控制,因此要应用新证书需要重新启动 JVM 实例你的应用程序运行,因为你已经更新了你的密钥库。能够在不关闭 JVM 的情况下动态添加证书将是一个主要的安全漏洞。

在 AWS 生态系统中,这个想法是,如果您关闭了您的 VM,您将丢失该 VM,并且其上的内容将永远消失。使用 Spring Cloud(Config、Zuul、Eureka),您可以启动通过 Config 注册到 Eureka 的 VM,Zuul 使用 Eureka 中的信息来进行负载平衡。所以,应该做的是你用你的 Spring Boot 实例和更新的证书启动另一个 VM,并杀死由于 AWS 而消失的旧 VM,而 Zuul 负责处理脏工作a "reverse web proxy",根据需要将请求路由到新的 Web 服务器。

你打开这条路的蠕虫罐是现在你必须实施 4 个服务器和一个 VPN 来支持它们,你的 Zuul 服务器成为外部 Web 请求的目标,你可能需要查看 "circuit breaker" 关于如何处理 HTTP 请求失败的模式 - Hystrix 是接下来要研究的东西。

对于 Digital Ocean,我不确定您可能需要做哪些不同的事情,但 JVM 重启是不可避免的。

实际上,这取决于。证书应用于 SSLContext 级别,并且 SSLContext 可以在运行时刷新。完全可以更新 KeyStore 中的证书并刷新 SSLContext,此外,Tomcat 有一个特殊的辅助函数 reloadSslHostConfigs 可以帮助您做到这一点。

所以你问的是完全可行的:

  1. Spring 云触发证书更新事件通知或通过轮询
  2. 您的应用程序从 Spring-Cloud 或某些共享存储加载更新的证书
  3. 您的应用程序问题 reloadSslHostConfigs,因此 Tomcat 更新其 SSLContext

有关证书重新加载的实现细节,您可以查看letsencrypt-helper 库。它允许在不重新启动 JVM 的情况下生成和保持最新的 LetsEncrypt 证书。