it-swarm.com.ru

Ошибка Node.js с SSL UNABLE_TO_VERIFY_LEAF_SIGNATURE

Система: Windows 7

NodeJS версия: 0.10.2

Модуль WS: ws, последняя версия

Ошибка:

. .__ events.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) 
 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) 
 в doWrite (_stream_writable.js: 211: 10) 
 в writeOrBuffer (_stream_writable.js: 201: 5) 
 at 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');
});

Сертификат подтвержден.

Помогите> пожалуйста!

12
Yaroslav L.

Я использую пакет под названием «суперагент» и получаю ту же ошибку. Попробовав несколько возможных исправлений, я наткнулся на это, которое работает для меня 100% времени:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

Нет необходимости делать какие-либо требования или что-то еще: просто добавьте это в свой код, прежде чем ваши сетевые вызовы, и вы готовы к работе.

19
dpjanes

Сертификат SSL, используемый сервером в вашем примере, вероятно, не полностью доверен клиенту WebSocket, поэтому NodeJS выдает ошибку в своей сетевой библиотеке на стороне клиента.

Вам необходимо установить для rejectUnauthorized значение false (это вариант, который большинство сетевых библиотек высокого уровня позволяют вам устанавливать с помощью параметра, который передается в сетевую библиотеку NodeJS нижнего уровня).

Я просмотрел исходный код модуля ws и похоже, что вы должны попробовать это:

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

ПРИМЕЧАНИЕ: rejectUnauthorized должен быть только false во время тестирования/разработки. Производственные приложения всегда должны использовать rejectUnauthorized: true для полной безопасности.

8
philidem

Если вы не хотите отключить вашу безопасность. Добавьте опцию ca: [cert] в опциях клиента http/socket . Где cert - это Сертификат сервера, к которому вы подключаетесь, или CA сервера, к которому вы подключаетесь.

2
Shrey

Ранее я сталкивался с подобной проблемой, вы можете попробовать использовать https.globalAgent.options.secureProtocol = 'SSLv3_method', чтобы установить соединение SSLv3 для https.

0
Rix

Согласно официальному сайту nginx , в них четко указано, что сертификат должен представлять собой комбинацию сертификата сервера и связанных сертификатов . MoreInfo

 enter image description here

0
Sharathi RB