python - 无法验证第一个证书

原文 标签 python node.js ssl openssl

我有一个目录,包含一个证书包,一个Python脚本和一个节点脚本。两个脚本都对同一个URL进行GET请求,并提供相同的证书包。python脚本按预期发出请求,但是节点脚本抛出以下错误:
{[错误:无法验证第一个证书]代码:“无法验证叶签名”}
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为什么抛出这个错误吗?

最佳答案

documentation描述了ca选项,如下所示:
CA:PEM格式的字符串、缓冲区或字符串数组或受信任证书的缓冲区。如果省略这一点,将使用一些众所周知的“根”CAS,如VISIGIN。它们用于授权连接。
所以它不需要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);
    }
});

相关文章:

javascript - 节点Webkit应用:隐藏光标

java - Tomcat服务器上的javax.net.ssl.SSLHandshakeException

python - 以特定方式分隔列表的每个项目

python - 在Python中的FTP服务器上用.txt文件的文本填充变量

python - 联合类型实际上存在于python中吗?

node.js - 如何在Node.js中使用Firestore本地模拟器?

javascript - 如何从mysql连接检查回调函数获取返回数据?

iphone - 我们如何通过iPhone的Objective C获取启用SSL的网页的详细信息?

iframe - 如何在Meteor的特定页面上禁用HTTPS / SSL?

python - 动态依赖项如何在python setup.py中工作?