Come testare un URL HTTPS con un determinato indirizzo IP


77

Supponiamo che un sito Web sia bilanciato in base al carico tra più server. Voglio eseguire un comando per verificare se funziona, ad esempio curl DOMAIN.TLD. Quindi, per isolare ciascun indirizzo IP, specifico l'IP manualmente. Ma molti siti web possono essere ospitati sul server, quindi ho ancora fornire un'intestazione host, in questo modo: curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. A mio avviso, questi due comandi creano esattamente la stessa richiesta HTTP. L'unica differenza è che in quest'ultima estraggo la parte di ricerca DNS da cURL e lo faccio manualmente (per favore correggimi se sbaglio).

Tutto bene finora. Ma ora voglio fare lo stesso per un URL HTTPS. Ancora una volta, ho potuto testarlo in questo modo curl https://DOMAIN.TLD. Ma voglio specificare manualmente l'IP, quindi corro curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'. Ora ricevo un errore cURL:

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

Ovviamente posso aggirare il problema dicendo a cURL di non preoccuparsi del certificato (l'opzione "-k") ma non è l'ideale.

Esiste un modo per isolare l'indirizzo IP a cui si è connessi dall'host certificato da SSL?


Il bilanciamento del carico è il punto di terminazione SSL o sono le singole istanze?
rikola,

Qualcuno può spiegare perché l'intestazione Host non seleziona il VHost e il certificato corretti sul back-end per HTTPS, ma questo da solo per HTTP funziona bene. Il client passa le informazioni al back-end (utilizzando il protocollo HTTPS) se è stato utilizzato l'IP o il dominio?
NeverEndingQueue

@NeverEndingQueue Per capirlo devi conoscere la relazione tra TLS e HTTP. Il server deve mostrare il certificato prima che abbia accesso all'intestazione Host, quindi --resolveè il modo giusto per aggiungere un indirizzo IP.
Franklin Yu,

Risposte:


118

Penso di aver trovato una soluzione attraverso il manuale di cURL:

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

Aggiunto in [curl] 7.21.3. Supporto per la rimozione aggiunto in 7.42.0.

da CURLOPT_RESOLVE spiegato


1
--Risolve doe non esiste in curl ...
JustAGuy

7
Il ricciolo sulla mia macchina (7.27.0) ha --resolve.
Theron Luhn,

Puoi vederlo funzionare usando curl -ve puoi vedere che curl aggiunge temporaneamente l'opzione di risoluzione alla cache DNS e aggiunge usa l'indirizzo IP che hai specificato.
CMCDragonkai,

CentOS 6.8 curl: opzione --resolve: è sconosciuto curl: prova 'curl --help' o 'curl --manual' per maggiori informazioni root @ server3 [~] # curl -V curl 7.19.7 (x86_64-redhat-linux -gnu) libcurl / 7.19.7 NSS / 3.21 ECC di base zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2 Protocolli: tftp ftp telnet dict ldap ldap file http https ftps scp sftp Caratteristiche: GSS-Negoziare IDN IPv6 Largefile NTLM SSL libz
Jose Nobile,

Si noti che se si utilizza un nome host per IP_ADDRESS, ignorerà automaticamente l'opzione.
Xiong Chiamiov

11

Puoi cambiare in / etc / hosts per far pensare al server che il dominio si trova ad un certo IP.

Questa è la sintassi:

192.168.10.20 www.domain.tld

Questo farà sì che cURL utilizzi l'indirizzo IP desiderato senza che il certificato SSL si interrompa.


4
Funziona, ma sto esaminando un metodo che non richiede la modifica del sistema operativo nel suo insieme
Martin

Onestamente non penso che ci sia un altro modo. È necessario ottenere cURL per accedere al nome di dominio corretto affinché il certificato funzioni e il modo di mappare un determinato dominio su un IP è tramite DNS o tramite il file host.
miono,

7

Ecco la manvoce per la risposta attualmente più votata poiché includevano solo un collegamento al componente programmatico:

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

Ma a causa della limitazione fornita ("Significa che hai bisogno di più voci se vuoi fornire l'indirizzo per lo stesso host ma porte diverse"), prenderei in considerazione un'altra opzione più recente che può tradurre entrambe allo stesso tempo:

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

Se stai eseguendo il ricciolo in Windows, usa le doppie virgolette

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

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

È possibile saltare lo schema / protocollo in anticipo, ma non è possibile saltare il numero di porta nella stringa --resolve.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.