Java 有没有办法让camel jetty在密钥存储更改后动态重新加载密钥存储?

Java 有没有办法让camel jetty在密钥存储更改后动态重新加载密钥存储?,java,https,apache-camel,Java,Https,Apache Camel,我们在骆驼码头使用https时遇到了一个问题。一旦密钥存储文件发生更改(如删除或添加证书),我们如何使更改生效?默认情况下,camel jetty不会动态重新加载更改 示例代码: JettyHttpComponent jettyComponent = getContext().getComponent("jetty", JettyHttpComponent.class); SslSelectChannelConnector sslConnector = new SslSelectChannelC

我们在骆驼码头使用https时遇到了一个问题。一旦密钥存储文件发生更改(如删除或添加证书),我们如何使更改生效?默认情况下,camel jetty不会动态重新加载更改

示例代码:

JettyHttpComponent jettyComponent = getContext().getComponent("jetty", JettyHttpComponent.class);
SslSelectChannelConnector sslConnector = new SslSelectChannelConnector();
SslContextFactory sslFactory = sslConnector.getSslContextFactory();
sslFactory.setNeedClientAuth(true);
sslFactory.setKeyStore("d:" + File.separator +"serverkeystore");
sslFactory.setKeyManagerPassword("serverkey");
sslFactory.setKeyStorePassword("serverkeystore");
sslFactory.setTrustStore("d:" + File.separator +"servertruststore");
sslFactory.setTrustStorePassword("servertruststore");
Map<Integer, SslSelectChannelConnector> connectors = new HashMap<Integer, SslSelectChannelConnector>();
connectors.put(443, sslConnector);
jettyComponent.setSslSocketConnectors(connectors);   
from("jetty:https://0.0.0.0/httpsservice")
    .id("httpsserver")
    .process(new Processor(){
        public void process(Exchange exchange) throws Exception {
            exchange.getOut().setBody("OK");
            exchange.getOut().setHeader(Exchange.HTTP_RESPONSE_CODE, 200);
        }
    });
JettyHttpComponent jettyComponent=getContext().getComponent(“jetty”,JettyHttpComponent.class);
SslSelectChannelConnector sslConnector=新的SslSelectChannelConnector();
SslContextFactory sslFactory=sslConnector.getSslContextFactory();
sslFactory.setNeedClientAuth(true);
setKeyStore(“d:+File.separator+“serverkeystore”);
setKeyManagerPassword(“serverkey”);
setKeyStorePassword(“serverkeystore”);
sslFactory.setTrustStore(“d:+File.separator+“servertruststore”);
setTrustStorePassword(“servertruststore”);
Map connectors=newhashmap();
连接器.put(443,SSL连接器);
码头组件。设置插座连接器(连接器);
码头:https://0.0.0.0/httpsservice")
.id(“httpsserver”)
.进程(新处理器(){
公共作废进程(Exchange)引发异常{
exchange.getOut().setBody(“OK”);
exchange.getOut().setHeader(exchange.HTTP_RESPONSE_代码,200);
}
});
但是,当我们动态更改密钥存储文件时,除非重新启动应用程序,否则更改不会生效。有没有办法使这项改变生效


谢谢

使用相同的配置使两个骆驼上下文保持活动状态。应用负载平衡器模式。然后定期检查密钥库文件是否有更新,如果有更新,请一次删除一个。确保负载平衡器知道要触发的上下文


好吧,我必须承认我还没有真正想清楚。SSL部分可能会让它变得有点棘手。但是它应该是可行的。

您可以使用自定义的
X509KeyManager
和自定义的
X509TrustManager
构建一个
SSLContext
(并通过
SslContextFactory
传递它),它将动态更改其返回值,而不是一次性加载


出于性能原因,我不会在每次调用密钥库的某个方法时都重新加载密钥库,而是缓存结果并每隔一段时间重新加载一次(可能每5分钟,这实际上取决于您预期的使用情况)。

这将在stackoverflow之外讨论。请在多处张贴问题时添加评论。