2016-05-13 2 views
1

Вот моя сторона сервера:Chrome, NodeJS и HTTPS

var fs = require('fs'); 

var options = { 
    key: fs.readFileSync('/cert.key'), 
    cert: fs.readFileSync('/cert.crt') 
}; 

var app = require('express')(); 
var http = require('https').Server(options, app); 
var io = require('socket.io')(http); 
var port = 1234; 

app.get('/', function(req, res){ 
    res.sendFile(__dirname + '/../subdomains/labs/socketio.html'); 
}); 

io.on('connection', function(socket){ 
    socket.on('chat message', function(msg){ 
    io.emit('chat message', msg); 
    }); 
}); 

http.listen(port, function(){ 
    console.log("\n\n--------------------------------"); 
    console.log('Currently Listening on port %d',port); 
    console.log("--------------------------------\n\n"); 
}); 

И мой клиент сторона:

<script src="https://cdn.socket.io/socket.io-1.2.0.js"></script> 
<script src="https://code.jquery.com/jquery-1.11.1.js"></script> 
<script> 
    var socket = io('https://labs.domain.com:1234'); 
    $('form').submit(function(){ 
     socket.emit('chat message', $('#chat-message').val()); 
     $('#chat-message').val(''); 
     return false; 
    }); 
    socket.on('chat message', function(msg){ 
     $('#messages').append($('<li>').text(msg)); 
    }); 
</script> 

Все отлично работает в Internet Explorer (! Аги) Но при использовании его в хроме это штампы:

GET https://labs.domain.com:1234/socket.io/?EIO=3&transport=polling&t=1463123926844-3 net::ERR_INSECURE_RESPONSE 

Он отлично работает в обоих браузерах, если я удалю его HTTPS-аспект.

Это довольно неприятно, поскольку, похоже, проблема связана только с Chrome, а именно с браузером, который я использую больше всего. Как я могу это исправить?

+0

Помогает ли [это] (http://stackoverflow.com/a/25075349)? – robertklep

+0

Прочтите следующее: [Не удалось загрузить ресурс: net :: ERR_INSECURE_RESPONSE] (http://stackoverflow.com/questions/23688565/failed-to-load-resource-neterr-insecure-response). – jfriend00

+0

@robertklep: нет, потому что я не могу задать вопрос, когда я делаю новый бит вкладки. Он просто говорит «продолжай все равно», а затем я получаю ту же страницу. Но даже в этом случае мне нужно иметь возможность использовать NodeJS через SSL, без того, чтобы мои пользователи переживали кучу бессмыслицы. – Chud37

ответ

2

У меня возникли проблемы с Chrome, не разрешающими безопасные соединения в сети, если есть какие-либо проблемы с сертификатами. Я смог получить socket.io, работая с нашим приложением здесь, используя сертификаты, полученные через LetsEncrypt. Я не говорю, что это единственный способ сделать это, но вот как настраивается наша (рабочая) конфигурация:

1 - У меня и моего товарища по команде есть динамическая настройка DNS, чтобы указать на каждую из наших разработок машины (например: mac.example.com)

2 - У каждого из нас есть сертификаты, настроенные для наших доменов (например, mac.example.com), полученные из LetsEncrypt; причина этого заключается в том, что Chrome очень придирчив к сертификатам, которые вы используете, когда он устанавливает WebSockets, и нет (в настоящее время) для разработчика или конечного пользователя переопределять и принимать сертификаты, которые менее безопасны/самозаписываются.

3 - Наш код, который настраивает Socket.io в нашем Node.js приложение выглядит следующим образом:

const server = https.createServer(/* ssl options: cert etc. */, myExpressApp) 
const io = require('socket.io')(server) 

Мы используем Socket.io v1.4.6

Это звучит как вопрос с вашего вопроса что сертификаты настроены на вашем сервере, но, как и Chrome, все еще жалуются на них. Вероятно, это преступник, и похоже, что у вас могут быть привилегии sysadmin, чтобы изменить его?

TL; DR Не используйте самоподписанные сертификаты или сертификаты, которые Chrome может считать «менее» безопасными.