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