我的应用程序服务器有一个基于 Node.js 的部署脚本。部署过程中的一个步骤是在向 DNS 注册之前验证这些应用程序服务器是否正确监听 HTTPS。为此,我只需向该服务器的 IP 地址发出 HTTPS 请求。
如果这是 HTTP,那不是问题。我可以为 http://[2001:0db8::0370:7334]/
发出 HTTP GET
请求,这会起作用。但是,如果我为 https://[2001:0db8::0370:7334]/
发出 HTTPS GET 请求,这将失败,因为证书是针对特定主机名的,例如 api。 example.com
.
如果我手动测试,我会暂时将 IP 地址放在 hosts
文件和 cURL https://api.example.com
中。但是,在此自动化过程中,我可能会同时部署多个主机,因此这不是我的部署脚本的解决方案。
如何发出指定主机名和 IP 地址的 HTTPS 请求?
也许有一些方法可以使用自定义代理来做到这一点?
我目前正在使用 node-fetch ,但我很乐意使用完成这项工作所需的任何 API。
最佳答案
为请求设置host
header :
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 (Server Name Indication) 的 TLS 扩展。 .客户端使用此扩展来指示它尝试连接的主机名,因此服务器可以选择属于该主机名的适当证书。
https
使用的 Node 的 tls
模块有一个选项 servername
设置此主机名:
https.get('https://AA.BB.CC.DD', {
servername : api.example.com'
}, ...)
但是,您仍然需要传递 Host
header (这是常规 HTTP 协议(protocol)的一部分):
https.get('https://AA.BB.CC.DD', {
headers : { host : 'api.example.com' },
servername : 'api.example.com'
}, ...)
为了保持干燥,Node.js 会将 servername
设置为 Host
header ,除非它已经设置为其他内容 ( here )。
关于node.js - HTTPS 请求,指定主机名和具体 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53522723/