我们是否可以避免 spring boot 应用程序重新启动,以刷新与其嵌入式 tomcat 容器关联的证书?

mah*_*ath 6 java security ssl spring spring-boot

对 SSL 证书(在其密钥库中)进行任何更改后,我们需要重新启动 Spring Boot 应用程序。我想定期更新我的密钥存储条目(可能每年),但想避免重新启动 JVM。需要什么才能实现它。我想知道编写自定义 KeyManager 是否是可以接受的做法?

Yur*_*uri 3

不幸的是,这是不可能的。

这里有几种解决方案。

重新加载 Tomcat 连接器(有点 hacky)

您可以重新启动Tomcat连接器,即8843更改jssecacert文件后可以重新启动。

但我认为这仍然是一个黑客。

反向代理:Nginx,Apache

这是一条路要走。您的应用程序应该位于某些反向代理后面(例如nginx)。这将为您提供额外的灵活性并减少应用程序的负载。Nginx将处理https并将其转换为 plain http。无论如何,你都必须重新启动nginx,但是nginx重新启动是如此之快,以至于不会出现停机时间。此外,您可以配置脚本来为您执行此操作。

  • 从 spring 配置返回一个 **EmbeddedServletContainerFactory** bean,容器将选择它,而不是默认的。然后包含一个定制器来获取连接器引用(即 httpsConnector) webContainerFactory.addConnectorCustomizers((TomcatConnectorCustomizer) (Connector 连接器) -> { httpsConnector = 连接器; httpsConnector.setAttribute("bindOnInit", false); // 需要新版本的 tomcat }); 现在我们有了连接器实例的句柄,我们只需要执行 httpsConnector.stop(); // 可以在此处更改连接器设置。httpsConnector.start(); (2认同)
  • @ZbarceaChristian 是的,nginx 将为你处理 `https` 部分。通常它比使用应用程序本身更有效。 (2认同)