2016-02-22 2 views
1

Я создал сертификат SSL с openssl на debian 8 VM. Поэтому у меня есть один файл PEM, содержащий мой ключ и мой сертификат.Безопасные обмены с использованием только socket-io и веб-клиента (socket io js)

Я хотел бы знать, можно ли использовать сертификат SSL без https, express и т. Д., Просто используя архитектуру с сокетами ввода-вывода IO (на стороне сервера) и сокетов IO (клиентская сторона).

сторона сервера:

var fs   = require("fs") 
, options  = { 
    key  : fs.readFileSync('./test/apache.pem'), 
    cert : fs.readFileSync('./test/apache.pem') 
} 

var io = require('socket.io').listen(45621, options) 

io.sockets.on("connection", function(socket) { 
    console.log("socket " + socket.id + " connected !") 
}) 

стороны клиента: (Я использую простой HTML-клиент)

<script src="http://code.jquery.com/jquery-latest.min.js"></script> 
<script src="socket-io-1-2-1.js"></script> 
<script> 
    var socket = io.connect('https://localhost:45621', {secure: true}) 
    socket.on("connect", function() { alert("we are connected to socket io!") }) 
</script> 

Когда я бег моей страницы клиента, я автоматически получать соединение близко. (Нетто :: ERR_CONNECTION_CLOSED)

Это работает, если я удалить параметры SSL в стороне сервера и изменить клиентское соединение с:

io.connect("http://localhost:45621") 

но обмены не являются безопасными?

Редактировать: Не является дубликатом this, потому что я не хочу использовать http, https, express by createServer. Я использую только сокет io.

+1

Длинный выстрел, но как насчет 'wss: // localhost: 45621'? – zero298

+0

Такая же ошибка, я получаю силовое замыкание –

+0

Возможный дубликат [Настройка SSL-соединения с сервером-сервером с использованием socket.io в node.js] (http: // stackoverflow.com/questions/21651133/setup-server-server-ssl-communication-use-socket-io-in-node-js) –

ответ

5

Я думаю, что это не возможно, чтобы использовать только сокет--й сервер для обеспечения безопасности обмена, если хочет, чтобы ваш клиент, чтобы соединиться с «WSS: //» или «https: //». Я нашел решение, но для этого нужно требовать «HTTPS», «экспресс» библиотеки, даже если вы не используете их и создать свой сервер, как это:

var https = require('https') 
, fs = require('fs') //require fs to read your key & cert 
, app = require("express") 
, key = fs.readFileSync('<<PATH TO YOUR SSL KEY>>apache.key', 'utf8') 
, cert = fs.readFileSync('<<PATH TO YOUR SSL CERT>>apache.crt', 'utf8') 

var server = https.createServer({key: key, cert: cert}, app); //then create your server 

server.listen(45621) 
var io = require("socket.io").listen(server); 

io.sockets.on("connection", function(socket) { 
    console.log("socket id " + socket.id + " connected !") 
    socket.on("foo", function() { console.log("bar") }) 
}) 

Тогда ваш веб-клиент должен быть таким:

<script src="https://code.jquery.com/jquery-latest.min.js"></script> 
<script src="https://cdn.socket.io/socket.io-1.4.5.js"></script> 
<script> 
    var socket = io.connect("https://192.168.0.35:45621/socket.io/?EIO=3&transport=websocket") 
    socket.on("connect", function() { alert("my socket is connected !") }) 
</script> 

Если вы хотите проверить сертификат SSL для локального хоста, не пишите «локальный» в шаге «общее имя» с командой OpenSSL, но написать свой локальный IP (192.168.0.35 для меня). Затем с клиентом, не связывает с https://localhost, но с этим следующим адресом:

https://YOUR LOCAL IP: ВАШ SERVER PORT/socket.io/EIO = 3 & транспорта = WebSocket

В этот момент, я» у меня проблема, я могу подключить мой сокет к своему io-серверу, но я не могу испускать и получать какие-либо испускания. Я пробовал this solution, но он не работает. Я отредактирую этот пост, когда найду проблему.

Edit: Вы должны запустить веб-клиент через https: //, не HTTP: //. Протокол http разрешил ваш сокет для подключения к вашему серверу io, но вы ничего не можете (события emit/receive).

+0

Блестяще спасибо. Основываясь на вашем коде, мне удалось заставить мой сервер сокетов MQTT, наконец, работать над SSL. – CMP