web-dev-qa-db-fra.com

Comment tester une URL HTTPS avec une adresse IP donnée

Supposons qu'un site Web soit à charge équilibrée entre plusieurs serveurs. Je veux exécuter une commande pour tester si cela fonctionne, comme curl DOMAIN.TLD. Donc, pour isoler chaque adresse IP, je spécifie l'IP manuellement. Mais de nombreux sites Web peuvent être hébergés sur le serveur, donc je fournis toujours un en-tête Host, comme ceci: curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. À ma connaissance, ces deux commandes créent exactement la même requête HTTP. La seule différence est que dans ce dernier, je retire la partie de recherche DNS de cURL et le fais manuellement (veuillez me corriger si je me trompe).

Tout va bien jusqu'à présent. Mais maintenant, je veux faire la même chose pour une URL HTTPS. Encore une fois, je pourrais le tester comme ça curl https://DOMAIN.TLD. Mais je veux spécifier l'IP manuellement, donc je lance curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'. Maintenant, j'obtiens une erreur cURL:

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

Je peux bien sûr contourner cela en disant à cURL de ne pas se soucier du certificat (l'option "-k") mais ce n'est pas idéal.

Existe-t-il un moyen d'isoler l'adresse IP à laquelle se connecter de l'hôte certifié par SSL?

84
Martin

Je pense avoir trouvé une solution en parcourant le manuel cURL:

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

Ajouté dans [curl] 7.21.3. Prise en charge de la suppression ajoutée dans 7.42.0.

de explication de CURLOPT_RESOLVE

135
Martin

Vous pouvez changer dans/etc/hosts pour faire croire au serveur que le domaine se trouve à une certaine IP.

Voici la syntaxe:

192.168.10.20 www.domain.tld

Cela obligera cURL à utiliser l'adresse IP que vous souhaitez sans que le certificat SSL ne se casse.

12
miono

Voici l'entrée man pour la réponse actuellement la plus votée puisqu'ils ne comprenaient qu'un lien vers le composant programmatique:

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

Mais en raison de la limitation donnée ("Cela signifie que vous avez besoin de plusieurs entrées si vous souhaitez fournir l'adresse pour le même hôte mais des ports différents."), Je considérerais une autre option plus récente qui peut traduire les deux en même temps:

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

Si vous exécutez curl dans Windows, utilisez des guillemets doubles

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

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

Vous pouvez ignorer le schéma/protocole à l'avance, mais vous ne pouvez pas ignorer le numéro de port dans la chaîne --resolve.

4
davidcsloane