2016-02-17 2 views
1

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

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

val handler:Flow[Message, Message, Unit] 

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

ответ

2

Вы должны сначала настроить AKKA-клиент веб-сервер (с самоподписанным сертификатом для тестирования), а затем использовать веб-сокеты так же, как вы сделали ,

Я подтолкнул обновление к моему self-signed secure server demo, который добавляет веб-сокет. См. this question.

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

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

1

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