执行https请求时出现CERT_UNTRUSTED错误

5
我正在尝试从我的node服务器端执行https请求,但它给我以下错误:
Caught exception: Error: CERT_UNTRUSTED

如果我执行http请求,则一切正常,但对于https链接它无法工作
这是我的代码:-
var request = require('request');
request('https://en.m.wikipedia.org/wiki/Astrid_Olofsdotter_of_Sweden', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body) // Show the HTML for the Google homepage.
  }
})

有什么想法吗?

2
在url参数后面加上,{strictSSL: false}选项怎么样? - Weibo Chen
1
仅供测试目的 - 您是否尝试在PEM格式中下载wikipedia.com证书,然后像这里提到的那样将其指定为可信证书:https://dev59.com/OGEi5IYBdhLWcg3wuuUk? - RomanK
你正在使用哪个版本的 npmnode - Pritish Vaidya
@pritishvaidya 我的 npm 版本是 2.5.1,node 版本是 v0.12.0。 - arun kamboj
1
你可以尝试最新版本(如果可行的话),或者检查是否有任何代理或VPN导致问题。 - Pritish Vaidya
显示剩余6条评论
4个回答

3
这可能是由于多种原因造成的,我运行了你的代码,对我来说很好。
node --version
v0.12.5

所以你需要查看:

  1. 你正在使用的nodejs版本

根证书会定期更新,我建议进行更新,因为可能使用的证书比分发包中的根证书更新,从而显示为不受信任。

  1. 网络-可能你在代理后面,代理对你的请求做了一些意想不到的操作。

  2. 目标服务器,可能返回了一些意外的内容。

最有可能的是1,你正在使用一个不认识该站点证书提供者的nodejs版本,因此说其不受信任。

我认为2和3的可能性相当。如果你正在爬维基百科,他们可能已经屏蔽了你,或者将你推向错误页面,其中证书可能无效。

虽然像其他帖子所建议的那样可以关闭验证,但我不建议成为一种习惯。在生产环境中永远不要这样做。

唯一违反此规则的时候是在本地机器上使用自签名证书。


0

看起来像是 SSL 问题,修复网络环境的 SSL 的最佳方法。


目前,您可以通过将rejectUnauthorized设置为false来绕过此问题。

const request = require("request");
const https = require('https');
const agentOptions = {
    host: 'en.m.wikipedia.org',
    port: '443',
    path: '/wiki/Astrid_Olofsdotter_of_Sweden',
    rejectUnauthorized: false
};
const agent = new https.Agent(agentOptions);

const postOption = {
    method: 'GET',
    agent: agent,
    uri: 'https://en.m.wikipedia.org/wiki/Astrid_Olofsdotter_of_Sweden'
};

request(postOption, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body);
  }
});

0

您可以使用以下命令绕过 https:

npm config set strict-ssl false

将 strict-ssl 设置为 false 可以允许所有节点服务器访问任何 URL。

或者像下面这样设置注册表 URL 为 https 或 http:

npm config set registry="http://registry.npmjs.org/"

注意:然而,个人认为绕过https并不是真正的解决方案,但我们可以将其作为一种解决方法。

希望这能帮到你。


2
不使用SSL并不是问题的答案,正如您根据注释所知道的那样。假定Arun想要在他们的应用程序中启用SSL。此外,在问题的评论中,Arun表示在将strictSSL:false添加到选项后,错误仍然存在。 - regdoug

0

一个非常接近的答案可以在这里找到。

对于这个问题,有一个非常详细和具体的答案在这里给出。

我建议你在调用https.request()之前设置:

process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";

在代理选项中设置:
const agentOptions = {    
    ... 
    rejectUnauthorized: false
};

此外,还可以参考request库的TLS/SSL文档

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