Javascript Node.js请求证书已过期
我正在使用Mikeal的request()向服务器发出https请求。但是,我一直收到一个证书过期的授权错误Javascript Node.js请求证书已过期,javascript,node.js,express,request,Javascript,Node.js,Express,Request,我正在使用Mikeal的request()向服务器发出https请求。但是,我一直收到一个证书过期的授权错误 request({ url: 'https://www.domain.com/api/endpoint', strictSSL: false }, function(error, response, body) { if(!error && response.statusCode == 200) {
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\u错误已过期。导致此问题的原因是什么?有没有办法在nodejs中修复此问题?将此添加到文件顶部:
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
危险这将在整个node.js环境中禁用HTTPS/SSL/TLS检查。请查看下面使用https代理的解决方案。尝试临时修改request.js和harcode everywhere rejectUnauthorized=true,但最好将证书作为长期解决方案进行扩展。解决此问题的最佳方法: 更新证书。这可以通过使用Let'sEncrypt颁发证书来免费完成™v2 解决此问题的一种不太安全的方法: 通过将
代理
与拒绝未授权
一起使用,您至少可以将安全漏洞限制在处理该站点的请求上,而不是使整个节点进程完全不安全
其他选择
如果您使用的是自签名证书,您将添加此选项:
agentOptions.ca = [ selfSignedRootCaPemCrtBuffer ];
对于受信任的对等连接,还应添加以下两个选项:
agentOptions.key = clientPemKeyBuffer;
agentOptions.cert = clientPemCrtSignedBySelfSignedRootCaBuffer;
坏主意
不幸的是,
process.env.NODE_TLS_REJECT_UNAUTHORIZED='0'代码>甚至有文档记录。它应该只用于调试,而不应该使它成为在野外运行的某种代码。几乎每一个在https上运行的库都有一种传递代理选项的方式。那些没有的应该被修复。我认为strictSSL:false
应该(即使在2013年也应该有效)起作用。简言之,有三种可能的方式:
(显然)让您的CA续订证书,并将其放在您的服务器上李>
更改请求的默认设置对象:
const myRequest=require('request')。默认值({strictSSL:false})
许多内部使用节点请求
的模块也允许注入请求
-对象,因此您可以让它们使用修改后的实例
(不推荐)通过为NODE.js进程设置环境变量NODE\u TLS\u REJECT\u UNAUTHORIZED=0,覆盖all证书检查allHTTP(S)代理连接
这里有一个更简洁的方法来实现CoolAJ86提出的“不那么不安全”的方法
request({
url: url,
agentOptions: {
rejectUnauthorized: false
}
}, function (err, resp, body) {
// ...
});
今天早上在我的MacBookPro上调试时,我在Heroku和本地的生产中遇到了这个问题
经过一个小时的调试,这一问题在本地和生产环境中自行解决。我不确定是什么修复了它,所以这有点烦人。当我认为我做了什么事情时,事情就发生了,但是恢复我假定的修复并没有让问题恢复过来:(
有趣的是,我的数据库服务MongoDb从今天早上开始就出现了服务器问题,所以很有可能与此相关
您的URL字段缺少一个“'”最后。您是否有可能提供端点URL?您是否验证了服务器SSL证书实际上没有过期?也许是时候续订它了。SSL证书已经过期。是否仍然可以发出此请求,忽略过期的证书,并获得响应?设置代理:false
和如何>strictSSL:false
?请取消将其标记为解决方案。这很危险。每次使用此dis解决方案时,NSA代理都会发挥作用。@CoolAJ86有一些有效的情况可以使用此解决方案。现在我正在等待更新开发API服务器上过期的SSL证书。这妨碍了我的工作能力,这是一个完美的解决方案暂时忽略SSL问题很好。@CoolAJ86对于我的用例(您缺乏所有上下文),它不适用。抱歉,但您的基本教义没有帮助。@CoolAJ86如果我有一个本地应用程序,它只与本地环境中的登台服务器进行HTTPS连接,那么在功能上绝对没有区别因此,这是一个可接受的解决方案。您所说的[selfSignedRootCaPemCrtBuffer]是什么意思?如果我知道它在哪里,如何提供缓冲区?如果你创建了一个自签名证书,那么你会使用同一个自颁发根证书的pem版本作为缓冲区。你知道什么时候证书没有自签名也没有过期,但是节点抱怨它过期了吗?3.刚刚从monkey patching kibana 5中为插件instal解救了我l通过带有SSL拦截的MITM代理。如果从https
导入request
,则您甚至不需要agentOptions
:rejectUnauthorized
可以是直接传递给request
的对象上的属性。
request({
url: url,
agentOptions: {
rejectUnauthorized: false
}
}, function (err, resp, body) {
// ...
});