2013-04-24 62 views
1

我與異步網頁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

回答

1

解決的辦法是隔離的質子交換膜,並通過一個加回一個沒有捆綁。在最下面的葉子上,然後是父母,然後是父母等,並且每次都進行測試。

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

我想這一定是在重複的證書不檢查他們使用的第一次的Node.js/io.js的內部的錯誤。

有什麼奇怪的是,添加證書到鏈特定HTTPS服務器實例可能會導致一個不相關的HTTPS請求(應使用默認的鏈條,沒有什麼做的HTTPS服務器)。

相關問題