Как проверить HTTPS URL с заданным 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, или это отдельные экземпляры?
рикола
Может кто-нибудь объяснить, почему заголовок Host не выбирает правильный VHost и сертификат на серверной части для HTTPS, но только для HTTP работает нормально. Передает ли клиент на сервер (используя протокол HTTPS), был ли использован IP или домен?
NeverEndingQueue
@NeverEndingQueue Чтобы понять это, вам нужно знать отношения между TLS и HTTP. Сервер должен показать сертификат, прежде чем он получит доступ к Hostзаголовку, поэтому --resolveэто правильный способ закрепления IP-адреса.
Франклин Ю

Ответы:

118

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

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

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

из CURLOPT_RESOLVE объяснил

Мартин
источник
1
--resolve не существует в curl ...
JustAGuy
7
Завиток на моей машине (7.27.0) имеет --resolve.
Терон Лун
Вы можете видеть, как он работает, curl -vи вы можете видеть, что curl добавляет опцию разрешения для временного кэша DNS и добавляет, использует IP-адрес, который вы указали.
CMCDragonkai
CentOS 6.8 curl: опция --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 Basic ECC zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2 Протоколы: tftp ftp telnet dict ldap ldaps http-файл https ftps ftps scp sftp Особенности: GSS-согласование IDN IPv6 Largefile NTLM SSL libz
Хосе Нобиле
Обратите внимание, что если вы используете имя хоста для IP_ADDRESS, он будет игнорировать эту опцию.
Сюн Чямов
11

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

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

192.168.10.20 www.domain.tld

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

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

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

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

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

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

davidcsloane
источник