的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上 - 失败。 请帮忙找到问题。
答
解决的办法是隔离的质子交换膜,并通过一个加回一个没有捆绑。在最下面的叶子上,然后是父母,然后是父母等,并且每次都进行测试。
见https://github.com/iojs/io.js/issues/712
我想这一定是在重复的证书不检查他们使用的第一次的Node.js/io.js的内部的错误。
有什么奇怪的是,添加证书到链特定HTTPS服务器实例可能会导致一个不相关的HTTPS请求(应使用默认的链条,没有什么做的HTTPS服务器)。
你有没有找到一个解决这个?我在Mac OS X上遇到了同样的问题。 – 2014-01-21 18:15:29
@ greg-barrett是的。问题出在cert文件中。尝试将您的证书文件转换为pem/key并将其转换回pfx。 我不知道为什么,但它的工作。 – user2314519 2014-01-22 14:20:33