一尘不染

HTTPS请求,指定主机名和特定的IP地址

node.js

我的应用程序服务器有一个基于Node.js的部署脚本。部署过程中的第一步是在向DNS注册之前,验证这些应用服务器是否正确侦听HTTPS。为此,我只需要向该服务器的IP地址发出HTTPS请求即可。

如果这是HTTP,则不是问题。我可以向发出HTTP
GET请求http://[2001:0db8::0370:7334]/,这将起作用。但是,如果我发出HTTPS
GET请求https://[2001:0db8::0370:7334]/,则此操作将失败,因为证书用于特定的主机名,例如api.example.com

如果我是手动测试,则将IP地址临时放在hosts文件和cURL中https://api.example.com。但是,在此自动化过程中,我可能一次部署多个主机,因此这不是我的部署脚本的解决方案。

如何在指定主机名和IP地址的地方发出HTTPS请求?

也许有某种方法可以通过自定义代理进行操作?

我目前正在使用node-fetch,但是很高兴使用所需的任何API来完成这项工作。


阅读 706

收藏
2020-07-07

共1个答案

一尘不染

设置host请求的标题:

const https = require('https');

https.get('https://AA.BB.CC.DD', {
  headers : { host : 'api.example.com' }
}, res => {
  console.log('okay');
}).on('error', e => {
  console.log('E', e.message);
});

编辑
:我挖了一下,看看这是如何工作的。为了允许基于HTTPS的虚拟主机,有一个称为SNI(服务器名称指示)的TLS扩展。客户端使用此扩展名指示其尝试连接的主机名,因此服务器可以选择属于该主机名的适当证书。

所使用的Node
tls模块,可以https选择servername设置此主机名:

https.get('https://AA.BB.CC.DD', {
  servername : api.example.com'
}, ...)

但是,您仍然还需要传递Host标头(这是常规HTTP协议的一部分):

https.get('https://AA.BB.CC.DD', {
  headers : { host : 'api.example.com' },
  servername : 'api.example.com'
}, ...)

为了保持干燥,Node.js的将设置servernameHost标题,除非它已经设置为别的东西(在这里)。

2020-07-07