HTTPS-запрос с указанием имени хоста и конкретного IP-адреса - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть сценарий развертывания Node.js для моих серверов приложений.Одним из шагов в процессе развертывания является проверка правильности прослушивания этими серверами приложений HTTPS перед их регистрацией в DNS.Чтобы сделать это, мне просто нужно сделать HTTPS-запрос к IP-адресу этого сервера.

Если бы это был HTTP, это не проблема.Я могу сделать запрос HTTP GET для http://[2001:0db8::0370:7334]/, и это будет работать.Однако, если я сделаю запрос HTTPS GET для https://[2001:0db8::0370:7334]/, это не будет выполнено, так как сертификат предназначен для определенного имени хоста, например api.example.com.

Если бы я тестировал вручную, я бы временно поместил IP-адрес вфайл hosts и cURL https://api.example.com.Однако в этом автоматизированном процессе я могу развернуть несколько хостов одновременно, так что это не решение для моего сценария развертывания.

Как я могу сделать HTTPS-запрос, где я указываю имя хоста и IP-адрес?

Возможно, есть какой-то способ сделать это с помощью специального агента?

В настоящее время я использую node-fetch , но я рад использовать любой API, необходимый длясделать эту работу.

1 Ответ

0 голосов
/ 02 декабря 2018

Установите заголовок 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, есть расширение TLS под названием SNI (индикация имени сервера) .Это расширение используется клиентом для указания имени хоста, к которому он пытается подключиться, поэтому сервер может выбрать соответствующий сертификат, принадлежащий этому имени хоста.

Модуль 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 установит servername в заголовок Host, если только для него не установлено другое значение ( здесь ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...