无法验证第一个证书

Chr*_*our 6 python ssl openssl node.js

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

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

Python脚本(Python 3.4.3和请求库):

import requests
print(requests.get(url, verify='/tmp/cert/cacert.pem'))
Run Code Online (Sandbox Code Playgroud)

节点脚本(节点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);
    }
});
Run Code Online (Sandbox Code Playgroud)

两者都使用相同的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
Run Code Online (Sandbox Code Playgroud)

我不相信证书包的问题,​​我不想在Node中关闭主机验证.

有人知道为什么Node会抛出这个错误吗?

Chr*_*our 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);
    }
});
Run Code Online (Sandbox Code Playgroud)