gpt4 book ai didi

node.js - HTTPS 请求,指定主机名和具体 IP 地址

转载 作者:搜寻专家 更新时间:2023-11-01 00:27:41 24 4
gpt4 key购买 nike

我的应用程序服务器有一个基于 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com