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

77

Supposons qu'un site Web soit équilibré entre plusieurs serveurs. Je veux exécuter une commande pour vérifier si cela fonctionne, tel que curl DOMAIN.TLD. Donc, pour isoler chaque adresse IP, je spécifie l'adresse IP manuellement. Mais de nombreux sites peuvent être hébergés sur le serveur, donc je fournir encore un en- tête d'hôte, comme ceci: curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. Si j'ai bien compris, ces deux commandes créent exactement la même requête HTTP. La seule différence est que dans le dernier cas, je retire la partie de la recherche DNS de cURL et le fais manuellement (corrigez-moi 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'adresse IP manuellement, alors je cours curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'. Maintenant, je reçois 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 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 connectée à l'hôte certifié par SSL?

Martin
la source
Votre équilibreur de charge est-il le point de terminaison SSL ou s'agit-il d'instances individuelles?
Rikola
Quelqu'un peut-il expliquer pourquoi l'en-tête Host ne sélectionne pas le VHost et le certificat corrects sur le back-end pour HTTPS, mais cela seul pour HTTP fonctionne correctement. Le client transmet-il des informations au back-end (utilisant le protocole HTTPS), que l'adresse IP soit utilisée ou le domaine?
NeverEndingQueue le
@NeverEndingQueue Pour comprendre cela, vous devez connaître la relation entre TLS et HTTP. Le serveur doit afficher le certificat avant d’avoir accès à l’en- Hosttête, c’est donc --resolvele bon moyen de verrouiller une adresse IP.
Franklin Yu le

Réponses:

118

Pensez que j'ai trouvé une solution en passant par le manuel cURL:

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

Ajouté dans [curl] 7.21.3. Support de suppression ajouté dans 7.42.0.

de CURLOPT_RESOLVE expliqué

Martin
la source
1
--resolve n'existe pas en boucle ...
JustAGuy
7
La boucle sur ma machine (7.27.0) a --resolve.
Theron Luhn
Vous pouvez le voir fonctionner en utilisant curl -vet vous pouvez voir que curl ajoute l'option de résolution au cache du cache DNS temporairement, et ajoute utilise l'adresse IP que vous avez spécifiée.
CMCDragonkai
CentOS 6.8 curl: option --resolve: est inconnu curl: essayez 'curl --help' ou 'curl --manual' pour plus d'informations root @ server3 [~] # curl -V curl 7.19.7 (x86_64-redhat-linux -gnu) libcurl / 7.19.7 NSS / 3.21 ECC de base zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2 Protocoles: tftp ftp telnet dict ldap ldaps fichier http https ftps scp sftp libz
Jose Nobile
Notez que si vous utilisez un nom d’hôte pour IP_ADDRESS, l’option sera ignorée en silence.
Xiong Chiamiov
11

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

C'est la syntaxe:

192.168.10.20 www.domain.tld

Cela obligera cURL à utiliser l'adresse IP de votre choix sans le certificat SSL.

miono
la source
4
Cela fonctionne, mais je cherche une méthode qui ne nécessite pas de modifier le système d'exploitation dans son ensemble
Martin,
Honnêtement, je ne pense pas qu'il existe un autre moyen. Vous devez obtenir cURL pour accéder au nom de domaine correct pour que le certificat fonctionne, et la manière de mapper un certain domaine sur une IP est soit par DNS, soit par le fichier hosts.
Miono
7

Voici l' manentrée pour la réponse actuellement la plus votée puisqu'elles n'incluaient 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 voulez fournir une adresse pour le même hôte mais des ports différents."), Je considérerais une autre option, plus récente, pouvant 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.
peedee
la source
4

Si vous utilisez 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.

davidcsloane
la source