golang ws升级为wss

发布于:2024-10-16 ⋅ 阅读:(12) ⋅ 点赞:(0)

首先需要一份openssl证书

1.安装openssl

windows安装openssl 的下载地址在 https://slproweb.com/products/Win32OpenSSL.html

无脑点安装就行,记得最后安装完成的页面取消勾选

安装完成后记得配置环境变量

2.生成证书

openssl req -x509 -days 36500 -nodes -newkey rsa -keyout ./antiy1.key -out ./antiy1.crt -subj "/CN=antiy"

-x509 : 说明生成自签名证书,自签名证书又称为根证书,是自己颁发给自己的证书,即证书中的颁发者和主体名相同。

-days n : 指定自签名证书的有效期限,默认30天,需要和"-x509"一起使用。

-nodes : 如果指定-newkey自动生成秘钥,那么-nodes选项说明生成的秘钥不需要加密,即不需要输入passphase.

-newkey : -newkey是指在生成证书请求或者自签名证书的时候自动生成密钥,然后生成的密钥名称由-keyout参数指定。当指定newkey选项时,后面指定rsa:bits说明产生rsa密钥,位数由bits指定。 如果没有指定选项-key和-newkey,默认自动生成秘钥。

-keyout : 指明创建的新的私有密钥文件的文件名

-out : -out 指定生成的证书请求或者自签名证书名称

-config : 默认参数在ubuntu上为 /etc/ssl/openssl.cnf, 可以使用-config指定特殊路径的配置文件

-batch : 指定非交互模式,直接读取config文件配置参数,或者使用默认参数值

-verbose : 显示操作执行的详细信息

-subj args :替换或自定义证书请求时需要输入的信息,并输出修改后的请求信息。args的格式为"/type0=value0/type1=value1…“,如果value为空,则表示使用配置文件中指定的默认值,如果value值为”.",则表示该项留空。

其中可识别type有:

    C是Country、ST是state、L是localcity、O是Organization、OU是Organization Unit、CN是common name等

3.升级wss为ws,同时使用embed将证书打包进可执行文件

func Start() {
	//处理ws的连接
	http.HandleFunc("/ws", HandleConnection)
	certData, err := cert.ReadFile("certs/server.crt")
	if err != nil {
		log.Fatalf("Failed to read cert.pem: %v", err)
	}

	keyData, err := cert.ReadFile("certs/server.key")
	if err != nil {
		log.Fatalf("Failed to read key.pem: %v", err)
	}
	// 加载证书
	cert, err := tls.X509KeyPair(certData, keyData)
	if err != nil {
		log.Fatalf("Failed to load key pair: %v", err)
	}

	// 配置 TLS
	tlsConfig := &tls.Config{
		Certificates: []tls.Certificate{cert},
	}
	// //监听7001端口号,作为websocket连接的服务
	log.Info("Server started on :7001")
	server := &http.Server{
		Addr:      "[::]:7001",
		TLSConfig: tlsConfig,
	}

	err = server.ListenAndServeTLS("", "") // 已经在 tlsConfig 中加载了证书
	if err != nil {
		log.Fatalf("Server failed: %v", err)
	}
	log.Info("Server started on :7001")
}

也可以不打包进可执行文件

func main() {
	// 加载服务器的证书和私钥
	cert, err := tls.LoadX509KeyPair("certs/antiy1.crt", "certs/antiy1.key")
	if err != nil {
		log.Fatalf("failed to load server cert and key: %v", err)
	}

	// 加载客户端的 CA 根证书
	// clientCACertPool, err := loadClientCA("certs/antiy1.crt")
	if err != nil {
		log.Fatalf("failed to load client CA: %v", err)
	}

	// 创建 TLS 配置
	tlsConfig := &tls.Config{
		Certificates: []tls.Certificate{cert}, // 服务器证书
		// ClientCAs:    clientCACertPool,        // 客户端证书的 CA
		// ClientAuth:   tls.RequireAndVerifyClientCert, // 强制要求客户端证书
		MinVersion: tls.VersionTLS12, // 设置最低支持 TLS 版本
	}

	// 创建 HTTPS 服务器
	server := &http.Server{
		Addr:      ":443",
		TLSConfig: tlsConfig,
	}

	// WebSocket 路由
	http.Handle("/ws", websocket.Handler(wsHandler))

	// 启动服务器
	fmt.Println("Starting WSS server on :443 with mTLS")
	log.Fatal(server.ListenAndServeTLS("", ""))
}