nodejs ssl"无法获得本地发行人证书"

时间:2017-04-05 09:55:50

标签: node.js ssl https

我获得了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证书整合到一个文件中)。但是当我尝试使用node:

复制它时
    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')]

但仍然给出了同样的错误。 (我也尝试颠倒顺序)。然后我尝试将中间证书放入客户端1,并且只提供根CA证书ca(这似乎是docs建议的那样),同样的错误。在这一点上,我的想法已经不多了。 openssl很高兴的事实表明我做错了什么,有什么建议吗?

$ node --version
v6.10.1

(我知道我可以将rejectUnauthorized设为false,但我真的不愿意)

2 个答案:

答案 0 :(得分:1)

事实证明,我不需要提供CA证书,因为他们的CA已由“已知”授权机构正确签名。所以我可以从我的请求中删除ca字段。

答案 1 :(得分:1)

我创建了一个root-ca和一个middle-ca(由root-ca签名)证书,然后我创建了一个服务器和一个由intermediate-ca签名的客户端证书。为了测试它,我一直在用nodejs实现一个服务器和客户端https,所以用certs设置它并在我的客户端上得到以下错误:

problem with request: unable to get local issuer certificate

要解决这个问题,我需要输入我的nodejs代码,在ca字段,我的root-ca和intermediate-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') ],

它对我有用。