找回密码
 成为会员
搜索
热搜: 活动 交友 discuz
查看: 8|回复: 0

建议完善内网使用https导致websocket无法使用的问题

[复制链接]

21

主题

1

回帖

89

积分

注册会员

积分
89
发表于 8 小时前 | 显示全部楼层 |阅读模式
看了下通过openssl工具生成的https证书是可以通过websocket通讯的。下面是例子,希望ISM也可以实现。package main

import (
    "crypto/tls"
    "crypto/x509"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

func echo(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println("upgrade:", err)
        return
    }
    defer conn.Close()

    for {
        messageType, p, err := conn.ReadMessage()
        if err != nil {
            log.Println("read:", err)
            break
        }
        err = conn.WriteMessage(messageType, p)
        if err != nil {
            log.Println("write:", err)
            break
        }
    }
}

func main() {
    http.HandleFunc("/ws", echo)

    // 加载 CA 证书
    caCert, err := ioutil.ReadFile("ca.crt")
    if err != nil {
        log.Fatalf("Failed to read CA certificate: %v", err)
    }
    caCertPool := x509.NewCertPool()
    caCertPool.AppendCertsFromPEM(caCert)

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

    // 配置 TLS
    tlsConfig := &tls.Config{
        Certificates: []tls.Certificate{cert},
        ClientCAs:    caCertPool,
        ClientAuth:   tls.RequireAndVerifyClientCert,
    }

    server := &http.Server{
        Addr:      ":8080",
        TLSConfig: tlsConfig,
    }

    fmt.Println("Server started on wss://localhost:8080/ws")
    log.Fatal(server.ListenAndServeTLS("", ""))
}   




<template>
  <div id="app">
    <button @click="sendMessage">Send Message</button>
    <p>{{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      socket: null,
      message: ''
    };
  },
  mounted() {
    // 创建 WebSocket 实例
    this.socket = new WebSocket('wss://localhost:8080/ws');

    // 监听 WebSocket 连接成功事件
    this.socket.onopen = () => {
      console.log('Connected to the WebSocket server');
    };

    // 监听 WebSocket 接收到消息事件
    this.socket.onmessage = (event) => {
      this.message = event.data;
    };

    // 监听 WebSocket 连接关闭事件
    this.socket.onclose = () => {
      console.log('Disconnected from the WebSocket server');
    };
  },
  methods: {
    sendMessage() {
      if (this.socket.readyState === WebSocket.OPEN) {
        this.socket.send('Hello, server!');
      }
    }
  }
};
</script>

<style scoped>
button {
  padding: 10px 20px;
  font-size: 16px;
}
p {
  margin-top: 20px;
  font-size: 18px;
}
</style>   

您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

快速回复 返回顶部 返回列表