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

(简单)聊天是我刚才创build的应用程序的一部分。 今天我将网站从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}); 

证书确实存在于该位置,并且是有效的(双重检查)。 我怎么去debugging呢? 为什么Socket.IO不提交证书?

正如您在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); 

有一个logging的能力来启动服务器使用socket.io本身描述here.Options可以传递到io的Server()方法列在engine.io文档 。 看来你不能附加证书。