Как использовать HTTPS на Node.js с помощью Express/Socket.io
Я пытаюсь запустить мой сервер node с https. Я использую express и socket.io.
Это мой код для https:
var httpsPort = 443;
var privateKey = fs.readFileSync(mykeypath');
var certificate = fs.readFileSync(mycertificatepath');
var credentials = {key: privateKey, cert: certificate};
var https = require('https').Server(credentials,app);
var io = require('socket.io')(https);
https.listen(httpsPort, function(){
logger.info('listening on *:' + httpsPort);
});
app.get('/initGame', function (req,res){
var slots = require('./slots.json', 'utf8');
var userObject = {
address : req.connection.remoteAddress,
userAgent : req.headers['user-agent']
};
db.getPlayedGames(userObject,function(playedGames){
logger.debug(playedGames);
if(typeof playedGames == 'undefined' ){
playedGames=0;
}else{
playedGames = playedGames.games_played;
}
var spinsLeft = 10-playedGames;
res.json({
spinsLeft: spinsLeft,
slots: slots
});
});
});
на моем клиенте следующее:
var myServer = "//" + document.domain + ":443";
$.get( myServer + "/initGame", function(data) {
totalSpinsLeft = data.spinsLeft;
$('#trysLeft').text(totalSpinsLeft);
Seven.init(data.slots);
}).fail(function(){
setTimeout(function(){
$('#spinner2').text('Fehler bitte neu laden!');
},3000);
});
Теперь я получаю следующее исключение на своем сервере:
uncaughtException: Отсутствует PFX или сертификат + закрытый ключ.
EDIT: прямо сейчас im получает
Неверный запрос
Ваш браузер отправил запрос, который этот сервер не мог понять.
Причина. Вы говорите простой HTTP на сервер с поддержкой SSL.
Вместо этого используйте схему HTTPS для доступа к этому URL-адресу.
Ответы
Ответ 1
Трудно проверить ваш пример без файлов ключей и сертификатов, вместо этого я приведу пример, когда я использую Express, socket.io и https.
Сначала я создам файлы ключей и сертификатов, поэтому внутри каталога запустите следующие команды с вашего терминала:
Приведенная ниже команда будет генерировать файл, содержащий ключ RSA.
$ openssl genrsa 1024 > file.pem
Здесь вам будет предложено ввести данные, но вы можете оставить пустым нажатие, пока не будет сформирован crs.pem.
$ openssl req -new -key file.pem -out csr.pem
Затем будет создан файл file.crt, содержащий сертификат SSL.
$ openssl x509 -req -days 365 -in csr.pem -signkey file.pem -out file.crt
Итак, в моем app.js
файле, где я устанавливаю и запускаю уведомление сервера, что я использую файлы file.pem
и file.crt
, сгенерированные на последнем шаге:
var fs = require('fs');
var https = require('https');
var express = require('express');
var app = express();
var options = {
key: fs.readFileSync('./file.pem'),
cert: fs.readFileSync('./file.crt')
};
var serverPort = 443;
var server = https.createServer(options, app);
var io = require('socket.io')(server);
app.get('/', function(req, res) {
res.sendFile(__dirname + '/public/index.html');
});
io.on('connection', function(socket) {
console.log('new connection');
socket.emit('message', 'This is a message from the dark side.');
});
server.listen(serverPort, function() {
console.log('server up and running at %s port', serverPort);
});
а затем my public/index.html
, где я использую сервер:
<!doctype html>
<html>
<head>
</head>
<body>
<h1>I am alive!!</h1>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.3.5/socket.io.js"></script>
<script>
var URL_SERVER = 'https://localhost:443';
var socket = io.connect(URL_SERVER);
socket.on('message', function(data) {
alert(data);
});
</script>
</body>
</html>
то, наконец, если вы получите доступ из браузера в https://localhost
, вы увидите предупреждение с сообщением, которое приходит с сервера веб-сервера.
Ответ 2
Вот как мне удалось настроить его с помощью выражения:
var fs = require( 'fs' );
var app = require('express')();
var https = require('https');
var server = https.createServer({
key: fs.readFileSync('./test_key.key'),
cert: fs.readFileSync('./test_cert.crt'),
ca: fs.readFileSync('./test_ca.crt'),
requestCert: false,
rejectUnauthorized: false
},app);
server.listen(8080);
var io = require('socket.io').listen(server);
io.sockets.on('connection',function (socket) {
...
});
app.get("/", function(request, response){
...
})
Я надеюсь, что это сэкономит время.