我获得了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,但我真的不愿意)
答案 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') ],
它对我有用。