So testen Sie eine HTTPS-URL mit einer bestimmten IP-Adresse

77

Angenommen, eine Website ist auf mehrere Server verteilt. Ich möchte einen Befehl ausführen, um zu testen, ob er funktioniert, z curl DOMAIN.TLD. Um jede IP-Adresse zu isolieren, gebe ich die IP manuell an. Aber viele Websites auf dem Server gehostet werden, so biete ich noch einen Host - Header, wie folgt aus : curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. Nach meinem Verständnis erzeugen diese beiden Befehle genau dieselbe HTTP-Anforderung. Der einzige Unterschied ist, dass ich in letzterem den DNS-Lookup-Teil aus cURL herausnehme und dies manuell mache (bitte korrigieren Sie mich, wenn ich falsch liege).

Alles soweit gut. Aber jetzt möchte ich dasselbe für eine HTTPS-URL tun. Wieder konnte ich es so testen curl https://DOMAIN.TLD. Aber ich möchte die IP manuell angeben, also starte ich curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'. Jetzt bekomme ich einen cURL-Fehler:

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

Ich kann das natürlich umgehen, indem ich cURL sage, dass das Zertifikat nicht wichtig ist (die Option "-k"), aber es ist nicht ideal.

Gibt es eine Möglichkeit, die IP-Adresse, mit der die Verbindung hergestellt wird, von dem durch SSL zertifizierten Host zu trennen?

Martin
quelle
Ist Ihr Load Balancer der SSL-Abschlusspunkt oder sind es die einzelnen Instanzen?
Rikola
Kann jemand erklären, warum der Host-Header nicht den richtigen VHost und das richtige Zertifikat im Back-End für HTTPS auswählt, aber dies allein für HTTP funktioniert in Ordnung. Übergibt der Client Informationen an das Back-End (unter Verwendung des HTTPS-Protokolls), unabhängig davon, ob eine IP-Adresse oder eine Domain verwendet wurde?
NeverEndingQueue
@NeverEndingQueue Um dies zu verstehen, müssen Sie die Beziehung zwischen TLS und HTTP kennen. Der Server muss das Zertifikat Hostanzeigen, bevor er auf den Header zugreifen kann. Dies --resolveist der richtige Weg, um eine IP-Adresse zu fixieren.
Franklin Yu

Antworten:

118

Ich glaube, ich habe eine Lösung gefunden, die das cURL-Handbuch durchgreift:

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

Hinzugefügt in [curl] 7.21.3. Entfernungsunterstützung in 7.42.0 hinzugefügt.

von CURLOPT_RESOLVE erklärt

Martin
quelle
1
--Resolve Doe nicht in Curl existieren ...
JustAGuy
7
Die Wellung auf meinem Computer (7.27.0) hat --resolve.
Theron Luhn
Sie können sehen, wie es funktioniert, curl -vund Sie können sehen, dass curl die Auflösungsoption zur temporären DNS-Cache-Speicherung hinzufügt und die von Ihnen angegebene IP-Adresse verwendet.
CMCDragonkai
CentOS 6.8 curl: option --resolve: ist unbekannt curl: probiere 'curl --help' oder 'curl --manual' für mehr Informationen root @ server3 [~] # curl -V curl 7.19.7 (x86_64-redhat-linux -gnu) libcurl / 7.19.7 NSS / 3.21 Basis ECC zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2 Protokolle: tftp ftp telnet dikt ldap ldaps http datei https ftps scp sftp Features: GSS-Negotiate IDN IPv6 Largefile NTLM SSL libz
Jose Nobile
Beachten Sie, dass bei Verwendung eines Hostnamens IP_ADDRESSdiese Option unbemerkt ignoriert wird.
Xiong Chiamiov
11

Sie können in / etc / hosts ändern, um den Server glauben zu lassen, dass sich die Domain auf einer bestimmten IP befindet.

Dies ist die Syntax:

192.168.10.20 www.domain.tld

Dadurch verwendet cURL die gewünschte IP-Adresse, ohne dass das SSL-Zertifikat beschädigt wird.

miono
quelle
4
Das funktioniert, aber ich suche nach einer Methode, bei der das gesamte Betriebssystem nicht geändert werden muss
Martin
Ich glaube ehrlich gesagt nicht, dass es einen anderen Weg gibt. Sie benötigen cURL, um auf den richtigen Domainnamen zuzugreifen, damit das Zertifikat funktioniert. Die Zuordnung einer bestimmten Domain zu einer IP erfolgt entweder über DNS oder über die Hosts-Datei.
miono
7

Hier ist der manEintrag für die aktuell am besten bewertete Antwort, da sie nur einen Link zur Programmkomponente enthielt:

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

Aufgrund der angegebenen Einschränkung ("Es bedeutet, dass Sie mehrere Einträge benötigen, wenn Sie die Adresse für denselben Host, aber für verschiedene Ports angeben möchten.") Würde ich eine andere, neuere Option in Betracht ziehen, mit der beide gleichzeitig übersetzt werden können:

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

Wenn Sie unter Windows curl ausführen, verwenden Sie doppelte Anführungszeichen

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

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

Sie können das Schema / Protokoll im Voraus überspringen, die Portnummer in der Zeichenfolge --resolve jedoch nicht.

Davidcsloane
quelle