Socket.io聊天服务器不提供SSL证书

时间:2015-07-08 12:17:52

标签: javascript node.js ssl websocket socket.io

(简单)聊天是我之前创建的应用程序的一部分。今天我将网站从http切换到https。因此,我还必须SSL我的Socket.io聊天套接字,否则浏览器会发牢骚。

出于某种原因,虽然我的聊天服务器根本没有提供任何证书。在linux上使用openssl确认了这一点:

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 个答案:

答案 0 :(得分:2)

正如您在docs中看到的,listen是Server类的实例方法。 首先实例化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来启动服务器。可以传递给io的Server()方法的选项列在engine.io docs中。好像你不能附上证书。