HTTPS-запрос с указанием имени хоста и конкретного IP-адреса

У меня есть сценарий развертывания на основе 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, необходимый для этой работы.

Похоже, вы просите обойти проверку сертификатов для проверки https (для чего требуются сертификаты) ... почему бы просто не использовать имя хоста, если оно у вас есть?

Cody G 28.11.2018 17:08

@CodyG. Нет, я пытаюсь сделать наоборот. Я хочу подтвердить сертификат.

Brad 28.11.2018 17:09

добро пожаловать, возможно, единственный способ - изменить функцию поиска DNS, как это делает модуль, предложенный в этом пакете. stackoverflow.com/questions/35026131/…, но он может не работать в более новой версии узла ...

Cody G 28.11.2018 17:44
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
3
5 794
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Установите заголовок 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 02.12.2018 22:14

@Brad см. Редактировать. Вы правы, Node.js является повторно использует значение заголовка.

robertklep 02.12.2018 22:29

Замечательно, спасибо за дополнительные исследования и объяснения! Я награду награду, как только Stack Overflow позволит мне.

Brad 02.12.2018 22:42

Другие вопросы по теме