143 votes

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

Disons qu'un site web est réparti entre plusieurs serveurs. Je veux exécuter une commande pour tester si cela fonctionne, comme par exemple 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' . D'après moi, ces deux commandes créent exactement la même requête HTTP. La seule différence est que dans la dernière, j'enlève la partie recherche DNS de cURL et je la fais manuellement (merci de 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 ceci curl https://DOMAIN.TLD . Mais je veux spécifier l'IP manuellement, donc j'exécute 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 ce problème en indiquant à 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 on se connecte de l'hôte certifié par SSL ?

0 votes

Votre équilibreur de charge est-il le point de terminaison SSL ou les instances individuelles ?

0 votes

Quelqu'un peut-il expliquer pourquoi l'en-tête Host ne sélectionne pas le bon VHost et le bon certificat sur le back-end pour HTTPS, alors que ce seul en HTTP fonctionne correctement. Le client transmet-il des informations au back-end (en utilisant le protocole HTTPS) pour savoir si l'IP a été utilisé ou le domaine ?

2 votes

@NeverEndingQueue Pour comprendre cela, vous devez connaître la relation entre TLS et HTTP. Le serveur a besoin de montrer le certificat avant d'avoir accès aux services suivants Host l'en-tête, donc --resolve est la bonne façon d'épingler une adresse IP.

212voto

Martin Points 3185

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

curl https://example.com --resolve 'example.com:443:192.0.2.17'

Ajouté dans [curl] 7.21.3. La prise en charge de la suppression a été ajoutée dans la version 7.42.0.

de CURLOPT_RESOLVE expliqué

1 votes

--resolve doe not exist in curl...

11 votes

Le curl sur ma machine (7.27.0) a --resolve.

0 votes

Vous pouvez le voir fonctionner en utilisant curl -v et vous pouvez voir que curl ajoute l'option resolve au cache DNS temporairement, et ajoute utilise l'adresse IP que vous avez spécifié.

29voto

peedee Points 361

Voici le man pour la réponse la plus votée actuellement, puisqu'elle n'incluait qu'un lien vers la composante 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 voulez fournir une 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.

Exemple d'utilisation --connect-to :

curl https://domain.example --connect-to domain.example:443:203.0.113.81:443

0 votes

Curl : l'option --connect-to : est inconnue

1 votes

@NathanB Si ce n'est pas dans la page de manuel, vous avez peut-être une ancienne version. Mais, je dois dire que ce serait une version assez ancienne car même Ubuntu 18.04 l'a par défaut.

16voto

miono Points 536

Vous pouvez modifier le fichier /etc/hosts pour que le serveur pense que le domaine est situé à une certaine adresse IP.

Voici la syntaxe :

192.168.10.20 www.domain.tld

Cela permettra à cURL d'utiliser l'adresse IP que vous voulez sans que le certificat SSL soit cassé.

7 votes

Cela fonctionne, mais je cherche une méthode qui ne nécessite pas de modifier le système d'exploitation dans son ensemble.

0 votes

Honnêtement, je ne pense pas qu'il y ait d'autre moyen. Vous devez faire en sorte que cURL accède au nom de domaine correct pour que le certificat fonctionne, et la façon de faire correspondre un certain domaine à une IP est soit par DNS, soit par le fichier hosts.

6voto

davidcsloane Points 41

Si vous exécutez curl sous 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 au début, mais vous ne pouvez pas ignorer le numéro de port dans la chaîne --resolve.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X