无法验证第一个证书; NodeJ vs Python请求

时间:2019-12-15 10:25:20

标签: node.js ssl https python-requests

我正在尝试从NodeJs向stackshare.io发出http请求:

var https = require('https');
var options = {
   host: 'www.stackshare.io',
};

https.get(options, function (http_res) {
    var data = "";
    http_res.on("data", function (chunk) {
      data += chunk;
      console.log('data:', data)
    });

});

我得到:

Error: unable to verify the first certificate
    at TLSSocket.onConnectSecure (_tls_wrap.js:1055:34)
    at TLSSocket.emit (events.js:198:13)
    at TLSSocket._finishInit (_tls_wrap.js:633:8)

如果我将host更改为www.google.com,它将起作用。这是否意味着stackshare处理SSL证书的方式存在问题?

我发现了几个类似(但略有不同)的问题,建议尝试这样做:

var rootCas = require('ssl-root-cas/latest').create();
require('https').globalAgent.options.ca = rootCas;

但是我仍然遇到同样的错误。

如果我使用python requests,它将起作用:

import requests

print requests.get('https://stackshare.io').content

python要求SSL证书的容忍度更高吗?

1 个答案:

答案 0 :(得分:1)

该站点设置不正确,并且未提供必要的中间证书来验证信任链。浏览器通常通过尝试以某种方式获取丢失的证书来解决此类问题,而其他大多数应用程序则没有。您可以通过查看SSLLabs report来清楚地看到此问题,其中明确指出“此服务器的证书链不完整。等级上限为B。”

  

如果我使用python请求,它将起作用:...
python请求对SSL证书的容忍度是否更高?

不适用于我,但导致相同的错误:

  

requests.exceptions.SSLError:...
u'[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败...

可能是因为您使用的是非常旧的Python版本,其中正确的证书验证功能已关闭,或者您已经将丢失的中间证书导入到requests使用的信任存储区中(这可能与之前的版本不同)由nodejs使用)。