Javascript Node.js请求证书已过期

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) {

我正在使用Mikeal的request()向服务器发出https请求。但是,我一直收到一个证书过期的授权错误

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) {
      // ...
    });