2015-07-08 3 views
2

A (простой) чат является частью приложения, которое я создал некоторое время назад. Сегодня я перехожу на сайт с http на https. Поэтому у меня также есть SSL-сокет для Socket.io, иначе браузеры будут скулить.Socket.io чат-сервер, не представляющий сертификат SSL

По какой-то причине, хотя мой чат-сервер вообще не предъявляет никаких сертификатов. Использование OpenSSL на Linux подтверждает это:

openssl s_client -connect my.subdomain.tld:1337 -servername my.subdomain.tld -ssl3 

возвращает

CONNECTED(00000003) 
140136057653064:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:596: 
--- 
no peer certificate available 
--- 
No client certificate CA names sent 
--- 
SSL handshake has read 0 bytes and written 0 bytes 
--- 
New, (NONE), Cipher is (NONE) 
Secure Renegotiation IS NOT supported 
Compression: NONE 
Expansion: NONE 
SSL-Session: 
    Protocol : SSLv3 
    Cipher : 0000 
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg : None 
    Krb5 Principal: None 
    PSK identity: None 
    PSK identity hint: None 
    Start Time: 1436357417 
    Timeout : 7200 (sec) 
    Verify return code: 0 (ok) 
--- 

я, очевидно, замененные домены. Порт на самом деле 1337, и сервер использует SNI, поэтому я считаю, что мне нужно использовать аргумент -servername?

Мой сервер Узел (упрощенно):

var fs = require('fs'); 
var privateKey = fs.readFileSync('/home/ssl_certificates/my_subdomain_tld.key').toString(); 
var certificate = fs.readFileSync('/home/ssl_certificates/my_subdomain_tld.crt').toString(); 
var ca = fs.readFileSync('/home/ssl_certificates/AddTrustExternalCARoot.crt').toString(); 
var io = require('socket.io').listen(1337, {key: privateKey, cert: certificate, 'ca': ca}); 

сертификаты существуют в этом месте, и они действительны (перепроверили). Как я могу отлаживать это? Почему Socket.IO не представляет сертификат?

+1

Возможный дубликат: http://stackoverflow.com/questions/15449234/socket-io-cant-connect-through-https –

+0

Не проще ли было бы хранить socket.io за фактическим веб-сервером, например nginx? Пусть nginx обрабатывает сертификаты. – bluesman

+0

Нет. Я не хочу настраивать веб-сервер для чат-сервера. – Basaa

ответ

2

Как вы можете видеть в docs listen is instance method of Server class. Сначала создайте сервер https, присоедините к нему сертификаты и передайте его в конструктор Server().

var https = require('https'); 
var fs = require('fs'); 

var options = { 
    key: fs.readFileSync('~/.certs/my-sub.key'), 
    cert: fs.readFileSync('~/.certs/my-sub.crt') 
}; 

var app = https.createServer(options); 
var io = require('socket.io')(app); 

app.listen(1337); 

Существует документированная возможность запуска сервера с помощью socket.io сам описал here .Options, которые могут быть переданы, чтобы Io Server() метода перечислены в engine.io docs. Похоже, вы не можете прикреплять к нему сертификаты.

+0

Ха, интересно! Но это работает! Спасибо большое, очень благодарен :) – Basaa

+0

запустил меня, но если кому-то тоже нужно выразить - посмотрите на https://stackoverflow.com/a/11745114/3022387 ... по существу: https.createServer (credential_options, express_app) – flowtron

Смежные вопросы