在 Express 应用程序中使用 SSL

发布时间:2021-02-25 21:10

我继承了一个想要进一步开发的应用程序。它基于 Express 和 Peerjs,有一个服务器和一个客户端 (vue.js) 应用程序。

应用程序的一部分是视频流。为了测试应用程序,我想从我自己网络内的不同设备访问它。这目前不起作用,因为应用程序不使用 SSL,但 getUserMedia() 需要 SSL。

但是,我无法使用 SSL。

这是服务器的app.js:

const Express = require("express")();
const { ExpressPeerServer } = require('peer');
const Http = require("https").Server(Express);
const Socketio = require("socket.io")(Http);

const fs = require('fs');
var privateKey = fs.readFileSync('key.pem');
var certificate = fs.readFileSync('cert.pem');

const peerServer = ExpressPeerServer(Http, {
    debug: true,
    key: 'peerjs',
    allow_discovery: true,
    ssl: {
        key: privateKey,
        cert: certificate
    }
});


Express.use('/peerjs', peerServer);

/* some methods here */

Http.listen(3000, () => {
    console.log("Listening at: 3000");
});

这是在客户端内部:

let Socket = io("https://192.168.178.28:3000");
let myPeer = new Peer(undefined, {
  host: "192.168.178.28",
  port: "3000",
  path: "/peerjs",
  key: "peerjs",
});

这是 vue.config.js:

module.exports = {
    devServer: {
        host: '192.168.178.28',
        port: 443,
    },
};

这对我不起作用。在 Chrome 中,如果我打开 https://192.168.178.28:443,我会收到“ERR_SSL_PROTOCOL_ERROR”错误,如果我使用 http://,我会收到“ERR_SSL_VERSION_OR_CIPHER_MISMATCH”错误。

在 Firefox 中,我收到一条“SSL_ERROR_RX_RECORD_TOO_LONG”消息。

有什么想法吗?

回答1

我明白了。如果以后有人遇到这个问题:

将 app.js 更改为:

const app = require('express')();
const http = require('http').createServer(app);
const https = require('https');
var server = https.createServer({
    key: fs.readFileSync('./key.pem'),
    cert: fs.readFileSync('./cert.pem')
},app);

const io = require("socket.io")(server);
const { ExpressPeerServer } = require('peer');

const customGenerationFunction = () => (Math.random().toString(36) + '0000000000000000000').substr(2, 16);

const peerServer = ExpressPeerServer(server, {
    generateClientId: customGenerationFunction,
    debug: true,
    port: 3000,
    key: 'peerjs',
    ssl:{
        key: fs.readFileSync('./key.pem'),
        cert: fs.readFileSync('./cert.pem')
    },
    allow_discovery: true
});

server.listen(3000, () => {
    console.log("https listening at: 3000");
});

客户端内部:

let Socket = io.connect("https://192.168.178.28:3000"); 
let myPeer = new Peer(undefined, {
  host: "192.168.178.28",
  port: "3000",
  path: "/peerjs",
  key: "peerjs",
});

最后,vue.config.js:

module.exports = {
    devServer: {
        https: true
    },
};