Як перевірити URL-адресу HTTPS із заданою IP-адресою


77

Скажімо, веб-сайт збалансований між кількома серверами. Я хочу запустити команду, щоб перевірити, чи працює вона, наприклад curl DOMAIN.TLD. Отже, щоб виділити кожну IP-адресу, я вказую IP вручну. Але багато веб - сайти можуть бути розміщені на сервері, так що я по- , як і раніше забезпечує заголовок вузла, наприклад: curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. Наскільки я розумію, ці дві команди створюють той самий запит HTTP. Єдина відмінність полягає в тому, що в останній я виймаю частину пошуку DNS з CURL і роблю це вручну (будь ласка, виправте мене, якщо я помиляюся).

Все добре поки що. Але тепер я хочу зробити те ж саме для URL-адреси HTTPS. Знову я можу перевірити це так curl https://DOMAIN.TLD. Але я хочу вказати IP вручну, тому запускаю curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'. Тепер я отримую помилку CURL:

curl: (51) SSL: certificate subject name 'DOMAIN.TLD' does not match target host name 'IP_ADDRESS'.

Звичайно, я можу обійти це, сказавши CURL, щоб не піклувався про сертифікат (опція "-k"), але це не ідеально.

Чи існує спосіб ізоляції підключеної IP-адреси від хоста, який сертифікований SSL?


Чи є ваш балансир навантаження точкою завершення SSL чи це окремі випадки?
rikola

Чи може хтось пояснити, чому заголовок Host не вибирає правильний VHost та сертифікат на задньому плані для HTTPS, але це лише для HTTP працює нормально. Чи передає клієнт інформацію в бек-енд (використовуючи протокол HTTPS), використовувався чи IP або домен?
NeverEndingQueue

@NeverEndingQueue Щоб зрозуміти це, вам потрібно знати зв'язок між TLS та HTTP. Сервер повинен показати сертифікат, перш ніж він отримає доступ до Hostзаголовка, тому --resolveце правильний спосіб закріпити IP-адресу.
Франклін Ю

Відповіді:


117

Подумайте, я знайшов рішення, проходячи через керівництво CURL:

curl https://DOMAIN.EXAMPLE --resolve 'DOMAIN.EXAMPLE:443:192.0.2.17'

Додано в [curl] 7.21.3. Підтримка видалення додана в 7.42.0.

від CURLOPT_RESOLVE пояснив


1
- вирішити doe не існує в curl ...
JustAGuy

7
Завивка на моїй машині (7.27.0) має --resolve.
Терон Лун

Ви можете бачити, як це працює за допомогою, curl -vі ви можете бачити, що curl додає опцію роздільної здатності до тимчасовості кешу DNS, а додає, використовуючи вказану вами IP-адресу.
CMCDragonkai

CentOS 6.8 curl: option --resolve: is unknown curl: спробуйте 'curl --help' або 'curl - manual' для отримання додаткової інформації root @ server3 [~] # curl -V curl 7.19.7 (x86_64-redhat-linux -gnu) libcurl / 7.19.7 NSS / 3.21 Basic ECC zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2 Протоколи: tftp ftp telnet dict ldap ldaps http file https ftps scp sftp Особливості: GSS-переговори IDN IPv6 Largefile NTLM SSL libz
Хосе Нобіле

Зауважте, що якщо ви використовуєте ім'я хоста IP_ADDRESS, воно мовчки ігнорує параметр.
Xiong Chiamiov

11

Ви можете змінити в / etc / hosts, щоб змусити сервер думати, що домен розташований під певним IP-адресою.

Це синтаксис:

192.168.10.20 www.domain.tld

Це змусить cURL використовувати потрібну IP-адресу без SSL-сертифіката.


4
Це працює, але я дивлюсь на якийсь метод, який не потребує модифікації ОС в цілому
Мартін

Я, чесно кажучи, не думаю, що існує інший спосіб. Ви повинні отримати CURL для доступу до правильного доменного імені, щоб сертифікат працював, а спосіб відображення певного домену в IP - це DNS або хост-файл.
miono

7

Ось manзапис для найбільш актуальної на даний момент відповіді, оскільки вони включали лише посилання на програмний компонент:

--resolve <host:port:address>

    Provide  a  custom  address  for  a specific host and port pair. Using
    this, you can make the curl requests(s) use a specified address and 
    prevent the otherwise normally resolved address to be used. Consider 
    it a sort of /etc/hosts alternative provided on the command line. 
    The port number should be the number used for the specific protocol 
    the host will be used for. It means you need several entries if you 
    want to provide address for the same host but different ports.

    The provided address set by this option will be used even if -4, 
    --ipv4 or -6, --ipv6 is set to make curl use another IP version.

    This option can be used many times to add many host names to resolve.

    Added in 7.21.3.

Але через надане обмеження ("Це означає, що вам потрібно кілька записів, якщо ви хочете вказати адресу для одного хоста, але різні порти."), Я б розглядав інший, новіший варіант, який може перекласти обидва одночасно:

--connect-to <HOST1:PORT1:HOST2:PORT2>

    For  a request to the given HOST:PORT pair, connect to 
    CONNECT-TO-HOST:CONNECT-TO-PORT instead. This option is suitable 
    to direct requests at a specific server, e.g. at a specific cluster 
    node in a cluster of servers. This option is only used to establish 
    the network connection. It does NOT affect the hostname/port that 
    is used for TLS/SSL (e.g. SNI, certificate verification) or for 
    the application protocols. "host" and "port" may be the empty string, 
    meaning "any host/port". "connect-to-host" and "connect-to-port" 
    may also be the empty string, meaning "use the request's original host/port".

    This option can be used many times to add many connect rules.

    See also --resolve and -H, --header. 
    Added in 7.49.0.

4

Якщо ви використовуєте curl в Windows, використовуйте подвійні лапки

curl https://DOMAIN.TLD --resolve "DOMAIN.TLD:443:IP_ADDRESS"

curl DOMAIN.TLD --resolve "DOMAIN.TLD:80:IP_ADDRESS"

Ви можете пропустити схему / протокол вперед, але ви не можете пропустити номер порту в рядку --resolve.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.