无法验证第一个证书

7
我有一个包含证书捆绑包、Python脚本和Node脚本的目录。这两个脚本都向相同的URL发出GET请求,并提供相同的证书捆绑包。Python脚本按预期进行请求,但是node脚本会抛出以下错误:

{ [Error: unable to verify the first certificate] code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE' }

Python脚本(Python 3.4.3和requests库):
import requests
print(requests.get(url, verify='/tmp/cert/cacert.pem'))

节点脚本 (Node 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会抛出这个错误吗?

2个回答

3

文档描述了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);
    }
});

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接