Socket.io + SSL +自签名CA证书连接时出错

我正在使用使用自签名CA证书创build的证书运行https服务器。

现在我想将Socket.io客户端连接到连接到https服务器的Socket.io服务器。 不幸的是,我得到一个错误,告诉我:

Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE at SecurePair.<anonymous> (tls.js:1271:32) at SecurePair.EventEmitter.emit (events.js:92:17) at SecurePair.maybeInitFinished (tls.js:883:10) at CleartextStream.read [as _read] (tls.js:421:15) at CleartextStream.Readable.read (_stream_readable.js:293:10) at EncryptedStream.write [as _write] (tls.js:330:25) at doWrite (_stream_writable.js:211:10) at writeOrBuffer (_stream_writable.js:201:5) at EncryptedStream.Writable.write (_stream_writable.js:172:11) at write (_stream_readable.js:547:24) at flow (_stream_readable.js:556:7) 

基本上,这个错误告诉我,证书不能被成功validation。 这是由于相应的CA证书是自签名的。 当使用https请求时,我可以指定我信任的CA.

如何在这种情况下使Socket.io连接?

PS:我正在运行Node.js 0.10.0和Socket.io 0.9.13。

不要使用自签名的证书。 只是不要,有些浏览器在使用WebSocket的时候没有办法接受它们。 你看起来像一个便宜的d * ck不买一个适当的证书。

从他们看到我的花粉,他们hatin(23页) 。 Socket.IO核心团队成员Arnout Kazemier(3rdEden)的演讲。

对于socket.io 1.0(不确定约0.9),有详细介绍如何让节点客户端连接到一个无效的证书在这里: https : //stackoverflow.com/a/24235426 。 (感谢上面的@ 3rdEden的评论。)我发现自签名的SSL证书可以方便地用于开发服务器。

四年后,但对于任何发现像我这样的职位,如果你需要强制客户端套接字不拒绝一个自签名服务器证书你需要rejectUnauthorized: falseconst socket = require('socket.io-client')('https://192.168.0.31', { transports: ['websocket'], rejectUnauthorized: false }) from https://github.com/socketio/engine.io-client#methods

现在也有一个免费的证书的好来源,所以现在你甚至不需要“廉价d * ck” https://letsencrypt.org/

请点击此处查看如何使用Certificate Signing Request自签名证书。 您必须指定以下内容以允许使用自签名证书进行连接:

  1. key:包含PEM格式客户端私钥的string或缓冲区。
  2. cert:包含PEM格式客户端证书密钥的string或缓冲区。
  3. ca:可信证书的string或缓冲区数组。 如果省略,将使用几个众所周知的“根”CA,例如VeriSign。 这些用于授权连接。

要使用CSR创build自签名证书,请执行以下操作:

 openssl x509 -req -in ryans-csr.pem -signkey ryans-key.pem -out ryans-cert.pem 

在客户端套接字应该用作

 var socket = io.connect('https://localhost', {secure: true});