2013-08-27 48 views
12

系統:Windows 7Node.js的錯誤使用SSL UNABLE_TO_VERIFY_LEAF_SIGNATURE

版本的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'); 
}); 

證書確認。

幫助>請!

+0

檢查這個http://stackoverflow.com/questions/17200391/nodejs-unable-to-verify-leaf-signature – vinayr

+0

我不行 –

回答

0

我以前也遇到過類似的問題,你可以嘗試使用 https.globalAgent.options.secureProtocol = 'SSLv3_method' 設置爲HTTPS的SSLv3連接。

+0

不起作用:((( –

8

在您的示例中服務器使用的SSL證書可能不完全受WebSocket客戶端信任,因此NodeJS在客戶端的網絡庫中拋出錯誤。

您需要將rejectUnauthorized設置爲false(這是大多數高級網絡庫允許您通過傳遞到較低級別NodeJS網絡庫的選項設置的選項)。

我掠過WS模塊的源代碼,看起來像你應該試試這個:

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

注:rejectUnauthorized應該只是測試/開發過程中false。生產應用程序應始終使用rejectUnauthorized: true以實現完全安全。

20

我正在使用名爲「superagent」的軟件包,並且得到相同的錯誤。嘗試幾種可能的修正後,我碰到這一個對我的作品的100%的時間來了:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 

有沒有必要做任何需要或什麼:之前您的網絡電話,用戶只需添加到您的代碼'很好去。

+6

這是一個糟糕的想法如果系統具有合適的CA根(AKA錨)證書,應該有一種方式告訴節點關於它們而不是關閉'strict-ssl'。 –

+1

「或者什麼都不做,並且無法訪問網站,因爲Node沒有提供正確的事情」。 – dpjanes

+2

修復了[此錯誤](https://github.com/joyent/node/issues/7608)時,您可以執行「正確的事情(tm)」。 –

2

如果你不想禁用你的安全。在http /套接字客戶端選項中添加ca:[cert]選項。 其中cert是您要連接的服務器證書或您要連接的服務器的CA.

+1

指針或例子? –

+0

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

+0

您還可以查看https://groups.google.com/forum/#!msg/nodejs/AjkHSYmiGYs/1LfNHbMhd48J,它可以促進節點模塊ssl-root-cas,它可以將自定義CA添加到列表中的ca認證節點默認信任。 – Shrey

0

根據nginx官網,他們明確提到證書應該是服務器證書和鏈接證書的組合。 MoreInfo

enter image description here