Node.js 请求 CERT_HAS_EXPIRED

新手上路,请多包涵

我正在使用 Mikeal 的请求 ( https://github.com/mikeal/request ) 向服务器发出 https 请求。但是,我不断收到 CERT_HAS_EXPIRED 授权错误。

 request({
        url: 'https://www.domain.com/api/endpoint',
        strictSSL: false
    }, function(error, response, body) {
        if(!error && response.statusCode == 200) {
            res.json(JSON.parse(body));
        } else {
           res.json(response.statusCode, {'error': 'error'})
        }
});

我尝试将 strictSSL 设置为 true 和 false,两者都输出相同的 CERT_HAS_EXPIRED 错误。是什么导致了这个问题,有没有办法在 nodejs 中修复它?

原文由 wwwuser 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

将此添加到文件顶部:

 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';

危险 这会在整个 node.js 环境中禁用 HTTPS / SSL / TLS 检查。请参阅下面使用 https 代理的解决方案。

原文由 Dan Kohn 发布,翻译遵循 CC BY-SA 3.0 许可协议

解决此问题的最佳方法:

更新证书。这可以使用 Greenlock 免费完成,Greenlock 通过 Let’s Encrypt™ v2 颁发证书

一种 不太 安全的方法来解决这个问题:

 'use strict';

var request = require('request');
var agentOptions;
var agent;

agentOptions = {
  host: 'www.example.com'
, port: '443'
, path: '/'
, rejectUnauthorized: false
};

agent = new https.Agent(agentOptions);

request({
  url: "https://www.example.com/api/endpoint"
, method: 'GET'
, agent: agent
}, function (err, resp, body) {
  // ...
});

通过将 agentrejectUnauthorized --- 一起使用,您至少将安全漏洞限制在处理该站点的请求中,而不是使整个节点进程完全、完全不安全。

其他选项

如果您使用的是自签名证书,则可以添加此选项:

 agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];

对于受信任的对等连接,您还可以添加这两个选项:

 agentOptions.key = clientPemKeyBuffer;
agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;

馊主意

不幸的是 process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'; 甚至被记录在案。它应该只用于调试,不应该把它变成在野外运行的代码。几乎每个在 https 上运行的库都有一种传递代理选项的方法。那些不应该被修复。

原文由 coolaj86 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏