不同的证书被呈现给node.js和浏览器

当我在浏览器中访问https://gmail.com时,我发送了一个301redirect到https://mail.google.com 。 当我尝试使用node.js做同样的事情时,我得到一个“主机名/ IP不匹配证书的altnames”错误。

这是有道理的,因为gmail.com向node.js提供的证书不包含“gmail.com”作为其通用名称或alt名称。 这是由gmail.com提供的证书…

{ subject: { C: 'US', ST: 'California', L: 'Mountain View', O: 'Google Inc', CN: 'mail.google.com' }, issuer: { C: 'US', O: 'Google Inc', CN: 'Google Internet Authority G2' }, subjectaltname: 'DNS:mail.google.com', exponent: '10001', valid_from: 'Feb 25 15:21:00 2014 GMT', valid_to: 'May 26 00:00:00 2014 GMT'} 

当我检查应该由服务器提供的证书时,我看到http://www.sslshopper.com/ssl-checker.html#hostname=gmail.com哪些包括gmail.com扩展。 我认为这是浏览器正在接收。

为什么节点向浏览器发送不同的证书? 这可能与CNAME和DNS有关吗?

这可能是因为您的浏览器支持服务器名称指示 (SNI)和Node.js(或者说,您正在使用的客户端模块)不支持。 由于证书协商发生在HTTP可以开始之前,所以需要SNI来为单个IP地址提供多个主机名。