У меня есть сценарий развертывания на основе 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-адрес?
Возможно, есть способ сделать это с помощью специального агента?
В настоящее время я использую выборка узла, но я счастлив использовать любой API, необходимый для этой работы.
@CodyG. Нет, я пытаюсь сделать наоборот. Я хочу подтвердить сертификат.
добро пожаловать, возможно, единственный способ - изменить функцию поиска DNS, как это делает модуль, предложенный в этом пакете. stackoverflow.com/questions/35026131/…, но он может не работать в более новой версии узла ...





Установите заголовок host для запроса:
const https = require('https');
https.get('https://AA.BB.CC.DD', {
headers : { host : 'api.example.com' }
}, res => {
console.info('okay');
}).on('error', e => {
console.info('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, если он еще не установлен на что-то другое (здесь).
Круто, работает! Есть ли шанс объяснить, почему это работает? Кажется, что заголовки HTTP не должны иметь ничего общего с уровнем TLS. Есть ли что-то внутреннее в модулях Node.js, которое повторно использует это значение заголовка?
@Brad см. Редактировать. Вы правы, Node.js является повторно использует значение заголовка.
Замечательно, спасибо за дополнительные исследования и объяснения! Я награду награду, как только Stack Overflow позволит мне.
Похоже, вы просите обойти проверку сертификатов для проверки https (для чего требуются сертификаты) ... почему бы просто не использовать имя хоста, если оно у вас есть?