连接时出现Socket.io + SSL +自签名CA证书时出错
我正在使用使用自签名CA证书创建的证书运行https服务器。连接时出现Socket.io + SSL +自签名CA证书时出错
现在我想将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。
请勿用自签署的证书。只是不要,一些浏览器在使用WebSockets时无法接受它们。你看起来像一个便宜的d * ck没有购买适当的证书。
从They see me pollin, they hatin (p. 23)。由Socket.IO核心团队成员Arnout Kazemier(3rdEden)发表的演讲。
检查here如何使用自签名证书。您必须指定以下允许使用自签名证书连接:
- 关键:一个包含客户端的PEM格式的私钥字符串或缓冲区。
- cert:以PEM格式包含客户端证书密钥的字符串或缓冲区。
- 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});
这正是我所做的,但它不起作用。我总是得到一个* UNABLE_TO_VERIFY_LEAF_SIGNATURE *错误(我试图用Node.js中的socket.io-client进行连接,而不是来自浏览器)。我需要的是有可能告诉Socket。通过编程方式,哪些CA证书可以。看起来,这种可能性不见了。 SockJS的行为方式相同,并且这种可能性也不存在:-( – 2013-03-12 20:00:05
这个答案没有回答如何让有效的自签名证书在NodeJS中正确工作的问题。 – 2017-08-01 15:10:53
对于socket.io 1.0(不确定约为0.9),详细介绍了如何让节点客户端连接到无效的证书:https://stackoverflow.com/a/24235426。 (感谢上面的@ 3rdEden的评论。)我发现自签名SSL证书可以方便地用于开发服务器。
四年后,但对于任何发现这个职位和我一样,如果你需要强制客户端套接字证书从https://github.com/socketio/engine.io-client#methods
需要rejectUnauthorized: false
在 const socket = require('socket.io-client')('https://192.168.0.31', { transports: ['websocket'], rejectUnauthorized: false })
不拒绝自签名的服务器也有现在一个很好的免费证书来源,所以现在你甚至不需要“便宜的d * ck”https://letsencrypt.org/
Just发现rejectUnauthorized由我自己...适用于任何websocket,不仅socket.io。 Wii也可以解决其他证书的问题(如果你真的不需要对你的ssl连接进行高度保护) – Yitzchak 2017-11-01 21:25:52
好的,这回答了为什么它不被支持。感谢您指出这一点!(虽然我认为他的观点有点狭窄) – 2013-03-13 19:51:53
那么这是如何解决开发/分期案例?我应该为我所有的临时服务器,Vagrant虚拟机和生产服务器? – 2013-05-29 17:14:16
Node.js 0.10已被配置为自动拒绝自签名的SSL证书,您可以通过添加以下ENV变量来“撤消”该证书:'NODE_TLS_REJECT_UNAUTHORIZED = 0' 另外,是的,我有一个狭窄查看SSL时的情况;)但正如您可能遇到的一样,自签名证书会导致很多问题用适当的证书来防止。至于开发/登台,请购买通配符SSL证书或编辑你的'/ etc/hosts'? ;) – 3rdEden 2013-06-06 09:43:15