Akka-HTTP服务器HTTPS支持

时间:2020-03-11 10:24:25

标签: java https akka akka-http sslcontext

我发现自己努力为我们的akka​​-http java应用程序启用https支持。 文档页面(https://doc.akka.io/docs/akka-http/current/server-side/server-https-support.html)应该有所帮助,但由于某种原因,它没有帮助。

从我从该页面获得的内容开始,我的想法是获取一个HttpsConnectionContext实例并将其用作http.setDefaultClientHttpsContext(...)方法调用的参数,然后实际进行路由绑定。

到目前为止我所拥有的:

从配置中创建SSLContext的代码:

public static SSLContext getSslContext(String path, ActorSystem system) {
    final AkkaSSLConfig sslConfig = AkkaSSLConfig.get(system);

    final Config overrides = system.settings().config().getConfig(path);
    final Config defaults = system.settings().config().getConfig("ssl-config");

    final SSLConfigSettings config = SSLConfigFactory.parse(overrides.withFallback(defaults));

    return new ConfigSSLContextBuilder(
        new AkkaLoggerFactory(system),
        config,
        sslConfig.buildKeyManagerFactory(config),
        sslConfig.buildTrustManagerFactory(config)
    ).build();
}

实际的配置安全性:

akka.ssl-config {
  trustManager = {
    stores = [
      { type: "JKS" , path: "xxx-truststore.jks", password = "xxx"}
    ]
  }
  keyManager = {
    stores = [
      { type: "JKS" , path: "xxx-keystore.jks", password = "xxx"}
    ]
  }
}

使用它们启用https:

final SSLContext sslContext = Utils.getSslContext("akka.ssl-config", system);
final HttpsConnectionContext httpsContext = ConnectionContext.https(sslContext);
http.setDefaultClientHttpsContext(httpsContext);

final CompletionStage<ServerBinding> binding =
    http.bindAndHandle(routeFlow, ConnectHttp.toHost("localhost",443), materializer);

但这实际上什么也没做。如果我尝试对服务器进行一些https调用,则会收到以下异常:

Illegal request, responding with status '400 Bad Request': Unsupported HTTP method: The HTTP method started with 0x16 rather than any known HTTP method. Perhaps this was an HTTPS request sent to an HTTP endpoint?

我可能丢失了一些东西,但是我不知道是什么

1 个答案:

答案 0 :(得分:0)

毕竟看起来像我的错) 显然使用的方法是http.setDefaultServerHttpContext(...)而不是http.setDefaultClientHttpsContext(...)