我的应用程序服务器有一个基于Node.js的部署脚本。部署过程中的第一步是在向DNS注册之前,验证这些应用服务器是否正确侦听HTTPS。为此,我只需要向该服务器的IP地址发出HTTPS请求即可。
如果这是HTTP,则不是问题。我可以向发出HTTP GET请求http://[2001:0db8::0370:7334]/,这将起作用。但是,如果我发出HTTPS GET请求https://[2001:0db8::0370:7334]/,则此操作将失败,因为证书用于特定的主机名,例如api.example.com。
GET
http://[2001:0db8::0370:7334]/
https://[2001:0db8::0370:7334]/
api.example.com
如果我是手动测试,则将IP地址临时放在hosts文件和cURL中https://api.example.com。但是,在此自动化过程中,我可能一次部署多个主机,因此这不是我的部署脚本的解决方案。
hosts
https://api.example.com
如何在指定主机名和IP地址的地方发出HTTPS请求?
也许有某种方法可以通过自定义代理进行操作?
我目前正在使用node-fetch,但是很高兴使用所需的任何API来完成这项工作。
设置host请求的标题:
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设置此主机名:
tls
https
servername
https.get('https://AA.BB.CC.DD', { servername : api.example.com' }, ...)
但是,您仍然还需要传递Host标头(这是常规HTTP协议的一部分):
Host
https.get('https://AA.BB.CC.DD', { headers : { host : 'api.example.com' }, servername : 'api.example.com' }, ...)
为了保持干燥,Node.js的将设置servername为Host标题,除非它已经设置为别的东西(在这里)。