代码之家  ›  专栏  ›  技术社区  ›  Brad

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

  •  1
  • Brad  · 技术社区  · 6 年前

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

    如果这是HTTP,那就不是问题了。我可以做一个HTTP GET 请求 http://[2001:0db8::0370:7334]/ ,这将起作用。但是,如果我对 https://[2001:0db8::0370:7334]/ ,这将失败,因为证书用于特定的主机名,如 api.example.com .

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

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

    也许有什么办法可以用一个定制代理来做到这一点?

    我正在使用 node-fetch 但是我很乐意使用任何需要的API来完成这项工作。

    1 回复  |  直到 6 年前
        1
  •  3
  •   robertklep    6 年前

    设置 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 (Server Name Indication) .客户机使用此扩展来指示其尝试连接的主机名,以便服务器可以选择属于该主机名的适当证书。

    节点的 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将设置 服务器名 宿主 标题,除非它已经设置为其他内容( here )