Node.js主机名/ IP不匹配证书的名称

我有代码:

var r = require('request'); r({ method: 'POST', url: 'https://api.dropbox.com'}, function() { console.log(arguments) } ) 

当我在节点0.9.4的桌面上运行它时,我在控制台中得到这个:

 { '0': [Error: Hostname/IP doesn't match certificate's altnames] } 

当我使用Node 0.6.12在Netbook上运行它时,它的所有工作都没有错误(302响应 – 我认为是正确的)。

问题Node.js主机名/ IP不符合证书altnames ,Rojuinex写道:“是啊,浏览器问题…对不起”。 “浏览器问题”是什么意思?

UPD。 在Node v0.8上回滚之后,此问题得到解决

由于0.9.2(包括0.10.x)node.js现在默认validation证书。 这就是为什么当你升级node.js 0.8时,你会看到它变得更加严格。 (HT: https : //github.com/mscdex/node-imap/issues/181#issuecomment-14781480 )

您可以使用{rejectUnauthorized:false}选项来避免这种情况,但这会造成严重的安全隐患 。 你发给对方的任何东西都会被encryption,但是发起中间人攻击变得容易,也就是说你的数据将被encryption到对方,但是对方本身并不是你认为的那个服务器!

首先诊断为什么证书没有授权,看看是否可以修改。

稍微更新的答案(因为我在不同的情况下遇到这个问题。)

当您使用SSL连接到服务器时,服务器所做的第一件事是提供一个证书,上面写着“我是api.dropbox.com”。 证书有一个“主题”,主题有“CN”(简称“通用名称”)。证书也可以有一个或多个“subjectAltNames”。 当node.js连接到服务器时,node.js获取此证书,然后validation它认为连接到的域名(api.dropbox.com)是否匹配主体的CN或其中一个altname。 请注意,在节点0.10.x中,如果使用IP进行连接,则IP地址必须位于altname中 – node.js将不会尝试对CNvalidationIP。

rejectUnauthorized标志设置为false会绕过这个检查,但首先如果服务器给你的凭据不是你所期望的,那么可怕的是正在进行,其次,这也将绕过其他检查 – 这不是一个好主意,如果你通过互联网连接。

如果使用节点> = 0.11.x,则还可checkServerIdentity: function(host, cert) tls模块指定一个checkServerIdentity: function(host, cert)函数,如果要允许连接并抛出exception,应该返回undefined (尽pipe我不不知道request是否会通过代理这个标志来为你服务。)声明这样一个函数和console.log(host, cert);是方便的console.log(host, cert); 弄清楚究竟是怎么回事。

我知道这是旧的,但对于其他人看:

从主机名中删除https://并添加端口443。

 { method: 'POST', hostname: 'api.dropbox.com', port: 443 } 

如果你正在使用http-proxy包,你可以设置changeOrigin为true。

 const proxy = httpProxy.createProxyServer(); proxy.web(req, res, { changeOrigin: true, target: https://example.com:3000, }); 

我有同样的问题使用请求模块代理来自其他地方的POST请求,这是因为我离开主机属性的标题(我是从原始请求复制标题)。