10

我正在使用使用自签名 CA 证书创建的证书运行 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)

基本上,这个错误告诉我证书无法成功验证。这是因为相应的 CA 证书是自签名的。使用 https 请求时,我可以指定我信任的 CA。

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

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

4

4 回答 4

23

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

现在还有一个很好的免费证书来源,所以现在你甚至不必成为“便宜的 d*ck” https://letsencrypt.org/

于 2017-11-01T20:26:04.210 回答
3

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

于 2014-06-16T01:02:29.860 回答
-1

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

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

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

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

在客户端,套接字应该用作

var socket = io.connect('https://localhost', {secure: true});
于 2013-03-12T19:06:06.507 回答
-15

不要使用自签名证书。只是不要,某些浏览器在使用 WebSockets 时无法让您接受它们。而且你看起来像一个没有购买合适证书的廉价d * ck。

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

于 2013-03-13T14:28:10.340 回答