我有一个包含证书包,Python脚本和Node脚本的目录。这两个脚本都对同一个URL发出GET请求,并提供相同的证书包。 Python脚本按预期生成请求,但节点脚本会抛出此错误:
{[错误:无法验证第一个证书]代码:'UNABLE_TO_VERIFY_LEAF_SIGNATURE'}
Python脚本(Python 3.4.3和requests库):
import requests
print(requests.get(url, verify='/tmp/cert/cacert.pem'))
节点脚本(节点4.2.6和request库):
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
我不相信证书包的问题,我不想在Node中关闭主机验证。
有人知道为什么Node会抛出此错误吗?
答案 0 :(得分:2)
documentation描述了ca
选项,如下所示:
ca:PEM格式的字符串,缓冲区或字符串数组或受信任证书的缓冲区。如果省略这一点,将使用几个众所周知的“根”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);
}
});
答案 1 :(得分:0)
也许您可以使用此模块通过下载浏览器通常使用的证书来解决问题。