Cara menguji URL HTTPS dengan alamat IP yang diberikan

77

Katakanlah sebuah situs web adalah load-seimbang antara beberapa server. Saya ingin menjalankan perintah untuk menguji apakah itu berfungsi, seperti curl DOMAIN.TLD. Jadi, untuk mengisolasi setiap alamat IP, saya menentukan IP secara manual. Tapi banyak situs mungkin di-host di server, jadi saya masih memberikan header host, seperti ini: curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. Dalam pemahaman saya, kedua perintah ini membuat permintaan HTTP yang sama persis. Satu-satunya perbedaan adalah bahwa pada yang terakhir saya mengambil bagian pencarian DNS dari cURL dan melakukan ini secara manual (perbaiki saya jika saya salah).

Sejauh ini semuanya baik-baik saja. Tetapi sekarang saya ingin melakukan hal yang sama untuk url HTTPS. Sekali lagi, saya bisa mengujinya seperti ini curl https://DOMAIN.TLD. Tapi saya ingin menentukan IP secara manual, jadi saya jalankan curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'. Sekarang saya mendapatkan kesalahan CURL:

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

Tentu saja saya bisa menyiasati hal ini dengan mengatakan CURL untuk tidak peduli dengan sertifikat (opsi "-k") tetapi itu tidak ideal.

Apakah ada cara untuk mengisolasi alamat IP yang terhubung dari host yang disertifikasi oleh SSL?

Martin
sumber
Apakah penyeimbang beban Anda adalah titik terminasi SSL, atau apakah itu instance individual?
rikola
Dapatkah seseorang menjelaskan mengapa header Host tidak memilih VHost dan sertifikat yang benar di back-end untuk HTTPS, tetapi ini saja untuk HTTP berfungsi OK. Apakah klien meneruskan informasi ke back-end (menggunakan protokol HTTPS) apakah IP digunakan atau domain?
NeverEndingQueue
@NeverEndingQueue Untuk memahami ini, Anda perlu mengetahui hubungan antara TLS dan HTTP. Server perlu menunjukkan sertifikat sebelum memiliki akses ke Hostheader, jadi --resolvecara yang tepat untuk menyematkan alamat IP.
Franklin Yu

Jawaban:

118

Rasanya saya menemukan solusi melalui manual CURL:

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

Ditambahkan dalam [ikal] 7.21.3. Dukungan penghapusan ditambahkan pada 7.42.0.

dari CURLOPT_RESOLVE menjelaskan

Martin
sumber
1
--Resolve doe tidak ada di curl ...
JustAGuy
7
Keriting pada mesin saya (7.27.0) memiliki --resolve.
Theron Luhn
Anda dapat melihatnya berfungsi menggunakan curl -vdan Anda dapat melihat bahwa curl menambahkan opsi tekankan ke temporari cache DNS, dan menambahkan menggunakan alamat IP yang Anda tentukan.
CMCDragonkai
CentOS 6.8 curl: option --resolve: tidak diketahui curl: coba 'curl --help' atau 'curl --manual' untuk informasi lebih lanjut root @ server3 [~] # curl -V curl 7.19.7 (x86_64-redhat-linux -gnu) libcurl / 7.19.7 NSS / 3.21 Basic ECC zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2 Protokol: tftp ftp telnet dict ldap ldap file http https ftps scp sftp Fitur: GSS-Negosiasi IDN IPv6 Largefile NTLM SSL libz
Jose Nobile
Perhatikan bahwa jika Anda menggunakan nama host untuk IP_ADDRESS, itu akan diam-diam mengabaikan opsi.
Xiong Chiamiov
11

Anda dapat mengubah di / etc / hosts untuk membuat server berpikir bahwa domain tersebut terletak pada IP tertentu.

Ini adalah sintaks:

192.168.10.20 www.domain.tld

Ini akan membuat cURL menggunakan alamat IP yang Anda inginkan tanpa merusak sertifikat SSL.

miono
sumber
4
Itu bekerja, tapi saya melihat beberapa metode yang tidak memerlukan modifikasi OS secara keseluruhan
Martin
Sejujurnya saya tidak berpikir ada cara lain. Anda harus mendapatkan cURL untuk mengakses nama domain yang benar agar sertifikat berfungsi, dan cara untuk memetakan domain tertentu ke IP adalah melalui DNS atau file host.
miono
7

Ini adalah manentri untuk jawaban yang paling banyak dipilih saat ini karena mereka hanya menyertakan tautan ke komponen program:

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

Tetapi karena batasan yang diberikan ("Ini berarti Anda memerlukan beberapa entri jika Anda ingin memberikan alamat untuk host yang sama tetapi port yang berbeda."), Saya akan mempertimbangkan opsi lain yang lebih baru yang dapat menerjemahkan keduanya sekaligus:

--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.
pipis
sumber
4

Jika Anda menjalankan curl di Windows, gunakan tanda kutip ganda

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

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

Anda dapat melewati skema / protokol di depan, tetapi Anda tidak dapat melewatkan nomor port di string --resolve.

davidcsloane
sumber