2013-08-27 18 views
12

System: Windows 7błąd node.js z SSL UNABLE_TO_VERIFY_LEAF_SIGNATURE

NodeJS wersja: 0.10.2

moduł WS: WS, ostatnia wersja

Błąd:

 
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) 

serwera:

(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); 

     }); 

    }); 


}()); 

Klient:

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

Certyfikat potwierdzony.

Pomoc> proszę!

+0

check to http://stackoverflow.com/questions/17200391/nodejs-unable-to-verify-leaf-signature – vinayr

+0

nie działa dla mnie –

Odpowiedz

0

Zetknąłem się z podobnym problemem wcześniej, możesz spróbować użyć https.globalAgent.options.secureProtocol = 'SSLv3_method' , aby ustawić połączenie SSLv3 dla https.

+0

nie działa: (((To jest –

8

Certyfikat SSL używany przez serwer w twoim przykładzie prawdopodobnie nie jest w pełni zaufany przez klienta WebSocket, więc NodeJS rzuca błąd w swojej bibliotece sieciowej po stronie klienta.

Należy ustawić rejectUnauthorized na false (jest to opcja, którą większość bibliotek sieci wysokiego poziomu pozwala ustawić za pomocą opcji, która zostanie przekazana do biblioteki NodeJS niższego poziomu).

I odtłuszczonego ws modułu kod źródłowy i wygląda jak należy spróbować tego:

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

UWAGA: rejectUnauthorized powinny być tylko false podczas badania/rozwój. Aplikacje produkcyjne powinny zawsze używać rejectUnauthorized: true dla pełnego bezpieczeństwa.

20

Używam pakietu o nazwie "superagent" i otrzymuję ten sam błąd. Po wypróbowaniu kilku potencjalnych poprawek, natknąłem się na ten jeden, który pracuje dla mnie 100% czasu:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 

Nie ma potrzeby, aby cokolwiek wymaga albo cokolwiek: wystarczy dodać do kodu przed połączeń sieciowych i ciebie "Dobrze iść.

+6

kiepski pomysł.Jeśli system ma odpowiednie certyfikaty głównego CA (AKA anchor), powinien istnieć sposób poinformowania o tym węzła, zamiast wyłączania 'strict-ssl'. –

+1

"lub nie rób nic i nie możesz uzyskać dostępu do strony internetowej, ponieważ Węzeł nie zapewnia właściwego działania". – dpjanes

+2

Po usunięciu [tego błędu] (https://github.com/joyent/node/issues/7608) będziesz mógł zrobić "Właściwe pojęcie (tm)". –

2

Jeśli nie chcesz wyłączyć swojego bezpieczeństwa. Dodaj opcję ca: [cert] w opcjach klienta http/socket. Gdzie cert to Certyfikat serwera, z którym łączysz się z CA lub serwerem, z którym się łączysz.

+1

Wskaźniki lub przykłady? –

+0

https.globalAgent.options.ca = https.globalAgent.options.ca.concat (THE_SERVER_CA_YOU_WANT_TO_TRUST); – Shrey

+0

Możesz również przejrzeć https://groups.google.com/forum/#!msg/nodejs/AjkHSYmiGYs/1LfNHbMhd48J, który promuje moduł węzłowy ssl-root-cas, który robi to samo, co dodawanie niestandardowych urzędów certyfikacji do listy ca domyślnie poświadcza zaufanie węzłów. – Shrey

0

Zgodnie z oficjalną stroną internetową nginx, wyraźnie wspomniano, że certyfikat powinien być połączeniem certyfikatu serwera i powiązanych certyfikatów. MoreInfo

enter image description here

Powiązane problemy