Tomcat可以在不重启的情况下重新加载SSL证书吗?

我有一个后台进程,可以更新Tomcat用于其SSL凭据的密钥库。 我希望能够让Tomcat自动重新加载,而不需要手动重启。

有没有可能让Tomcat重新加载而不重新启动,或者是否有一个编程的方式,它可以完成?

我不相信有办法自动执行它,尽pipe你的后台进程可以自动重启tomcat。 当初始化jvm时,keystore只读取一次。 如果您要编写自己的处理程序,并定期重新检查密钥库,可能会有解决scheme,但是我个人还没有在Internet上find任何此类示例。

您可以重新启动单独的Tomcat连接器,例如,在更改jssecacert文件后,可以重新启动端口8843。

以下是我在添加/删除证书后用于重新启动tomcat连接器的完整代码/方法。

// Stop and restart the SSL connection so that the tomcat server will // re-read the certificates from the truststore file. public void refreshTrustStore() throws Exception { try { //following line should be replaced based on where you get your port number. You may pass in as argument to this method String httpsPort = configurationManager.getHttpsPort(); String objectString = "*:type=Connector,port=" + httpsPort + ",*"; final ObjectName objectNameQuery = new ObjectName(objectString); for (final MBeanServer server : MBeanServerFactory.findMBeanServer(null)) { if (server.queryNames(objectNameQuery, null).size() > 0) { MBeanServer mbeanServer = server; ObjectName objectName = (ObjectName) server.queryNames(objectNameQuery, null).toArray()[0]; mbeanServer.invoke(objectName, "stop", null, null); // Polling sleep to reduce delay to safe minimum. // Use currentTimeMillis() over nanoTime() to avoid issues // with migrating threads across sleep() calls. long start = System.currentTimeMillis(); // Maximum of 6 seconds, 3x time required on an idle system. long max_duration = 6000L; long duration = 0L; do { try { Thread.sleep(100); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } duration = (System.currentTimeMillis() - start); } while (duration < max_duration && server.queryNames(objectNameQuery, null).size() > 0); // Use below to get more accurate metrics. String message = "TrustStoreManager TrustStore Stop: took " + duration + "milliseconds"; logger.information(message); mbeanServer.invoke(objectName, "start", null, null); break; } } } catch (Exception exception) { //Log and throw exception throw exception } }