Socket.io 聊天服务器未提供 SSL 证书
Socket.io chat server not presenting SSL certificate
(简单的)聊天是我不久前创建的应用程序的一部分。今天我将网站从 http 切换到 https。因此,我还必须使用 SSL 我的 Socket.io 聊天套接字,否则浏览器会发牢骚。
出于某种原因,虽然我的聊天服务器根本没有提供任何证书。在 linux 上使用 openssl 证实了这一点:
openssl s_client -connect my.subdomain.tld:1337 -servername my.subdomain.tld -ssl3
returns
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 没有出示证书?
正如您在docs中所见,listen 是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 that can be passed to io's Server() method are listed in engine.io docs 来启动服务器。好像不能给它附加证书。
(简单的)聊天是我不久前创建的应用程序的一部分。今天我将网站从 http 切换到 https。因此,我还必须使用 SSL 我的 Socket.io 聊天套接字,否则浏览器会发牢骚。
出于某种原因,虽然我的聊天服务器根本没有提供任何证书。在 linux 上使用 openssl 证实了这一点:
openssl s_client -connect my.subdomain.tld:1337 -servername my.subdomain.tld -ssl3
returns
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 没有出示证书?
正如您在docs中所见,listen 是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 that can be passed to io's Server() method are listed in engine.io docs 来启动服务器。好像不能给它附加证书。