Jetty适用于HTTP,但不适用于HTTPS



我正在尝试创建一个码头消费者。我能够使用端点uri:成功运行它

jetty:http://0.0.0.0:8080

但是,当我修改https:的端点uri时

jetty:https://0.0.0.0:8443

尝试加载页面时超时。这似乎很奇怪,因为camel文档指出它应该开箱即用。

此后,我将一个签名的SSL加载到java的默认密钥库中,并尝试在下面实现加载它:http://camel.apache.org/jetty.html

我有一个基本的Jetty实例,它使用带有akka和scala的akkacamel库。例如:

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 => {
            ...
        }
        ...
    }
    ...
}

这导致了一些进展,因为页面不再超时,而是出现"连接中断"错误。我不知道该何去何从,因为骆驼并没有抛出任何异常,而是在某个地方默默地失败了(显然)。

有人知道是什么导致了这种行为吗?

当使用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在SSL上实现Jetty(令人惊讶的是,似乎不存在任何示例)

最新更新