我正在使用运行在同一Ubuntu虚拟机上的NodejS客户端和服务器应用程序。我设法让他们通过TLS连接工作。问题是我无法使服务器应用程序以令人满意的方式响应。例如,当客户端向服务器发送路径选项param1时,服务器应以value1进行响应,但这不会发生。我得到一个错误。您能否提出解决此问题的简单方法?没有安全性,当客户端是Web浏览器时,我可能会从服务器获得期望的响应。
服务器正在运行并且运行客户端时,出现以下错误:
events.js:183
throw er; // Unhandled 'error' event
^
Error: connect ENOENT /param1
at Object._errnoException (util.js:1022:11)
at _exceptionWithHostPort (util.js:1044:20)
at PipeConnectWrap.afterConnect [as oncomplete] (net.js:1198:14)
我的客户是:
const tls = require('tls');
const fs = require('fs');
const https = require("https")
const options = {
key: fs.readFileSync('cl.key.pem'),
cert:fs.readFileSync('cl.cert.pem'),
ca: fs.readFileSync('ca.cert.pem'),
passphrase:'1111',
hostname:'localhost',
port:8000,
path: '/param1',
method: 'GET'
};
var socket = tls.connect(8000, 'localhost', options, () => {
console.log('client connected',
socket.authorized ? 'authorized' : 'unauthorized');
process.stdin.pipe(socket);
process.stdin.resume();
});
socket.on('data', (data) => {
console.log(data);
});
socket.on('end', () => {
console.log('Ended')
});
const req = https.request(options, (res) => {
console.log(`STATUS: ${res.statusCode}`);
console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
res.setEncoding('utf8');
res.on('data', (chunk) => {
console.log(`BODY: ${chunk}`);
});
res.on('end', () => {
console.log('No more data in response.');
});
});
req.on('error', (e) => {
console.error(`problem with request: ${e.message}`);
});
我的服务器是:
const tls = require('tls');
const fs = require('fs');
const express = require ('express')
var bodyParser = require('body-parser');
const options = {
key: fs.readFileSync('host.key.pem'),
cert: fs.readFileSync('host.cert.pem'),
requestCert: true,
ca:fs.readFileSync('ca.cert.pem'),
passphrase: '1111',
};
const server = tls.createServer(options, (socket) => {
console.log('server connected',
socket.authorized ? 'authorized' : 'unauthorized')
});
server.listen(8000, () => {
console.log('server bound');
});
const app = express()
app.use(bodyParser.urlencoded({extended:false}))
app.use(bodyParser.json())
const port = 8000
app.get('/x',(req,res) => {
o="";
if(req.params.x == "param1") {
o = "value1";
}
else if(req.params.x == "param2") {
o = "value2";
}
else if(req.params.x == "param3") {
o = "value3";
}
res.status(200).send('${req.params.x} is ${o}');})
app.post('/getinfo',(req,res)=>res.status(200).send(`Thank you
${req.body.name} for adding yourself to our database`))
答案 0 :(得分:1)
您正在代码中混合使用TLS和HTTPS。
如果只需要安全的客户端-服务器通信,则不必使用HTTPS和express。您可以只通过socket
发送和接收数据。
如果您需要支持Web请求,请不要创建TLS服务器,而要使用HTTPS并将您的express应用插入HTTPS服务器:
var express = require('express')
var fs = require('fs')
var https = require('https')
var app = express()
https.createServer({
key: fs.readFileSync('cl.key.pem'),
cert: fs.readFileSync('cl.cert.pem')
}, app)
.listen(8000, function () {
console.log('listening on port 8000')
})
从理论上讲,您可以有2台服务器,其中一台仅运行TLS,一台在HTTPS上,但是它们需要在不同的端口上启动。