在 Akka HTTP 中启用安全 Web 套接字支持



如何在 Akka HTTP 版本 2.0 中启用对安全 Web 套接字的支持?我无法在官方文档中找到任何具体的指令或任何提示,请帮忙。

我目前的方法如下:

val handler:Flow[Message, Message, Unit]
val route:Route = path("ws") {
  get {
    handleWebsocketMessages(wsService(wsHandlerProps))
  }
}

您必须首先配置一个 akka-http Web 服务器(使用自签名证书进行测试),然后像您所做的那样使用 Web 套接字。

我已经将更新推送到我的自签名安全服务器演示中,该演示添加了 Web 套接字。看到这个问题。

需要注意的一件事是,您需要将自签名证书添加到浏览器的接受证书列表中。否则,websocket 连接将以静默方式失败,因为每次连接到不受信任的安全 Websocket 时,浏览器都不会弹出对话框。

要记住的另一件事是,在您的客户端 javascript 或任何您需要使用的代码中 wss:// 而不是 ws:/ .

正如Rüdiger提到的,你需要先获得证书。我将我的存储在KeyStore中,这是我可以让akka-http加载它的唯一方法。

获得证书后,您需要配置 Https 上下文:

 def getSSLContext() : HttpsConnectionContext = {
    val ks: KeyStore = KeyStore.getInstance("JKS")
    val keystorePath = config.getString("keystore.path")
    val keystorePassword = config.getString("keystore.password").toCharArray
    val keystore: InputStream = Files.newInputStream( Paths.get(keystorePath))
    require(keystore != null, "Keystore required!")
    ks.load(keystore, keystorePassword)
    val keyManagerFactory: KeyManagerFactory = KeyManagerFactory.getInstance("SunX509")
    keyManagerFactory.init(ks, keystorePassword)
    val tmf: TrustManagerFactory = TrustManagerFactory.getInstance("SunX509")
    tmf.init(ks)
    val sslContext: SSLContext = SSLContext.getInstance("TLS")
    sslContext.init(keyManagerFactory.getKeyManagers, tmf.getTrustManagers, new SecureRandom)
    ConnectionContext.https(sslContext)
  }

然后将其设置为默认值:

Http().setDefaultServerHttpContext(getSSLContext())

完成后,您可以绑定路由并开始处理请求:

  val bindingFuture = Http().bindAndHandle(api.route, bindAddress ,port=bindPort)
  bindingFuture.onComplete(println)

相关内容

  • 没有找到相关文章

最新更新