2016-03-01 21 views
6

私はHTTPS要求を約束しようとしています。私はすでにPFXが良いことを知っています。それは問題ではありません(私は同様のサンプルアプリケーションが動作しています)。Node.js - HTTPS PFXエラー:BIOを読み込めません

私は、次のやっている:私は、要求の中に私のオプションを渡しています

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

...

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

request.post(options); 

私はその後、私は次のエラーを取得するリクエストを構築しよう:

_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) 

は、私は同じコードが動作するサンプルアプリを持っています。 私は成功せずに.p12に変換しようとしました。

このエラーが何を参照しているのでしょうか?

編集:私は動の特性や静的プロパティ

_.merge(options, _this.requestOptions); 

そして、それを持つ2つのオブジェクトのマージを行うためにlodashを使用してい は問題

+0

見つけましたか? –

+0

このコードと "同じコードが動作する"サンプルアプリケーションとの違いは何ですか? _I.e._は、異なるユーザーが実行する2つのアプリケーションです( 'myfile.pfx'ファイルのファイルシステム権限を示唆しています)。問題のPFXファイルは、コンテナ**と**をプライベートキーまたは異なるパスフレーズで保護するために同じパスフレーズを使用していますか? – Castaglia

+0

私の問題はlodashでした。私は '_.merge(options、_this.requestOptions);を行っていました。それは私のエンコーディングを乱していた。 – fasantos

答えて

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); 
    ... 
LoadBIOはnullを返しライン964

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

// 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){})を試すとエラーが発生しますか?

+2

それはエンコーディングで、私はオブジェクトを乱したロダッシュとのマージを行っていました。 – fasantos

関連する問題