You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Golang服务中使用Cloud Run的TLS证书实现WebSocket安全连接

问题解答

1. 是否可以在服务代码中直接获取并使用Cloud Run的TLS证书文件?

不可以。Cloud Run 会在Google托管的边缘负载均衡层自动完成TLS终止,官方不会将托管证书的pem文件、私钥文件暴露给用户部署的服务容器,你无法在代码中直接获取到对应文件传入ListenAndServeTLS方法使用。

2. HTTPS环境下WebSocket正常访问的更优方案

Cloud Run的现有架构已经原生支持安全WebSocket访问,你完全不需要自己处理TLS配置,具体实现逻辑如下:

  • 客户端到Cloud Run边缘节点的连接,会由Google自动提供HTTPS/WSS加密保护,你只要使用Cloud Run提供的默认域名或者绑定的自定义域名,都默认自带有效的受信TLS证书。
  • 边缘节点转发到你的服务容器的流量已经完成TLS解密,你只需要在代码中使用普通的ListenAndServe监听Cloud Run要求的端口(默认读取PORT环境变量,通常为8080),正常注册WebSocket路由处理逻辑即可,不需要调用ListenAndServeTLS。

参考代码示例:

package main

import (
	"log"
	"net/http"
	"os"

	"github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
	CheckOrigin: func(r *http.Request) bool {
		// 按需配置跨域规则
		return true
	},
}

func wsHandler(w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println(err)
		return
	}
	defer conn.Close()
	// 后续WebSocket读写逻辑
}

func main() {
	http.HandleFunc("/ws", wsHandler)
	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
	}
	// 直接使用普通ListenAndServe即可,不需要配置证书
	log.Fatal(http.ListenAndServe(":"+port, nil))
}

前端调用时直接使用wss://<你的Cloud Run服务域名>/ws连接即可,不会触发混合内容报错:

Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.

因为客户端到Cloud Run的链路已经是加密的WSS协议,容器内部的未加密传输属于Google内部链路,用户侧无法感知,不会被浏览器判定为不安全连接。

内容的提问来源于stack exchange,提问作者gyula

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 12:24:04