Jak przetestować adres URL HTTPS z danym adresem IP

77

Załóżmy, że witryna jest zrównoważona pod względem obciążenia między kilkoma serwerami. Chcę uruchomić polecenie, aby sprawdzić, czy działa, np curl DOMAIN.TLD. Tak więc, aby wyizolować każdy adres IP, określam adres IP ręcznie. Ale wiele stron internetowych, mogą być przechowywane na serwerze, więc nadal stanowią nagłówek hosta, na przykład: curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. W moim rozumieniu te dwa polecenia tworzą dokładnie to samo żądanie HTTP. Jedyną różnicą jest to, że w tym drugim wyjmuję część wyszukiwania DNS z cURL i robię to ręcznie (popraw mnie, jeśli się mylę).

Jak dotąd dobrze. Ale teraz chcę zrobić to samo dla adresu URL HTTPS. Znów mogłem to przetestować w ten sposób curl https://DOMAIN.TLD. Ale chcę ręcznie podać adres IP, więc uruchamiam curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'. Teraz pojawia się błąd cURL:

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

Mogę oczywiście obejść ten problem, mówiąc cURL, aby nie przejmował się certyfikatem (opcja „-k”), ale nie jest to idealne rozwiązanie.

Czy istnieje sposób odizolowania podłączonego adresu IP od hosta certyfikowanego przez SSL?

Jaskółka oknówka
źródło
Czy moduł równoważenia obciążenia jest punktem końcowym protokołu SSL, czy może to poszczególne instancje?
rikola
Czy ktoś może wyjaśnić, dlaczego nagłówek hosta nie wybiera poprawnego VHost i certyfikatu na zapleczu dla HTTPS, ale to samo dla HTTP działa OK. Czy klient przekazuje informacje do zaplecza (przy użyciu protokołu HTTPS), czy użyto adresu IP czy domeny?
NeverEndingQueue
@NeverEndingQueue Aby to zrozumieć, musisz znać związek między TLS a HTTP. Serwer musi pokazać certyfikat, zanim będzie miał dostęp do Hostnagłówka, więc --resolvejest to właściwy sposób na przypięcie adresu IP.
Franklin Yu

Odpowiedzi:

117

Myślę, że znalazłem rozwiązanie w podręczniku cURL:

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

Dodano w [curl] 7.21.3. Dodano obsługę usuwania w 7.42.0.

z CURLOPT_RESOLVE wyjaśnione

Jaskółka oknówka
źródło
1
- rozwiązanie nie istnieje w curl ...
JustAGuy
7
Zwijanie na mojej maszynie (7.27.0) ma --resolve.
Theron Luhn
Możesz zobaczyć, jak działa, curl -vi możesz zauważyć, że curl dodaje opcję rozwiązywania do tymczasowej pamięci podręcznej DNS i dodaje korzysta z określonego adresu IP.
CMCDragonkai
CentOS 6.8 curl: opcja --resolve: nieznany curl: spróbuj 'curl --help' lub 'curl --manual', aby uzyskać więcej informacji 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 Protokoły: tftp ftp telnet dict ldap ldaps plik http https ftps scp sftp Funkcje: GSS-Negocjuj IDN IPv6 Duży plik NTLM SSL libz
Jose Nobile,
Pamiętaj, że jeśli użyjesz nazwy hosta IP_ADDRESS, po cichu zignoruje tę opcję.
Xiong Chiamiov
11

Możesz zmienić / etc / hosts, aby serwer myślał, że domena znajduje się pod określonym adresem IP.

Oto składnia:

192.168.10.20 www.domain.tld

Spowoduje to, że cURL użyje żądanego adresu IP bez konieczności złamania certyfikatu SSL.

miono
źródło
4
To działa, ale patrzę na jakąś metodę, która nie wymaga modyfikowania systemu operacyjnego jako całości
Martin
Szczerze mówiąc, nie sądzę, że istnieje inny sposób. Musisz uzyskać cURL, aby uzyskać dostęp do poprawnej nazwy domeny dla certyfikatu do działania, a sposobem mapowania określonej domeny na adres IP jest DNS lub plik hostów.
miono
7

Oto manwpis dla obecnie najbardziej uprzywilejowanej odpowiedzi, ponieważ zawierał tylko link do komponentu programowego:

--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.

Ale ze względu na podane ograniczenie („Oznacza to, że potrzebujesz kilku wpisów, jeśli chcesz podać adres dla tego samego hosta, ale różnych portów.”), Rozważyłbym inną, nowszą opcję, która może tłumaczyć oba jednocześnie:

--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
źródło
4

Jeśli używasz curl w Windows, użyj podwójnych cudzysłowów

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

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

Możesz pominąć schemat / protokół z góry, ale nie możesz pominąć numeru portu w ciągu --resolve.

Davidcsloane
źródło