Ssl 如何在游戏中使用TLS!框架WebSocket(“wss://”)

Ssl 如何在游戏中使用TLS!框架WebSocket(“wss://”),ssl,playframework,websocket,playframework-2.2,Ssl,Playframework,Websocket,Playframework 2.2,我无法在使用Play创建的简单WebSocket应用程序中使用wss://!框架2.2。它回显了这一信息。端点是这样的 def indexWS2 = WebSocket.using[String] { request => { println("got connection to indexWS2") var channel: Option[Concurrent.Channel[String]] = None val outEnumerator: Enumer

我无法在使用Play创建的简单WebSocket应用程序中使用
wss://
!框架2.2。它回显了这一信息。端点是这样的

def indexWS2 = WebSocket.using[String] {
  request => {
    println("got connection to indexWS2")

    var channel: Option[Concurrent.Channel[String]] = None
    val outEnumerator: Enumerator[String] = Concurrent.unicast(c => channel = Some(c))

    // Log events to the console
    val myIteratee: Iteratee[String, Unit] = Iteratee.foreach[String] {gotString => {
      println("received: " + gotString)

      // send string back
      channel.foreach(_.push("echoing back \"" + gotString + "\""))
    }}

    (myIteratee, outEnumerator)
  }
}
myWebSocket = new WebSocket("ws://localhost:9000/ws2");
路线描述如下:

GET     /ws2                        controllers.Application.indexWS2
我从JS客户端创建了一个连接,如下所示

def indexWS2 = WebSocket.using[String] {
  request => {
    println("got connection to indexWS2")

    var channel: Option[Concurrent.Channel[String]] = None
    val outEnumerator: Enumerator[String] = Concurrent.unicast(c => channel = Some(c))

    // Log events to the console
    val myIteratee: Iteratee[String, Unit] = Iteratee.foreach[String] {gotString => {
      println("received: " + gotString)

      // send string back
      channel.foreach(_.push("echoing back \"" + gotString + "\""))
    }}

    (myIteratee, outEnumerator)
  }
}
myWebSocket = new WebSocket("ws://localhost:9000/ws2");
一切正常。但是,如果我将
ws://
更改为
wss://
以使用TLS,它将失败,我将得到以下净异常:

[error] p.nettyException - Exception caught in Netty
java.lang.IllegalArgumentException: empty text

我怎样才能做到这一点?谢谢。

我真的很想帮你解决这个问题!但是我不喜欢这个答案。似乎还没有对WebSocket的SSL的播放支持。这里提到了这一点,但没有任何进展迹象,因为:

然而,还是有希望的!您可以将nginx用作安全websocket(wss)端点,以转发到具有不安全websocket端点的内部播放应用程序:

该页面提供了nginx的以下解释和代理配置示例:

目标:WSS SSL端点:
转发WSS|https://ws.example.com 到ws|http://ws1.example.com:10080

“代理也是WSS和HTTPS连接的SSL端点。因此,客户端可以使用WSS://连接(例如,通过HTTPS提供的页面),这可以更好地处理损坏的代理服务器等。”


Nginx是如此轻巧和有趣。您会毫不犹豫地使用此选项。

另一个选项是使用SockJS作为Websocket层,Play2的SockJS实现可以在

启用HTTPS后,SockJS将通过HTTPS通道创建wss端点。Play2 sockjs还支持与本机Play WebSocket一样的演员模式


如果您不想在客户端使用SockJS,而是强制浏览器websocket实现,那么可以使用显式websocket端点wss:////websocket

您是否尝试在播放服务器上启用https支持?看起来您正试图使用wss连接到http端口,但这永远无法工作,您需要启用https,然后不仅将URL更改为wss,还需要使用https端口

要在打开ssl的情况下启动播放服务器,请执行以下操作:

activator run -Dhttps.port=9443

然后连接到
wss://localhost:9443/ws2

wss
在播放2.6时运行良好

您可以通过以下路径获取url,而不是硬编码websocket url:

@import play.api.mvc.RequestHeader
@import controllers.routes
@()(implicit request: RequestHeader)
<!DOCTYPE html>
<html lang="en">
    <head>
        <title>...</title>
        <script>
                var wsUri = "@routes.MyController.indexWS2().webSocketURL(secure = true)";
                var webSocket = new WebSocket(wsUri);
        //...
        </script>
    </head>
    <body>
    ...
    </body>
</html>
@import play.api.mvc.RequestHeader
@导入控制器。路由
@()(隐式请求:RequestHeader)
...
var wsUri=“@routes.MyController.indexWS2().webSocketURL(secure=true)”;
var webSocket=新的webSocket(wsUri);
//...
...

我推荐EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA 256:+AES256:+CAMELLIA 128:+AES128:+SSLv3:!阿努尔:!埃努尔:!低:!3DES:!MD5:!经验:!PSK:!决策支持系统:!RC4:!种子:!ECDSA:Camellia 256-SHA:AES256-SHA:Camellia 128-SHA:AES128-SHA来自