我正在尝试从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证书的容忍度更高吗?
答案 0 :(得分:1)
该站点设置不正确,并且未提供必要的中间证书来验证信任链。浏览器通常通过尝试以某种方式获取丢失的证书来解决此类问题,而其他大多数应用程序则没有。您可以通过查看SSLLabs report来清楚地看到此问题,其中明确指出“此服务器的证书链不完整。等级上限为B。”
如果我使用python请求,它将起作用:...
python请求对SSL证书的容忍度是否更高?
不适用于我,但导致相同的错误:
requests.exceptions.SSLError:...
u'[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败...
可能是因为您使用的是非常旧的Python版本,其中正确的证书验证功能已关闭,或者您已经将丢失的中间证书导入到requests
使用的信任存储区中(这可能与之前的版本不同)由nodejs使用)。