我正在努力创建一个码头消费者。我能够使用端点uri成功运行它:
jetty:http://0.0.0.0:8080
但是,当我修改端点uri为https:
时jetty:https://0.0.0.0:8443
页面超时尝试加载。这似乎很奇怪,因为camel documentation表明它应该开箱即用。
我已经将签名的SSL加载到java的默认密钥库中,我试图在下面加载它:http://camel.apache.org/jetty.html
我有一个基本的Jetty实例,使用带有akka和scala的akka-camel库。例如:
class RestActor extends Actor with Consumer {
val ksp: KeyStoreParameters = new KeyStoreParameters();
ksp.setPassword("...");
val kmp: KeyManagersParameters = new KeyManagersParameters();
kmp.setKeyStore(ksp);
val scp: SSLContextParameters = new SSLContextParameters();
scp.setKeyManagers(kmp);
val jettyComponent: JettyHttpComponent = CamelExtension(context.system).context.getComponent("jetty", classOf[JettyHttpComponent])
jettyComponent.setSslContextParameters(scp);
def endpointUri = "jetty:https://0.0.0.0:8443/"
def receive = {
case msg: CamelMessage => {
...
}
...
}
...
}
这导致了一些进展,因为页面不再超时,而是给出“连接被中断”错误。我不知道从哪里开始,因为骆驼不会抛出任何异常,而是默默地在某处(显然)失败。
有人知道会导致这种行为吗?
答案 0 :(得分:1)
使用java的“keytool”时,我没有指定输出文件。它没有抛出错误,所以它可能会去某处。我创建了一个新的密钥库,并将我的crt显式导入密钥文件。然后我明确地将文件路径添加到我创建的密钥库中,现在一切正常!
如果我不得不推测,有可能事情会无声地失败,因为我将证书添加到jetty的一般证书库中,如果符合条件则使用,而不是明确地将其绑定为端点的SSL。
class RestActor extends Actor with Consumer {
val ksp: KeyStoreParameters = new KeyStoreParameters();
ksp.setResource("/path/to/keystore");
ksp.setPassword("...");
val kmp: KeyManagersParameters = new KeyManagersParameters();
kmp.setKeyStore(ksp);
val scp: SSLContextParameters = new SSLContextParameters();
scp.setKeyManagers(kmp);
val jettyComponent: JettyHttpComponent = CamelExtension(context.system).context.getComponent("jetty", classOf[JettyHttpComponent])
jettyComponent.setSslContextParameters(scp);
def endpointUri = "jetty:https://0.0.0.0:8443/"
def receive = {
case msg: CamelMessage => {
...
}
...
}
...
}
希望未来有人可以使用此代码作为模板,通过akka-camel实现Jetty over SSL(令人惊讶的是,似乎没有例子存在)