Включение поддержки безопасных веб-сокетов в Akka HTTP

Как включить поддержку безопасного веб-сокета в Akka HTTP версии 2.0.*? Мне не удалось найти какой-либо конкретной директивы для этого или каких-либо подсказок в официальной документации, пожалуйста, помогите.

Мой текущий подход заключается в следующем:

val handler:Flow[Message, Message, Unit]

val route:Route = path("ws") {
  get {
    handleWebsocketMessages(wsService(wsHandlerProps))
  }
}

person stanislav.chetvertkov    schedule 17.02.2016    source источник


Ответы (2)


Вы должны сначала настроить веб-сервер akka-http (с самозаверяющим сертификатом для тестирования), а затем использовать веб-сокеты точно так же, как вы это сделали.

Я отправил обновление для моего самоподписанного демо-сервера, которое добавляет веб-сокет . См. этот вопрос.

Следует помнить, что вам необходимо добавить самозаверяющий сертификат в список принятых сертификатов вашего браузера. В противном случае подключение к веб-сокету завершится неудачно, потому что браузер не будет открывать диалоговое окно каждый раз, когда вы подключаетесь к ненадежному защищенному веб-сокету.

Еще одна вещь, о которой следует помнить, это то, что в javascript на стороне клиента или в любом другом коде вам нужно использовать wss:// вместо ws:/.

person Rüdiger Klaehn    schedule 17.02.2016

Как упоминает Рюдигер, сначала вам нужно получить сертификат. Я хранил свой в 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)
person nont    schedule 23.02.2017