如何在Azure上托管的Golang Web应用程序上使用WSS协议?

xvw2m8pv  于 11个月前  发布在  Go
关注(0)|答案(1)|浏览(117)

**背景:**我使用Azure App Service设置了一个Web应用,服务器是用Golang编写的,它服务于一个React客户端,客户端在加载时与服务器建立WebSocket连接。
我的问题:

我的应用仍处于早期原型阶段,因此它仍属于azurewebsites.net域的一部分,我还没有为其配置自己的证书(我认为Azure默认提供了一个证书)。如何使服务器在Azure上运行时接受安全的WebSocket消息(WSS协议)?通常这需要类似下面的代码。

// This worked locally with self-signed certificates. Some code omitted for brevity.
mux := http.NewServeMux()
// ...
mux.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
        conn, _ := upgrader.Upgrade(w, r, nil)
        // Simple echo server to verify that WebSockets are working.
                // I had more WebSocket code as well, but it's not relevant to the question.
        for {
            messageType, p, err := conn.ReadMessage()
            if err != nil {
                return
            }
            if err := conn.WriteMessage(messageType, p); err != nil {
                return
            }
        }
    })
http.ListenAndServeTLS(":"+port, certPath, keyPath, mux)

字符串
但是,Azure似乎并没有给予代码直接访问证书的权限。

我尝试过的:

    • 使用http.ListenAndServe()而不是http.ListenAndServeTLS()*:Azure自动将HTTP请求重定向到HTTPS。尝试从客户端连接到wss://. azurewebapps.net失败,因为代码仍然用于HTTP服务器,尽管Azure以某种方式将其升级到HTTPS。尝试从客户端连接到ws://.azurewebapps.net会导致DOM_EXCEPTION,因为尝试从HTTPS连接建立WS连接。
    • 读取Azure服务上的环境变量以查找证书/密钥的路径 *:Azure控制台中列出的环境变量看起来都不像是引用证书或密钥的。
    • 将自签名证书和密钥上传到Azure并在http.ListenAndServeTLS()调用中读取它们 *:这不是一个理想的解决方案,它也不起作用。浏览器给了我一条错误消息,指出HTTP客户端正在尝试连接到HTTPS服务器。
tjrkku2a

tjrkku2a1#

事实证明,Azure App Services不仅会自动将HTTP升级到HTTPS,还会自动将WS升级到WSS。因此,对我来说,一个有效的解决方案是使用http. browsAndServe,从而设置一个HTTP / WS服务器,然后让客户端访问wss://. azurewebsites.net。我最初没有尝试它,因为它不经过修改就无法在本地工作,但它确实可以在Azure上工作。

相关问题