无法validation第一个证书

我有一个包含证书包,Python脚本和Node脚本的目录。 这两个脚本都向相同的URL发出GET请求,并提供相同的证书包。 Python脚本按预期发出请求,但节点脚本会引发此错误:

{[错误:无法validation第一个证书]代码:'UNABLE_TO_VERIFY_LEAF_SIGNATURE'}

Python脚本(Python 3.4.3和请求库)

import requests print(requests.get(url, verify='/tmp/cert/cacert.pem')) 

节点脚本(节点4.2.6和请求库)

 var fs = require('fs'); var request = require('request'); request.get({ url: url, agentOptions: { ca: fs.readFileSync('/tmp/cert/cacert.pem') } }, function (error, response, body) { if (error) { console.log(error); } else { console.log(body); } }); 

两者都使用相同的OpenSSL版本:

 $ python -c 'import ssl; print(ssl.OPENSSL_VERSION)' OpenSSL 1.0.2e-fips 3 Dec 2015 $ node -pe process.versions.openssl 1.0.2e 

我不相信问题是与证书包,我不想closures节点中的主机validation。

有谁知道为什么节点抛出这个错误?

文档描述了ca选项,如下所示:

ca:PEM格式的string,缓冲区或string数​​组或可信证书缓冲区。 如果省略,将使用几个众所周知的“根”CA,例如VeriSign。 这些用于授权连接。

所以它不期望一个CA包。 解决方法很简单,只是像这样拆分包:

 var fs = require('fs'); var request = require('request'); var certs = fs.readFileSync('/tmp/cert/cacert.pem').toString().split("\n\n"); request.get({ url: url, agentOptions: { ca: certs } }, function (error, response, body) { if (error) { console.log(error); } else { console.log(body); } }); 

也许你可以使用这个模块来解决问题,通过下载浏览器通常使用的证书。

https://www.npmjs.com/package/ssl-root-cas