javascript SSL无法验证叶子签名时出现Node.js错误

ar5n3qh5  于 2023-01-01  发布在  Java
关注(0)|答案(7)|浏览(200)

操作系统:Windows 7
NodeJS版本:0.10.2
WS模块:ws,最新版本
错误:

events.js:72
        throw er; // Unhandled 'error' event
              ^
Error: UNABLE_TO_VERIFY_LEAF_SIGNATURE
    at SecurePair. (tls.js:1283:32)
    at SecurePair.EventEmitter.emit (events.js:92:17)
    at SecurePair.maybeInitFinished (tls.js:896:10)
    at CleartextStream.read [as _read] (tls.js:430:15)
    at CleartextStream.Readable.read (_stream_readable.js:294:10)
    at EncryptedStream.write [as _write] (tls.js:344: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)

服务器:

(function(){

    "use strict";

    var fs = require('fs');

    // you'll probably load configuration from config
    var cfg = {
        ssl: true,
        port: 8080,
        ssl_key: 'crt/server1.key',
        ssl_cert: 'crt/server1.crt'
    };

    var httpServ = require('https') 

    var WebSocketServer   = require('ws').Server;

    var app      = null;

    // dummy request processing
    var processRequest = function( req, res ) {

        res.writeHead(200);
        res.end("All glory to WebSockets!\n");
    };

    if ( cfg.ssl ) {

        app = httpServ.createServer({

            // providing server with  SSL key/cert
            key: fs.readFileSync( cfg.ssl_key ),
            cert: fs.readFileSync( cfg.ssl_cert ),
            //requestCert: true,
            //rejectUnauthorized: false

        }, processRequest ).listen( cfg.port );

    } else {

        app = httpServ.createServer( processRequest ).listen( cfg.port );
    }

    // passing or reference to web server so WS would knew port and SSL capabilities
    var wss = new WebSocketServer( { server: app } );

    wss.on( 'connection', function ( wsConnect ) {

        wsConnect.on( 'message', function ( message ) {

            console.log( message );

        });

    });

}());

委托单位:

var WebSocket = require('ws');
var ws = new WebSocket('wss://localhost:8080');
ws.on('open', function() {
    ws.send('something');
});

证书确认了。
救命啊!

6vl6ewon

6vl6ewon1#

我正在使用一个名为“superagent”的软件包,也得到了同样的错误。在尝试了几个可能的修复后,我遇到了这个对我来说100%有效的错误:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

没有必要做任何要求或任何事情:只要在网络调用之前将其添加到您的代码中,您就可以开始了。

eimct9ow

eimct9ow2#

示例中服务器使用的SSL证书可能不完全受WebSocket客户端信任,因此NodeJS在客户端的网络库中抛出错误。
您需要将rejectUnauthorized设置为false(这是大多数高级网络库允许您通过传递到较低级别NodeJS网络库的选项来设置的选项)。
我浏览了一下ws模块源代码,看起来你应该试试这个:

var ws = new WebSocket('wss://localhost:8080', null, {rejectUnauthorized: false});

注意:rejectUnauthorized只应在测试/开发期间为false。生产应用程序应始终使用rejectUnauthorized: true以获得完全的安全性。

qvk1mo1f

qvk1mo1f3#

如果您不想禁用安全性,请添加ca:http /socket客户端选项中的[cert]选项。其中cert是要连接的服务器的证书或要连接的服务器的CA。

gorkyyrv

gorkyyrv4#

我以前遇到过类似的问题,你可以尝试使用https.globalAgent.options.secureProtocol = 'SSLv3_method'来设置HTTPS的SSLv3连接。

rhfm7lfc

rhfm7lfc5#

根据nginx官方网站,他们明确提到证书应该是服务器证书和链接证书的组合。

qxsslcnc

qxsslcnc6#

下面的解决方案是完美的,并为我在节点js工作罚款

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
0lvr5msh

0lvr5msh7#

使用库从给定文件夹加载证书(pem、crt ...)。
https://github.com/fujifish/syswide-cas
您可以从浏览器导出证书并尝试:

const syswidecas = require('syswide-cas');
syswidecas.addCAs('./certs');

相关问题