我的WebProxy是在节点中构建的。我正在使用request
模块从给定的Url中获取内容。当网站在浏览器中正常打开时,https://www.macu.com收到 CERT_HAS_EXPIRED错误。
我通过 Chrome 调查并检查了证书详细信息,但我发现该证书尚未过期。我不明白这个网站证书的问题。
我认为这可能是Node.js列表中没有的供应商的问题。我尝试升级npm和节点版本但没有成功。此外,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);
};
我只是想知道
答案 0 :(得分: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模块)可能没有自己存储的中间证书,因此它们依赖于它们所呈现的内容。如果链中的一个证书过期,那么整个事情的验证就会失败。