自签名CA证书支持wss服务

1,220 阅读1分钟

最近在开发项目时候需要用到流式快速获取数据的场景,调研之后决定使用websocket,但在开发中遇到了问题,项目内所有的请求和API都是https协议,因为安全问题不能使用WS协议,没办法只能使用WSS

自签名CA证书

 1.生成私钥
$ openssl genrsa -out server.key 2048

# 2.生成 CSR (Certificate Signing Request)
$ openssl req \
    -subj "/CN=192.168.74.212" \   //这里在开发环境使用IP 
    -new \
    -key server.key \
    -out server.csr

# 3.生成自签名证书
$ openssl x509 \
    -req \
    -days 3650 \
    -in server.csr \
    -signkey server.key \
    -out server.crt

server端

const https = require('https');
const fs = require('fs');
import * as WebSocket from "ws"

const options = {
  key: fs.readFileSync('./server.key'),
  cert: fs.readFileSync('./server.crt')
};

const server = https.createServer(options, (req: any, res: any) => {
  console.log(req)
  res.writeHead(200);
  res.end('Hello, world!');
});

const wss = new WebSocket.Server({ server });

wss.on('connection', (socket) => {
  console.log('Client connected');

  socket.on('message', (message) => {
    console.log(`Received message: ${message}`);

    // Echo the message back to the client
    socket.send(`You said: ${message}`);
  });

  socket.on('close', () => {
    console.log('Client disconnected');
  });
});

server.listen(9988, () => {
  console.log('Server listening on port 9988');
});

client

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      const socket = new WebSocket('wss://192.168.74.212:9988/');

      socket.addEventListener('open', (event) => {
        console.log('Connected to server');

        // Send a message to the server
        socket.send('Hello, server!');
      });

      socket.addEventListener('message', (event) => {
        console.log(`Received message: ${event.data}`);
      });

      socket.addEventListener('close', (event) => {
        console.log('Disconnected from server');
      });
    </script>
  </body>
</html>

首先在浏览器请求 https://192.168.74.212:9988 获取证书,再打开client端请求可以解决 websocket connenct faild 的问题