web-dev-qa-db-ja.com

nodejs ssl "ローカル発行者証明書を取得できません"

クライアントリクエストの署名に使用するSSL証明書と、関連するCA証明書が与えられました。 opensslを使用して確認できます。

$ openssl s_client -CAfile /etc/ssl/foo/ca-combined.pem -servername foo.co.in -connect foo.co.in:443
CONNECTED(00000003)
... snip ...
Verify return code: 0 (ok)
---
closed

(私は2つのCA証明書を1つのファイルにまとめました)。しかし、ノードを使用してそれを複製しようとすると:

    var tls = require('tls');
    var fs = require('fs');

    var options = { 
        Host: 'foo.co.in',
        servername: 'foo.co.in',
        port: 443,
        key: fs.readFileSync('/etc/ssl/private/foo.key'),
        cert: fs.readFileSync('/etc/ssl/foo/cert.pem'),
        ca: [fs.readFileSync('/etc/ssl/foo/combined-ca.pem')]
    };  

    tls.connect(options, function(err) {
        done(err);
    });

エラーが発生します:

Uncaught Error: unable to get local issuer certificate
  at Error (native)
  at TLSSocket.<anonymous> (_tls_wrap.js:1092:38)
  at TLSSocket._finishInit (_tls_wrap.js:610:8)
  at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:440:38)

私はここで答えを見つけ、各CA証明書を別々のファイルに入れる必要があることを示唆しています:

ca: [fs.readFileSync('/etc/ssl/foo/ca.pem'), fs.readFileSync('/etc/ssl/foo/root-ca.pem')]

しかし、それでも同じエラーが発生しました。 (私も順序を逆にしてみました)。次に、中間証明書をクライアント証明書に入れて、ルートCA証明書をcaとして提供しました(これは docs の提案のようです)、同じエラーです。現時点では、アイデアが不足しています。 opensslが嬉しいという事実は、私が何か間違ったことをしていることを示唆しています、何か提案はありますか?

$ node --version
v6.10.1

(rejectUnauthorizedをfalseに設定できることはわかっていますが、実際にはそうしたくないです)

8
grahamrhay

CAは「既知の」機関によって適切に署名されていたため、CA証明書を提供する必要がないことがわかりました。そのため、リクエストからcaフィールドを削除するだけで済みます。

1
grahamrhay

ルートCAおよび中間CA(ルートCAによって署名された)証明書を作成してから、中間CAによって署名されたサーバーおよびクライアント証明書を作成しました。これをテストするために、サーバーとクライアントのhttpsをnodejsで実装しているので、証明書を設定して、クライアントで次のエラーを取得します。

problem with request: unable to get local issuer certificate

それを解決するために、私は自分のnodejsコードをcaフィールドに、私のルートCA証明書と中間CA証明書に入れる必要があります。そのように:

key: fs.readFileSync('path/client.privkey.pem'),
cert: fs.readFileSync('path/client.cert.pem'),
ca: [ fs.readFileSync('path/intermed-ca.cert.pem'), fs.readFileSync('path/root-ca.cert.pem') ],

わたしにはできる。

1
Jeff Pal