SSL UNABLE_TO_VERIFY_LEAF_SIGNATURE 的 Node.js 错误

Posted

技术标签:

【中文标题】SSL UNABLE_TO_VERIFY_LEAF_SIGNATURE 的 Node.js 错误【英文标题】:Node.js error with SSL UNABLE_TO_VERIFY_LEAF_SIGNATURE 【发布时间】:2013-08-29 23:55:01 【问题描述】:

系统:Windows 7

NodeJS 版本:0.10.2

WS 模块:ws,最新版本

错误:

事件.js:72 投掷者; // 未处理的“错误”事件 ^ 错误:UNABLE_TO_VERIFY_LEAF_SIGNATURE 在 SecurePair。 (tls.js:1283:32) 在 SecurePair.EventEmitter.emit (events.js:92:17) 在 SecurePair.maybeInitFinished (tls.js:896:10) 在 CleartextStream.read [as _read] (tls.js:430:15) 在 CleartextStream.Readable.read (_stream_readable.js:294:10) 在 EncryptedStream.write [as _write] (tls.js:344:25) 在 doWrite (_stream_writable.js:211:10) 在 writeOrBuffer (_stream_writable.js:201:5) 在 EncryptedStream.Writable.write (_stream_writable.js:172:11) 写入时 (_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');
);

证书已确认。

请帮忙!

【问题讨论】:

查看***.com/questions/17200391/… 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

【讨论】:

指针或例子? https.globalAgent.options.ca = https.globalAgent.options.ca.concat(THE_SERVER_CA_YOU_WANT_TO_TRUST); 您还可以查看 groups.google.com/forum/#!msg/nodejs/AjkHSYmiGYs/1LfNHbMhd48J ,它提升了节点模块 ssl-root-cas,它与将自定义 CA 添加到节点默认信任的 ca 证书列表中的功能相同。跨度> 有一个 ssl-root-cas 模块为现代网络浏览器信任的中间 CA 简化了这一点,如 other post here 中所述。【参考方案3】:

我正在使用一个名为“superagent”的包,但遇到了同样的错误。在尝试了几种可能的修复方法后,我发现了一个 100% 对我有用的方法:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

无需执行任何要求或任何操作:只需在网络调用之前将其添加到您的代码中即可。

【讨论】:

这是个糟糕的主意。如果系统具有正确的 CA 根(AKA 锚)证书,则应该有一种方法可以将它们告知 Node,而不是关闭 strict-ssl "或者什么都不做,无法访问该网站,因为 Node 没有提供正确的操作"。 当this bug 被修复后,你就可以做“正确的事(tm)”了。 为我工作。睁大眼睛,这对于外部网站来说是个坏主意。 只是给出代码而不解释它的作用是不好的。这可能是内部服务的快速修复,但您不应该在生产中这样做。让你在中间攻击的范围内为整个范围的人敞开大门。【参考方案4】:

您的示例中服务器使用的 SSL 证书可能不完全被 WebSocket 客户端信任,因此 NodeJS 在客户端的网络库中抛出错误。

您需要将rejectUnauthorized 设置为false(这是大多数高级网络库允许您通过传递给低级NodeJS 网络库的选项来设置的选项)。

我浏览了 ws 模块源代码,您应该试试这个:

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

注意:rejectUnauthorized 在测试/开发期间只能是false。生产应用程序应始终使用rejectUnauthorized: true 以确保完全安全。

【讨论】:

【参考方案5】:

我之前也遇到过类似的问题,你可以试试 https.globalAgent.options.secureProtocol = 'SSLv3_method' 为 https 设置 SSLv3 连接。

【讨论】:

以上是关于SSL UNABLE_TO_VERIFY_LEAF_SIGNATURE 的 Node.js 错误的主要内容,如果未能解决你的问题,请参考以下文章

javax.net.ssl.SSLProtocolException: SSL 握手中止: ssl=0x7fa2258640: SSL 库失败,通常是协议错误

Nginx负载均衡ssl原理生成ssl密钥对Nginx配置ssl

ssl协议包括哪些子协议

为啥ssl总是显示发生SSL错误?

iis配置ssl,求高手。。

ssl证书下载与安装 – 如何下载ssl证书