@Bean
public ServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
// --- CUSTOMIZE SSL PORT IN ORDER TO BE ABLE TO RELOAD THE SSL HOST CONFIG
tomcat.addConnectorCustomizers(new DefaultSSLConnectorCustomizer());
return tomcat;
}
字符串 我的定制器提取了https的协议供以后使用
public class DefaultSSLConnectorCustomizer implements TomcatConnectorCustomizer {
private Http11NioProtocol protocol;
@Override
public void customize(Connector connector) {
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
if ( connector.getSecure()) {
//--- REMEMBER PROTOCOL WHICH WE NEED LATER IN ORDER TO RELOAD SSL CONFIG
this.protocol = protocol;
}
}
protected Http11NioProtocol getProtocol() {
return protocol;
}
型 } 当我用新的私钥更新密钥库时,我会重新加载SSL主机配置。
@Component
public class TomcatUtil {
public static final String DEFAULT_SSL_HOSTNAME_CONFIG_NAME = "_default_";
private final Logger logger = LoggerFactory.getLogger(getClass());
private ServletWebServerFactory servletWebServerFactory;
public TomcatUtil(ServletWebServerFactory servletWebServerFactory) {
this.servletWebServerFactory = servletWebServerFactory;
}
public void reloadSSLHostConfig() {
TomcatServletWebServerFactory tomcatFactoty = (TomcatServletWebServerFactory) servletWebServerFactory;
Collection<TomcatConnectorCustomizer> customizers = tomcatFactoty.getTomcatConnectorCustomizers();
for (TomcatConnectorCustomizer tomcatConnectorCustomizer : customizers) {
if (tomcatConnectorCustomizer instanceof DefaultSSLConnectorCustomizer) {
DefaultSSLConnectorCustomizer customizer = (DefaultSSLConnectorCustomizer) tomcatConnectorCustomizer;
Http11NioProtocol protocol = customizer.getProtocol();
try {
protocol.reloadSslHostConfig(DEFAULT_SSL_HOSTNAME_CONFIG_NAME);
logger.info("Reloaded SSL host configuration");
} catch (IllegalArgumentException e) {
logger.warn("Cannot reload SSL host configuration", e);
}
}
}
}
}
4条答案
按热度按时间7eumitmz1#
不幸的是,这是不可能的。
但是
这里有几种解决方案。
安装Tomcat连接器(有点黑客)
您可以重新启动
Tomcat
连接器,即在更改jssecacert
文件后重新启动8843
。但我认为这仍然是一个黑客。
反向代理:
Nginx
、Apache
这是一种方法。您的应用程序应该在某个反向代理之后(例如
nginx
)。这将给予您额外的灵活性,并减少应用程序的负载。Nginx
将处理https
并将其转换为普通的http
。无论如何,您必须重新启动nginx
,但nginx
重新启动非常快,不会停机。此外,你可以配置脚本来为你做这件事。kxeu7u2r2#
在Tomcat上,可以使用本地JMX重新加载SSL上下文:
字符串
我正在重新加载所有ThreadPool SSL上下文,但实际上只需要一个:
Tomcat:type=ThreadPool,name=https-jsse-nio-8443
。我担心名称会改变,所以我涵盖了所有可能性以防万一。vd2z7a6w3#
我在Sping Boot 应用程序中解决了这个问题,方法是在bean中获取
TomcatServletWebServerFactory
,并向其中添加我自己的连接器定制器。字符串
我的定制器提取了https的协议供以后使用
型
}
当我用新的私钥更新密钥库时,我会重新加载SSL主机配置。
型
最后
型
jtw3ybtb4#
从Sping Boot 3.2开始,可以热重载(至少对于Tomcat和Netty嵌入式Web服务器)。
要使用该功能,请执行以下操作:
1.定义一个SSL包(我们称之为“demo”)
字符串
1.然后将Web服务器指向它
型
P.S.这里有一篇关于如何使用https://spring.io/blog/2023/11/07/ssl-hot-reload-in-spring-boot-3-2-0功能的好文章