Node.js - HTTPS PFX错误:无法加载BIO

时间:2016-03-01 17:25:47

标签: javascript node.js ssl https pfx

我正在尝试制作HTTPS请求承诺。我已经知道PFX很好,这不是问题(我有一个类似的示例应用程序工作)。

我正在做以下事情:

<img src="~/Content/img/fiji-01.jpg?crop=50,50,200,200&width=500&height=500" />

...

var request = require('request-promise');

我将选项传递给请求。

options.pfx = fs.readFileSync('myfile.pfx');
options.passphrase = 'passphrase';

然后我尝试构建请求,我收到以下错误:

request.post(options);

我有一个示例应用程序,其中相同的代码工作。 我试图转换为.p12但没有成功。

有没有人知道这个错误可能指的是什么?

编辑: 我使用lodash将2个对象与dinamic属性和静态属性合并

_tls_common.js:130
  c.context.loadPKCS12(pfx, passphrase);
            ^

Error: Unable to load BIO
at Error (native)
at Object.createSecureContext (_tls_common.js:130:17)
at Object.exports.connect (_tls_wrap.js:955:21)
at Agent.createConnection (https.js:73:22)
at Agent.createSocket (_http_agent.js:174:16)
at Agent.addRequest (_http_agent.js:143:23)
at new ClientRequest (_http_client.js:133:16)
at Object.exports.request (http.js:31:10)
at Object.exports.request (https.js:163:15)
at Request.start (/Users/filomeno/workspace/sla-crawler/node_modules/request/request.js:747:30)
at Request.write (/Users/filomeno/workspace/sla-crawler/node_modules/request/request.js:1369:10)
at end (/Users/filomeno/workspace/sla-crawler/node_modules/request/request.js:561:16)
at Immediate._onImmediate (/Users/filomeno/workspace/sla-crawler/node_modules/request/request.js:589:7)
at processImmediate [as _immediateCallback] (timers.js:374:17)

这导致了问题

1 个答案:

答案 0 :(得分:6)

查看nodejs源代码(特别是此文件https://github.com/nodejs/node/blob/master/src/node_crypto.cc

此函数抛出错误

// Takes .pfx or .p12 and password in string or buffer format
void SecureContext::LoadPKCS12(const FunctionCallbackInfo<Value>& args) {
   Environment* env = Environment::GetCurrent(args);
   ...

第964行

in = LoadBIO(env, args[0]);
if (in == nullptr) {
   return env->ThrowError("Unable to load BIO");
}

LoadBIO返回null

// Takes a string or buffer and loads it into a BIO.
// Caller responsible for BIO_free_all-ing the returned object.
static BIO* LoadBIO(Environment* env, Local<Value> v) {
  HandleScope scope(env->isolate());

  if (v->IsString()) {
    const node::Utf8Value s(env->isolate(), v);
    return NodeBIO::NewFixed(*s, s.length());
  }

  if (Buffer::HasInstance(v)) {
    return NodeBIO::NewFixed(Buffer::Data(v), Buffer::Length(v));
  }

  return nullptr;
}

也许缓冲区不可读?此外,该函数似乎期待一个utf-8编码的字符串。

一些想法:

您确定文件的路径是否正确?

也许是编码问题?您是否尝试明确设置fs.readFileSync()编码?

尝试使用fs.readFile(<filename>, <encoding>, function(error, data){})查看是否会引发错误?