最近在开发项目时候需要用到流式快速获取数据的场景,调研之后决定使用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 的问题