【问题标题】:Error: CERT_HAS_EXPIRED in Node.js request module (macu vs facebook)错误:Node.js 请求模块中的 CERT_HAS_EXPIRED(macu 与 facebook)
【发布时间】:2014-12-31 05:20:55
【问题描述】:

我的 WebProxy 内置在节点中。我正在使用 request 模块从给定的 Url 获取内容。当网站在浏览器中正常打开时,https://www.macu.com 出现 CERT_HAS_EXPIRED 错误

我的调查

我通过 Chrome 调查并检查了证书详细信息,但我发现证书没有过期。我不明白这个网站证书的问题。

我认为这可能是 Node.js 列表中不存在的供应商的问题。我尝试升级 npm 和 node 版本但没有成功。此外,https://www.facebook.com 的证书也是由 DigiCert High Assurance CA-3 供应商颁发的,清楚地表明该供应商存在于 Node.js CA 列表中。

代码如下:

var request = require('request');

function getContent(urlOptions) {
  request.get(urlOptions, function(error, response, body) {
    if (error) console.log('Error:'  + error);

    if (body) {
      console.log('Body:' + body);
    }
  });
}

exports.init = function() {
  var urlOptions = {
    headers: {
      'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
      'Accept-Encoding': 'gzip,deflate,sdch',
      'Accept-Language': 'en-US,en;q=0.8',
      'Cache-Control': 'max-age=0',
      'Connection': 'keep-alive',
      'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/33.0.1750.152 Safari/537.36'
    },
    secureProtocol: 'TLSv1_method'
  };

  /* URL options for macu.com domain */
  urlOptions.url = 'https://www.macu.com/mystyle-checking';
  urlOptions.headers.host = urlOptions.headers.Host = 'www.macu.com';
  // urlOptions.rejectUnauthorized = false;  // Works when this option is set but it may cause security issue

  getContent(urlOptions);

  urlOptions.url = 'https://www.facebook.com';
  urlOptions.headers.host = urlOptions.headers.Host = 'www.facebook.com';

  getContent(urlOptions);
};

我只想知道

  1. 为什么请求模块抱怨 macu.com 而不是 facebook.com,而两者都拥有同一供应商的证书。
  2. macu 的证书有什么问题?
  3. 为什么证书会为节点抛出错误但被浏览器接受。

【问题讨论】:

  • DigiCert High Assurance EV Root CA 的中间证书似乎已过期,请参阅 f.e. sslshopper.com/ssl-checker.html#hostname=www.macu.com
  • @CBroe 谢谢它的帮助。我的一个问题仍然与为什么浏览器不抱怨它有关?
  • 您的浏览器可能已经安装了该中间证书的更新、有效版本(并使用它来证明签名机构的身份),而在您的节点实例上它仍然是旧版本(并且它把它呈现给对方)。
  • @CBroe 再次感谢!它真的很有帮助。也许您可以将此作为答案,以便我接受。我仍然不明白我的节点实例是如何选择旧的。我已经启动了一个新的节点实例,此外,证书由网站发送到客户端(浏览器/节点服务器),因此它们都应该获得相同的证书。我的理解有什么问题?

标签: node.js ssl ssl-certificate node-request


【解决方案1】:

DigiCert High Assurance EV Root CA 的中间证书似乎已过期,请参阅 f.e. https://www.sslshopper.com/ssl-checker.html#hostname=www.macu.com

您的浏览器可能没有抱怨它,因为它已经安装了该中间证书的更新、有效版本(并用它来证明签名机构的身份),而在您的节点实例上它仍然是旧的一个(并将其提交给对方)。

编辑:进一步解释:当双方协商加密连接时,发起方将出示其证书和中间证书,以便对方验证。

如果您的浏览器已经在自己的证书缓存中存储了最新的中间证书DigiCert High Assurance EV Root CA,那么它可能会使用它来验证它所提供的证书。

但其他方(例如您的 node.js 模块)可能没有自己存储中间证书,因此他们依赖于所提供的内容。如果链中的一个证书过期,整个验证将因此失败。

【讨论】:

  • 感谢您的帮助!!您能否就浏览器和节点实例显示的行为差异解释一下您的答案。为什么会这样?
  • 我尝试添加更多解释;但它或多或少是“外行的术语”(我也不是这方面的专家。)
  • 非常感谢您的解释!!你的小解释很有道理!!谢谢:)
猜你喜欢
  • 2013-12-24
  • 2023-03-22
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多