【问题标题】:WebSocket over TLS: Golang / Gorilla基于 TLS 的 WebSocket:Golang / Gorilla
【发布时间】:2020-08-03 02:21:10
【问题描述】:

我一直在尝试通过 TLS 建立 WebSocket 连接(因此使用加密)。我将 Golang 与 Gorilla 一起使用。 WebSocket 连接作为初始 HTTP 连接实现,该连接升级为 WebSocket 协议连接。代码是这样的:

func wsEndpoint(w http.ResponseWriter, r *http.Request) {
    // upgrade
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        //...
    }

    log.Println("Client Connected")
    err = ws.WriteMessage(1, []byte("Hi Client!"))
    if err != nil {
        //...
    }
    // listen indefinitely for new messages coming 
}

然后我们设置路由:

func main() {
    //...
    setupRoutes()
    log.Fatal(http.ListenAndServe(":8080", nil))
}

把最后一行改成:

...http.ListenAndServeTLS(...)

也就是说使用TLS建立第一个连接? 这种方法是否足以保护从开始到结束通过 WebSocket 进行的整个通信?我是否应该确定连接期间的所有数据包传输也受 TLS 保护?如果没有,如何在 Golang/Gorilla 框架中设置?

【问题讨论】:

    标签: go ssl https websocket gorilla


    【解决方案1】:

    解决此问题的一种方法是使用 certbot 设置反向代理(如 nginx)来生成证书。

    这就是它的工作原理

    [ Client ] ----------> [ nginx ] --------------> [ golang server ]
                Encrypted             Not encrypted
    

    【讨论】:

    • 感谢您的建议,但这并不能真正回答我的问题,也不能解决问题。请注意,根据我的问题,连接 Client->Nginx 与我的问题中描述的原始连接具有相同的属性。
    • 也许有一个误解,但我想说的是,您可以轻松地使用 nginx 设置一个 https (+wss) 服务器,您的客户端可以安全地连接到该代理服务器对您的请求戈兰服务器。 nginx 和你的 go 服务器之间的连接不会是安全的,但它不一定是因为客户端无法直接访问该服务器。
    【解决方案2】:

    使用 http.ListenAndServeTLS 加密用于 HTTP 协议和 WebSocket 协议的底层网络连接。

    该方法保护了底层网络连接上的整个通信,包括所有 WebSocket 流量。

    Gorilla 服务器代码使用 net/http 服务器提供的网络连接。 Gorilla 服务器代码确实会创建新的网络连接。

    http.ListenAndServeTLS 是一个辅助函数,它调用较低级别的函数和方法。它也可以直接调用那些较低级别的函数和方法。

    【讨论】:

      猜你喜欢
      • 2019-09-22
      • 2021-01-15
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 2019-09-05
      • 1970-01-01
      相关资源
      最近更新 更多