Nodejs v0.10.x (freebsd) “X509_STORE_add_cert: cert ya está en la tabla hash”

Estoy trabajando con async web api y tengo un problema en la versión nodejs higer que v0.8.9

$ uname -a FreeBSD home 9.1-ESTABLE FreeBSD 9.1-ESTABLE # 0: viernes 1 de febrero 10:38:27 EET 2013 root @ home: / usr / obj / usr / src / sys / HOME amd64

$ node -v v0.10.0

$ nodo ./client.js

events.js:72 throw er; // Unhandled 'error' event ^ Error: 34401711104:error:0B07C065:x509 certificate routines:X509_STORE_add_cert:cert already in hash table:../deps/openssl/openssl/crypto/x509/x509_lu.c:357: 34401711104:error:0B07C065:x509 certificate routines:X509_STORE_add_cert:cert already in hash table:../deps/openssl/openssl/crypto/x509/x509_lu.c:357: at SlabBuffer.use (tls.js:221:18) at CleartextStream.read [as _read] (tls.js:408:29) at CleartextStream.Readable.read (_stream_readable.js:293:10) at tls.js:465:12 at process._tickCallback (node.js:415:13) 

Código (client.js):

 var fs = require('fs'); var https = require('https'); var agent = require('agent').agent; var config={ host: 'sample.host.com', port: 443, path: '/worker.do', pfx: fs.readFileSync('./client.pfx'), passphrase: "passwordHere" }; config.agent = new https.Agent({ pfx: config.pfx, passphrase: config.passphrase }); agent.config=config; agent.makeRequest([{request:"search",query:"*"}],function(data){ if(!data.success){ console.log(data.error); return; } var items=[]; for(var item in data.data){ items.push(data.data[item][0]); } agent.makeRequest([{"request":"update","group":true,"arr":JSON.stringify(items)}],function(data){ if(!data.success){ console.log(data.error); return; } console.log('Done: '+data.result); }); }); 

Código (agent.js):

 var https = require('https'); var agent={ config: {}, getId: function() { return this.id || (this.id = new Date().getTime()); }, makeRequest: function(params,callback){ var options = { host: this.config.host, port: this.config.port, path: '/worker.do', method: 'POST', agent: this.config.agent }; var that=this; var req = https.request(options, function(res) { if(res.statusCode!='200'){ callback({ success: false, error: res.statusCode }); return; } var body=''; res.on('data', function(data) { body+=data.toString(); }); res.on('end', function(){ try { body=JSON.parse(body); } catch(e) { callback({ success: false, error: '[makeRequest] Cant parse body: '+body }); } var reqId=body[0]; that.getContent(reqId,callback); }); }); req.on('error', function(e) { callback({ success: false, error: e }); }); req.end(JSON.stringify(params)+'\n\n'); }, getContent: function(reqId,callback){ var options = { path: '/worker.do?_dc='+this.getId(), method: 'GET', host: this.config.host, port: this.config.port, agent: this.config.agent }; var req = https.request(options, function(res) { if(res.statusCode!='200'){ callback({ success: false, error: res.statusCode }); return; } var body=''; res.on('data', function(data) { body+=data.toString(); }); res.on('end', function(){ try { body=JSON.parse(body); } catch(e) { callback({ success: false, error: '[getContent] Cant parse body: '+body }); } callback(body[reqId]); }); }); req.on('error', function(e) { callback({ success: false, error: e }); }); req.end(); } } exports.agent=agent; 

En nodejs v0.6.x y v0.8.x funciona perfecto. En v0.10.x – falla. Por favor ayuda para encontrar el problema.

La solución es aislar sus PEM y agregarlos de nuevo uno por uno, no como un paquete. En la hoja más baja, luego el padre, luego el padre, etc. y haga la prueba cada vez.

Consulte https://github.com/iojs/io.js/issues/712

Estoy pensando que esto debe ser un error en el interior de node.js / io.js donde los certificados duplicados no se verifican la primera vez que se usan.

Lo que es extraño es que agregar un certificado a la cadena para una instancia específica del servidor https puede causar una solicitud https no relacionada (que debería estar usando la cadena predeterminada, no tiene nada que ver con el servidor https).

Intereting Posts