www*_*ser 42 javascript request node.js express
我正在使用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'})
}
});
Run Code Online (Sandbox Code Playgroud)
我已经尝试将strictSSL设置为true和false,两者都输出相同的CERT_HAS_EXPIRED错误.导致此问题的原因是什么方法可以在nodejs中修复它?
Coo*_*J86 96
续订证书.这可以使用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) {
// ...
});
Run Code Online (Sandbox Code Playgroud)
通过使用agentwith rejectUnauthorized至少可以将安全漏洞限制为处理该站点的请求,而不是使整个节点完全处理,完全不安全.
如果您使用的是自签名证书,则可以添加以下选项:
agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];
Run Code Online (Sandbox Code Playgroud)
对于可信对等连接,您还可以添加以下两个选项:
agentOptions.key = clientPemKeyBuffer;
agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;
Run Code Online (Sandbox Code Playgroud)
不幸的process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';是,甚至记录在案.它应该仅用于调试,并且永远不应该在一些在野外运行的代码中进行调试.几乎每个运行atop的库https都有一种传递代理选项的方法.那些不应该修复的.
Max*_*Max 70
如果今天有人在使用旧版本的 Node.js 时遇到此问题,这可能是由于Let's encrypt 9 月 30 日造成的。这个答案中已经提到了2021 ROOT CA 到期。
证书硬编码在节点源代码中,并且新的 ISRG Root X1 证书仅在此提交中添加。
人们可以更新其节点版本,使用node --use-openssl-ca标志(假设 openssl 证书是最新的),使用其他答案中提到的 http 代理解决方案(我没有测试它),或者设置process.env.NODE_TLS_REJECT_UNAUTHORIZED = 0为一种快速而肮脏的解决方法。
Dan*_*ohn 44
在文件顶部添加:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
Run Code Online (Sandbox Code Playgroud)
危险这会禁用整个node.js环境中的HTTPS/SSL/TLS检查.请使用下面的https代理查看解决方案.
NTy*_*ler 18
这是一种更简洁的方法来实现CoolAJ86提出的"不太安全"的方法
request({
url: url,
agentOptions: {
rejectUnauthorized: false
}
}, function (err, resp, body) {
// ...
});
Run Code Online (Sandbox Code Playgroud)
我认为strictSSL: false应该(应该在2013年工作).简而言之,有三种可能的方式:
request对象的默认设置:const myRequest = require('request').defaults({strictSSL: false}) node-request内部使用的模块也允许request注入对象,因此您可以使用已修改的实例.NODE_TLS_REJECT_UNAUTHORIZED=0的Node.js的过程.| 归档时间: |
|
| 查看次数: |
80003 次 |
| 最近记录: |