的NodeJS v0.10.x(FreeBSD的) “X509_STORE_add_cert:证书已经在哈希表”

问题描述:

我与异步网页API的工作,在版本的NodeJS海格一个问题比v0.8.9的NodeJS v0.10.x(FreeBSD的) “X509_STORE_add_cert:证书已经在哈希表”

$ UNAME -a FreeBSD home 9.1-STABLE FreeBSD 9.1-STABLE#0:Fri Feb 1 10:38:27 EET 2013 root @ home:/ usr/obj/usr/src/sys/HOME amd64

$ node -v v0。 10.0

$节点./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) 

代码(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); 
    }); 

}); 

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

在v0.6.x的NodeJS和v0.8.x它完美的作品。在v0.10.x上 - 失败。 请帮忙找到问题。

+0

你有没有找到一个解决这个?我在Mac OS X上遇到了同样的问题。 – 2014-01-21 18:15:29

+0

@ greg-barrett是的。问题出在cert文件中。尝试将您的证书文件转换为pem/key并将其转换回pfx。 我不知道为什么,但它的工作。 – user2314519 2014-01-22 14:20:33

解决的办法是隔离的质子交换膜,并通过一个加回一个没有捆绑。在最下面的叶子上,然后是父母,然后是父母等,并且每次都进行测试。

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

我想这一定是在重复的证书不检查他们使用的第一次的Node.js/io.js的内部的错误。

有什么奇怪的是,添加证书到链特定HTTPS服务器实例可能会导致一个不相关的HTTPS请求(应使用默认的链条,没有什么做的HTTPS服务器)。