Node.js с SSL UNABLE_TO_VERIFY_LEAF_SIGNATURE

Система: 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');
});

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

Справкa > пожалуйста!

Ответ 1

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

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Ответ 5

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

введите описание изображения здесь