如何将此 http Node.Js 传输到 https 上的 运行?
How Can I Transfer This http Node.Js to run on https?
最近我创建了一个使用http 的node js 和webrtc 项目。但我注意到 webrtc 仅适用于 https。那么如何将这个基于 http 的节点 js 文件传输到基于 https 的文件呢?请帮助我。
我真的不知道该怎么做。所以请帮助我做到这一点。需要的是通过 https 运行 这个文件。不在 http 中。如您所见,下面的代码仅使用 http。由于 webrtc 需要通过 https 运行,我只需要将此文件也通过 https 运行
var hat = require('hat')
var http = require('http')
var nodeStatic = require('node-static')
var ws = require('ws')
var PORT = process.argv[2] || 4000
var httpServer = http.createServer()
var staticServer = new nodeStatic.Server('./public')
var wsServer = new ws.Server({ server: httpServer })
var peers = {}
var waitingId = null
var count = 0
httpServer.on('request', function (req, res) {
req.addListener('end', function () {
staticServer.serve(req, res)
}).resume()
})
wsServer.on('connection', onconnection)
function onconnection (peer) {
var send = peer.send
peer.send = function () {
try {
send.apply(peer, arguments)
} catch (err) {}
}
peer.id = hat()
peers[peer.id] = peer
peer.on('close', onclose.bind(peer))
peer.on('error', onclose.bind(peer))
peer.on('message', onmessage.bind(peer))
count += 1
broadcast(JSON.stringify({ type: 'count', data: count }))
}
function onclose () {
peers[this.id] = null
if (this.id === waitingId) {
waitingId = null
}
if (this.peerId) {
var peer = peers[this.peerId]
peer.peerId = null
peer.send(JSON.stringify({ type: 'end' }), onsend)
}
count -= 1
broadcast(JSON.stringify({ type: 'count', data: count }))
}
function onmessage (data) {
console.log('[' + this.id + ' receive] ' + data + '\n')
try {
var message = JSON.parse(data)
} catch (err) {
console.error('Discarding non-JSON message: ' + err)
return
}
if (message.type === 'peer') {
if (waitingId && waitingId !== this.id) {
var peer = peers[waitingId]
this.peerId = peer.id
peer.peerId = this.id
this.send(JSON.stringify({
type: 'peer',
data: {
initiator: true
}
}), onsend)
peer.send(JSON.stringify({
type: 'peer'
}), onsend)
waitingId = null
} else {
waitingId = this.id
}
} else if (message.type === 'signal') {
if (!this.peerId) return console.error('unexpected `signal` message')
var peer = peers[this.peerId]
peer.send(JSON.stringify({ type: 'signal', data: message.data }))
} else if (message.type === 'end') {
if (!this.peerId) return console.error('unexpected `end` message')
var peer = peers[this.peerId]
peer.peerId = null
this.peerId = null
peer.send(JSON.stringify({ type: 'end' }), onsend)
} else {
console.error('unknown message `type` ' + message.type)
}
}
function onsend (err) {
if (err) console.error(err.stack || err.message || err)
}
function broadcast (message) {
for (var id in peers) {
var peer = peers[id]
if (peer) {
peer.send(message)
}
}
}
httpServer.listen(PORT, function () {
console.log('Listening on port ' + PORT)
})
- 以低于 15.00 美元/年的价格(对于 .com)注册站点域,包括 whois 保护。
- 创建一个免费的 Cloudflare 帐户并设置您的新域名,配置 DNS 以代理和处理您计划在该域下托管的 IP。
- 通过 cloudflare SSL 密钥生成,并在您的项目中使用证书。只要 DNS 路由说出您的家庭 IP 或服务器 IP,它就会保持该 HTTPS。
出于测试目的,您可以使用伪造的 key/cert,但在执行上述步骤之前,这将始终显示不安全。
在 NodeJS 中启用 HTTPS:
const HTTPS = require('https');
const FILESYSTEM = require('fs');
// CREATE HTTP APP HERE THEN CREATE HTTPS SERVER FOR THE APP
HTTPS.createServer({ key: FILESYSTEM.readFileSync(__dirname + '/certs/key.pem'), cert: FILESYSTEM.readFileSync(__dirname + '/certs/cert.pem') }, app).listen(443);
HTTPS 需要与域名匹配的安全证书。生产使用的域名和证书都可以在线购买,并且有有效期,需要续订。
证书包含两个文件cert.pem
和key.pem
。
对于本地开发,可以为 localhost
域生成一个自签名的不受信任的证书(通过 openssl 命令行工具)。
openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'
原始代码可以从 'http' 更新为 'https',这两个文件需要加载并作为选项传递给 https.createServer()
我还必须更新对 'node-static' 的调用,因为它不提供本地文件。
var hat = require('hat')
var https = require('https') // updated
const fs = require('fs');
var nodeStatic = require('node-static')
var ws = require('ws')
var PORT = process.argv[2] || 4000
const options = {
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
};
var httpServer = https.createServer(options) // updated
var staticServer = new nodeStatic.Server('./public')
var wsServer = new ws.Server({ server: httpServer })
var peers = {}
var waitingId = null
var count = 0
httpServer.on('request', function (req, res) { // updated
staticServer.serve(req, res)
})
// the rest of the original code
// httpServer variable is now an HTTPS server instance
httpServer.listen(PORT, function () {
console.log('Listening on port ' + PORT)
})
启动服务器访问https://localhost:4000 会提示不可信证书警告,您必须确认。
最近我创建了一个使用http 的node js 和webrtc 项目。但我注意到 webrtc 仅适用于 https。那么如何将这个基于 http 的节点 js 文件传输到基于 https 的文件呢?请帮助我。
我真的不知道该怎么做。所以请帮助我做到这一点。需要的是通过 https 运行 这个文件。不在 http 中。如您所见,下面的代码仅使用 http。由于 webrtc 需要通过 https 运行,我只需要将此文件也通过 https 运行
var hat = require('hat')
var http = require('http')
var nodeStatic = require('node-static')
var ws = require('ws')
var PORT = process.argv[2] || 4000
var httpServer = http.createServer()
var staticServer = new nodeStatic.Server('./public')
var wsServer = new ws.Server({ server: httpServer })
var peers = {}
var waitingId = null
var count = 0
httpServer.on('request', function (req, res) {
req.addListener('end', function () {
staticServer.serve(req, res)
}).resume()
})
wsServer.on('connection', onconnection)
function onconnection (peer) {
var send = peer.send
peer.send = function () {
try {
send.apply(peer, arguments)
} catch (err) {}
}
peer.id = hat()
peers[peer.id] = peer
peer.on('close', onclose.bind(peer))
peer.on('error', onclose.bind(peer))
peer.on('message', onmessage.bind(peer))
count += 1
broadcast(JSON.stringify({ type: 'count', data: count }))
}
function onclose () {
peers[this.id] = null
if (this.id === waitingId) {
waitingId = null
}
if (this.peerId) {
var peer = peers[this.peerId]
peer.peerId = null
peer.send(JSON.stringify({ type: 'end' }), onsend)
}
count -= 1
broadcast(JSON.stringify({ type: 'count', data: count }))
}
function onmessage (data) {
console.log('[' + this.id + ' receive] ' + data + '\n')
try {
var message = JSON.parse(data)
} catch (err) {
console.error('Discarding non-JSON message: ' + err)
return
}
if (message.type === 'peer') {
if (waitingId && waitingId !== this.id) {
var peer = peers[waitingId]
this.peerId = peer.id
peer.peerId = this.id
this.send(JSON.stringify({
type: 'peer',
data: {
initiator: true
}
}), onsend)
peer.send(JSON.stringify({
type: 'peer'
}), onsend)
waitingId = null
} else {
waitingId = this.id
}
} else if (message.type === 'signal') {
if (!this.peerId) return console.error('unexpected `signal` message')
var peer = peers[this.peerId]
peer.send(JSON.stringify({ type: 'signal', data: message.data }))
} else if (message.type === 'end') {
if (!this.peerId) return console.error('unexpected `end` message')
var peer = peers[this.peerId]
peer.peerId = null
this.peerId = null
peer.send(JSON.stringify({ type: 'end' }), onsend)
} else {
console.error('unknown message `type` ' + message.type)
}
}
function onsend (err) {
if (err) console.error(err.stack || err.message || err)
}
function broadcast (message) {
for (var id in peers) {
var peer = peers[id]
if (peer) {
peer.send(message)
}
}
}
httpServer.listen(PORT, function () {
console.log('Listening on port ' + PORT)
})
- 以低于 15.00 美元/年的价格(对于 .com)注册站点域,包括 whois 保护。
- 创建一个免费的 Cloudflare 帐户并设置您的新域名,配置 DNS 以代理和处理您计划在该域下托管的 IP。
- 通过 cloudflare SSL 密钥生成,并在您的项目中使用证书。只要 DNS 路由说出您的家庭 IP 或服务器 IP,它就会保持该 HTTPS。
出于测试目的,您可以使用伪造的 key/cert,但在执行上述步骤之前,这将始终显示不安全。
在 NodeJS 中启用 HTTPS:
const HTTPS = require('https');
const FILESYSTEM = require('fs');
// CREATE HTTP APP HERE THEN CREATE HTTPS SERVER FOR THE APP
HTTPS.createServer({ key: FILESYSTEM.readFileSync(__dirname + '/certs/key.pem'), cert: FILESYSTEM.readFileSync(__dirname + '/certs/cert.pem') }, app).listen(443);
HTTPS 需要与域名匹配的安全证书。生产使用的域名和证书都可以在线购买,并且有有效期,需要续订。
证书包含两个文件cert.pem
和key.pem
。
对于本地开发,可以为 localhost
域生成一个自签名的不受信任的证书(通过 openssl 命令行工具)。
openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -subj '/CN=localhost'
原始代码可以从 'http' 更新为 'https',这两个文件需要加载并作为选项传递给 https.createServer()
我还必须更新对 'node-static' 的调用,因为它不提供本地文件。
var hat = require('hat')
var https = require('https') // updated
const fs = require('fs');
var nodeStatic = require('node-static')
var ws = require('ws')
var PORT = process.argv[2] || 4000
const options = {
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
};
var httpServer = https.createServer(options) // updated
var staticServer = new nodeStatic.Server('./public')
var wsServer = new ws.Server({ server: httpServer })
var peers = {}
var waitingId = null
var count = 0
httpServer.on('request', function (req, res) { // updated
staticServer.serve(req, res)
})
// the rest of the original code
// httpServer variable is now an HTTPS server instance
httpServer.listen(PORT, function () {
console.log('Listening on port ' + PORT)
})
启动服务器访问https://localhost:4000 会提示不可信证书警告,您必须确认。