如何在 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)