2016-02-17 23 views
1

如何在Akka HTTP 2.0版中啓用對安全Web套接字的支持。我無法在官方文檔中找到任何具體指令或任何提示,請幫助。在Akka中啓用安全Web套接字支持HTTP

我目前的做法是:

val handler:Flow[Message, Message, Unit] 

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

回答

2

你必須首先配置阿卡-HTTP Web服務器(與用於測試的自簽名證書),然後使用網絡插座完全像你這樣做。

我推送了更新到我的self-signed secure server demo,添加了一個web套接字。見this question

需要注意的一件事是您需要將自簽名證書添加到您的瀏覽器的已接受證書列表中。否則,websocket連接將無提示失敗,因爲每次連接到不可信的安全websocket時,瀏覽器都不會彈出對話框。

要記住的另一件事是,在您的客戶端JavaScript或任何代碼您需要使用wss://,而不是ws:/

1

正如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)