我正在使用 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 中解决它?
最佳答案
解决此问题的最佳方法:
更新证书。这可以使用 Greenlock 免费完成。通过 Let's Encrypt™ v2 颁发证书
一个less不安全的方法来解决这个问题:
'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) {
// ...
});
通过将 agent
与 rejectUnauthorized
一起使用,您至少可以将安全漏洞限制在处理该站点的请求中,而不是使您的整个 Node 进程完全、完全不安全.
其他选项
如果您使用的是自签名证书,您将添加此选项:
agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];
对于受信任的对等连接,您还可以添加以下 2 个选项:
agentOptions.key = clientPemKeyBuffer;
agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;
坏主意
不幸的是,process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
甚至被记录在案。它应该只用于调试,并且永远不应该将它变成可以在野外运行的代码。几乎每个在 https
上运行的库都有一种传递代理选项的方法。那些不应该修复的。
关于javascript - Node.js 请求 CERT_HAS_EXPIRED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20433287/