Допустим, нагрузка на сайт распределена между несколькими серверами. Я хочу запустить команду, чтобы проверить, работает ли она, например 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?
Думаю, я нашел решение, просматривая руководство cURL:
curl https://DOMAIN.EXAMPLE --resolve 'DOMAIN.EXAMPLE:443:192.0.2.17'
Добавлено в [curl] 7.21.3. Поддержка удаления добавлена в 7.42.0.
Вы можете изменить / etc / hosts, чтобы сервер думал, что домен расположен на определенном IP.
Это синтаксис:
192.168.10.20 www.domain.tld
Это заставит cURL использовать нужный IP-адрес без взлома SSL-сертификата.
Здесь 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.
Если вы используете curl в Windows, используйте двойные кавычки
curl https://DOMAIN.TLD --resolve "DOMAIN.TLD:443:IP_ADDRESS"
curl DOMAIN.TLD --resolve "DOMAIN.TLD:80:IP_ADDRESS"
Вы можете пропустить схему / протокол заранее, но вы не можете пропустить номер порта в строке --resolve.