Задать вопрос
@codeZlo

Как правильно установить SSL сертификат с Node.js скриптом (Socket.io)?

Установил бесплатный SSL от reg.ru на скрипт на node.js следующим образом (бэк):
var https = require('https')
var options = {
    key:    fs.readFileSync('1.pem').toString(),
    cert:   fs.readFileSync('2.pem').toString()
}
var app = https.createServer(options)
var io = require('socket.io').listen(app) 
app.listen(config.port || 8083)

фронт:
var socketIO = io('https://domain.com:8080' || 'https://domain.com:8083', {secure: true})
socketIO.once('connect', function(){
})

На Mac OS в Хроме всё отлично работает, подключается. На Windows в Хроме бесконечная ошибка:
socket.io-1.4.5.js:1 GET https://domain.com:8080/socket.io/?EIO=3&transport=polling&t=MZ3p6fg net::ERR_SSL_PROTOCOL_ERROR socket.io-1.4.5.js:1

Ребят, помогите, пожалуйста, весь мозг сломал. В чём может быть проблема?

1.pem - -----BEGIN RSA PRIVATE KEY-----
2.pem - -----BEGIN CERTIFICATE-----
  • Вопрос задан
  • 4978 просмотров
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 2
@BorisKorobkov
Web developer
Возможно, сертификат кривой. Укажите ссылку на свой сайт.

Попробуйте другой сертификат. Например, letsencrypt
Ответ написан
@de1m
Из моего старого ответа.

На одном порту работать не будет, надо два порта.
Я поменял пример, но этот у меня точно работает, всего на двух портах
var express = require('express');  
var app = express();  
var server = require('http').createServer(app);  
var io = require('socket.io')(server);
var fs = require('fs');
var https = require('https');

app.set('views', __dirname + '/views')
app.set('view engine', 'pug')
app.use(express.static(__dirname + '/public'))

server.listen(5000, function () {
  console.log('Server listening at port %d', 5000);
});

const opts = {
  key: fs.readFileSync('privateKey.key'),
  cert: fs.readFileSync('certificate.crt')
}

var httpsServer = https.createServer(opts, app);
httpsServer.listen(5001, function(){
  console.log("HTTPS on port " + 5001);
})

app.get('/', function (req, res) {
  res.render('index');
})

io.attach(httpsServer);
io.attach(server);

io.on('connection', function(client) {  
    console.log('Client connected...');
    client.on('click', function(data){
      console.log(JSON.parse(data));
        setTimeout(function() {
          client.emit("ok", "data");
        }, 3000);
    })
});


Со стороны клиента надо добавить проверку http или https.
if (window.location.protocol != "https:"){
        var socket = io.connect('https://localhost:5001');    
    } else {
        var socket = io.connect('http://localhost:5000');
    }
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы