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

标签 node.js https

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

相关文章:

node.js - fs.writeFile() 是否处理 Nodejs 中的竞争条件?

javascript - 使用 webpack 的 require.ensure 函数为 javascript 模块编写测试

node.js - { 蒙戈超时错误 : Server selection timed out after 30000 ms

apache - 404 页面上的 SSL https 错误,但其他页面在启用重定向的情况下工作正常

javascript - 告诉 npm 在特定文件夹中查找 package.json

node.js - 自签名证书仅适用于 localhost,不适用于 127.0.0.1

javascript - 将 ssl 与 websocket 一起使用时出错

node.js - 在 Node/express 上安装 RapidSSL 证书

java - 使用 JAVA 1.7.0_45,Applet 不显示在 HTTPS 上,没有握手错误

caching - 使用 https 的 Drupal 模块 Boost,提取错误的缓存页面