Вопрос: Как протестировать URL-адрес HTTPS с заданным IP-адресом


Предположим, что веб-сайт сбалансирован по нагрузке между несколькими серверами. Я хочу запустить команду, чтобы проверить, работает ли она, например curl DOMAIN.TLD, Таким образом, чтобы изолировать каждый IP-адрес, я указываю IP вручную. Но многие веб-сайты могут размещаться на сервере, поэтому я все же предоставляю заголовок узла, например: curl IP_ADDRESS -H 'Host: DOMAIN.TLD', По моему мнению, эти две команды создают точный HTTP-запрос. Единственное различие заключается в том, что в последнем я вынимаю часть поиска DNS из cURL и делаю это вручную (пожалуйста, поправьте меня, если я ошибаюсь).

Все хорошо до сих пор. Но теперь я хочу сделать то же самое для HTTPS-url. Опять же, я могу проверить это так 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?


52
2017-10-31 09:10


Источник


Является ли ваша балансировка нагрузки точкой терминации SSL или это отдельные экземпляры? - rikola


Ответы:


Думаю, я нашел решение, проходящее через руководство cURL:

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

Добавлено в [curl] 7.21.3. Поддержка удаления добавлена ​​в 7.42.0.

из https://curl.haxx.se/libcurl/c/CURLOPT_RESOLVE.html


78
2017-10-31 10:32



--Результаты не существуют в скручивании ... - JustAGuy
У завитка на моей машине (7.27.0) есть --resolve. - Theron Luhn
Вы можете видеть, как он работает, используя curl -v и вы можете видеть, что завиток добавляет параметр разрешения в тайник DNS-времени, а добавляет использует указанный вами IP-адрес. - CMCDragonkai
CentOS 6.8 curl: option --resolve: неизвестно 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 Базовый ECC zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2 Протоколы: tftp ftp telnet dict ldap ldaps http-файл https ftps scp sftp Особенности: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz - Jose Nobile
Обратите внимание: если вы используете имя хоста для IP_ADDRESS, он будет молча игнорировать эту опцию. - Xiong Chiamiov


Вы можете изменить в / etc / hosts, чтобы сервер подумал, что домен находится на определенном IP-адресе.

Это синтаксис:

192.168.10.20 www.domain.tld

Это заставит cURL использовать IP-адрес, который вы хотите, без того, чтобы SSL-сертификат прерывался.


9
2017-10-31 09:14



Это работает, но я смотрю на какой-то метод, который не требует модификации ОС в целом - Martin
Я честно не думаю, что есть другой способ. Вы должны получить cURL для доступа к правильному доменному имени для работы сертификата, а способ сопоставления определенного домена с IP-адресом - либо DNS, либо файлом hosts. - miono


Если вы используете завиток в Windows, используйте двойные кавычки

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

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

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


4
2018-06-21 16:27





Здесь 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.

2
2018-03-09 13:34