2013-08-27 45 views
12

hệ thống: Windows 7Node.js lỗi với SSL UNABLE_TO_VERIFY_LEAF_SIGNATURE

NodeJS phiên bản: 0.10.2

WS mô-đun: ws, phiên bản cuối cùng

Lỗi:

 
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) 

Server:

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

     }); 

    }); 


}()); 

Khách hàng:

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

Chứng chỉ được xác nhận.

Trợ giúp> vui lòng!

+0

séc http://stackoverflow.com/questions/17200391/nodejs-unable-to-verify-leaf-signature này – vinayr

+0

không làm việc cho tôi –

Trả lời

0

Tôi đã gặp sự cố tương tự trước đây, bạn có thể thử sử dụng https.globalAgent.options.secureProtocol = 'SSLv3_method' để đặt kết nối SSLv3 cho https.

+0

không hoạt động: ((( –

8

Chứng chỉ SSL được máy chủ sử dụng trong ví dụ của bạn có thể không được máy khách WebSocket tin tưởng hoàn toàn để NodeJS đang ném một lỗi trong thư viện mạng của nó ở phía máy khách.

Bạn cần đặt rejectUnauthorized thành false (đây là tùy chọn mà hầu hết thư viện mạng cấp cao sẽ cho phép bạn đặt qua tùy chọn được chuyển đến thư viện mạng NodeJS cấp thấp hơn).

tôi lướt các ws mô-đun mã nguồn và trông giống như bạn nên thử điều này:

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

LƯU Ý: rejectUnauthorized chỉ nên false trong thử nghiệm/phát triển. Ứng dụng sản xuất phải luôn sử dụng rejectUnauthorized: true để bảo mật hoàn toàn.

20

Tôi đang sử dụng gói có tên "superagent" và gặp lỗi tương tự. Sau khi thử vài bản vá tiềm năng, tôi tình cờ gặp một này làm việc cho tôi 100% thời gian:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0"; 

Không cần phải làm bất cứ yêu cầu hoặc bất cứ điều gì: chỉ cần thêm video này vào mã của bạn trước các cuộc gọi mạng của bạn và bạn tốt để đi.

+6

Đây là Nếu hệ thống có chứng chỉ CA gốc (AKA anchor) thích hợp, cần có cách để báo cho Node biết về chúng thay vì tắt 'strict-ssl'. –

+1

"hoặc không làm gì cả và không thể truy cập trang web vì Node không cung cấp điều đúng để làm". – dpjanes

+2

Khi [lỗi này] (https://github.com/joyent/node/issues/7608) được sửa, bạn sẽ có thể thực hiện "Điều Đúng (tm)". –

2

Nếu bạn không muốn vô hiệu hóa bảo mật của mình. Thêm ca: [cert] tùy chọn trong các tùy chọn http/socket client. Trường hợp cert là Chứng chỉ máy chủ bạn đang kết nối đến hoặc CA của máy chủ bạn đang kết nối.

+1

Con trỏ hoặc ví dụ? –

+0

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

+0

Bạn cũng có thể xem https://groups.google.com/forum/#!msg/nodejs/AjkHSYmiGYs/1LfNHbMhd48J, quảng bá mô-đun nút ssl-root-cas thực hiện điều tương tự khi thêm CA tùy chỉnh vào danh sách của ca certs nút tin tưởng theo mặc định. – Shrey

0

Theo trang web chính thức nginx, giấy chứng nhận được đề cập rõ ràng phải là kết hợp của Chứng chỉ máy chủ và chứng chỉ chuỗi. MoreInfo

enter image description here