Système: Windows 7
Version de NodeJS: 0.10.2
Module WS: ws, dernière version
Erreur:
events.js: 72 throw er; // Événement 'erreur' non géré ^ Erreur: UNABLE_TO_VERIFY_LEAF_SIGNATURE À SecurePair. (tls.js: 1283: 32) sur SecurePair.EventEmitter.emit (events.js: 92: 17) sur SecurePair.maybeInitFinished (tls.js: 896: 10) à CleartextStream.read [as _read] (tls.js: 430: 15) à CleartextStream.Readable.read (_stream_readable.js: 294: 10) à EncryptedStream.write [as _write] (tls.js: 344: 25) à doWrite (_stream_writable.js: 211: 10) à writeOrBuffer (_stream_writable.js: 201: 5) à EncryptedStream .Writable.write (_stream_writable.js: 172: 11) À l’écriture (_stream_readable.js: 547: 24)
Serveur:
(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 );
});
});
}());
Client:
var WebSocket = require('ws');
var ws = new WebSocket('wss://localhost:8080');
ws.on('open', function() {
ws.send('something');
});
Le certificat confirmé.
Aide> s'il vous plaît!
J'utilise un paquet appelé "superagent" et j'obtiens la même erreur. Après avoir essayé plusieurs solutions potentielles, je suis tombé sur celle qui fonctionnait pour moi 100% du temps:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
Il n'y a pas besoin de faire quoi que ce soit ou quoi que ce soit: ajoutez simplement ceci à votre code avant que vos appels au réseau et vous êtes prêt à partir.
Le certificat SSL utilisé par le serveur dans votre exemple n'est probablement pas totalement approuvé par le client WebSocket. NodeJS génère donc une erreur dans sa bibliothèque réseau côté client.
Vous devez définir rejectUnauthorized
sur false
(option que la plupart des bibliothèques de réseau de haut niveau vous permettront de définir via une option transmise à la bibliothèque de réseau NodeJS de niveau inférieur).
J'ai parcouru le code source du module ws et il semble que vous devriez essayer ceci:
var ws = new WebSocket('wss://localhost:8080', null, {rejectUnauthorized: false});
REMARQUE: rejectUnauthorized
ne devrait être que false
lors des tests/du développement. Les applications de production doivent toujours utiliser rejectUnauthorized: true
pour une sécurité totale.
Si vous ne voulez pas désactiver votre sécurité. Ajoutez l'option ca: [cert] dans les options du client http/socket. Où cert est Certificat du serveur auquel vous vous connectez ou de l'autorité de certification du serveur auquel vous vous connectez.
J'ai déjà rencontré un problème similaire auparavant, vous pouvez essayer d'utiliser https.globalAgent.options.secureProtocol = 'SSLv3_method'
Pour définir la connexion SSLv3 pour https.