无法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); } });
也许你可以使用这个模块来解决问题,通过下载浏览器通常使用的证书。