วิธีทดสอบ HTTPS URL ด้วยที่อยู่ IP ที่กำหนด


77

สมมติว่าเว็บไซต์สมดุลระหว่างเซิร์ฟเวอร์หลายเครื่อง curl DOMAIN.TLDฉันต้องการที่จะเรียกใช้คำสั่งเพื่อทดสอบว่ามันทำงานเช่น ดังนั้นเพื่อแยกที่อยู่ IP แต่ละอันฉันต้องระบุ IP ด้วยตนเอง curl IP_ADDRESS -H 'Host: DOMAIN.TLD'แต่เว็บไซต์ที่หลายคนอาจจะโฮสต์บนเซิร์ฟเวอร์ดังนั้นฉันยังคงให้ส่วนหัวของโฮสต์เช่นนี้ ในความเข้าใจของฉันทั้งสองคำสั่งสร้างคำขอ HTTP ที่แน่นอนเหมือนกัน ข้อแตกต่างเพียงอย่างเดียวคือในส่วนหลังฉันใช้ส่วนการค้นหา DNS จาก cURL และทำสิ่งนี้ด้วยตนเอง (โปรดแก้ไขฉันหากฉันผิด)

ทุกอย่างดี แต่ตอนนี้ฉันต้องการทำเช่นเดียวกันสำหรับ URL ของ HTTPS ฉันสามารถทดสอบมันได้เช่นนี้curl https://DOMAIN.TLDอีกครั้ง แต่ผมต้องการระบุ IP curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'ด้วยตนเองดังนั้นฉันทำงาน ตอนนี้ฉันได้รับข้อผิดพลาด cURL:

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

แน่นอนฉันสามารถหลีกเลี่ยงปัญหานี้ได้โดยบอก cURL ว่าไม่ต้องสนใจใบรับรอง (ตัวเลือก "-k") แต่มันก็ไม่เหมาะ

มีวิธีแยกที่อยู่ IP ที่กำลังเชื่อมต่อจากโฮสต์ที่ได้รับการรับรองโดย SSL หรือไม่


ตัวโหลดบาลานซ์ของคุณเป็นจุดสิ้นสุด SSL หรือเป็นแต่ละอินสแตนซ์?
rikola

มีคนอธิบายได้ไหมว่าทำไมส่วนหัวของโฮสต์ไม่เลือก VHost ที่ถูกต้องและใบรับรองในส่วนหลังของ HTTPS แต่เพียงอย่างเดียวสำหรับ HTTP นั้นก็ใช้ได้ ไคลเอ็นต์ส่งผ่านข้อมูลไปยังส่วนหลัง (โดยใช้โปรโตคอล HTTPS) ไม่ว่าจะใช้ IP หรือโดเมนหรือไม่
NeverEndingQueue

@NeverEndingQueue เพื่อให้เข้าใจสิ่งนี้คุณต้องทราบความสัมพันธ์ระหว่าง TLS และ HTTP เซิร์ฟเวอร์ต้องแสดงใบรับรองก่อนจึงจะสามารถเข้าถึงHostส่วนหัวได้ดังนั้นจึง--resolveเป็นวิธีที่ถูกต้องในการตรึงที่อยู่ IP
Franklin Yu

คำตอบ:


117

คิดว่าฉันพบวิธีแก้ปัญหาผ่านคู่มือ cURL:

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

เพิ่มใน [curl] 7.21.3 เพิ่มการรองรับการลบใน 7.42.0

จากCURLOPT_RESOLVE อธิบายแล้ว


1
- แก้ปัญหา doe ไม่มีอยู่ในขด ...
JustAGuy

7
ขดบนเครื่องของฉัน (7.27.0) มี - แก้ไข
Theron Luhn

คุณสามารถเห็นมันใช้งานได้curl -vและคุณจะเห็นว่า curl เพิ่มตัวเลือกการแก้ไขลงในแคช DNS ชั่วคราวและเพิ่มการใช้ที่อยู่ IP ที่คุณระบุ
CMCDragonkai

CentOS 6.8 curl: ตัวเลือก - แก้ปัญหา: ไม่ทราบ curl: ลอง 'curl --help' หรือ 'curl - คู่มือ' สำหรับข้อมูลเพิ่มเติม root @ server3 [~] # curl -V curl 7.19.7 (x86_64-redhat-linux -gnu) libcurl / 7.19.7 NSS / 3.21 พื้นฐาน ECC zlib / 1.2.3 libidn / 1.18 โปรโตคอล libssh2 / 1.4.2: tftp ftp telnet dict ldap ไฟล์ http https https ftps scp sftp คุณสมบัติ: GSS- เจรจา IDN IPv6 Largefile NTLM SSL libz
Jose Nobile

โปรดทราบว่าถ้าคุณใช้ชื่อโฮสต์สำหรับIP_ADDRESSมันจะไม่สนใจตัวเลือก
Xiong Chiamiov

11

คุณสามารถเปลี่ยนใน / etc / hosts เพื่อให้เซิร์ฟเวอร์คิดว่าโดเมนนั้นตั้งอยู่ที่ IP ที่แน่นอน

นี่คือไวยากรณ์:

192.168.10.20 www.domain.tld

สิ่งนี้จะทำให้ cURL ใช้ที่อยู่ IP ที่คุณต้องการโดยไม่มีใบรับรอง SSL เพื่อแยก


4
ใช้งานได้ แต่ฉันกำลังดูวิธีการบางอย่างซึ่งไม่จำเป็นต้องแก้ไขระบบปฏิบัติการโดยรวม
Martin

ฉันไม่คิดว่าจะมีวิธีอื่นอีกแล้ว คุณต้องได้รับ cURL เพื่อเข้าถึงชื่อโดเมนที่ถูกต้องเพื่อให้ใบรับรองทำงานและวิธีการจับคู่โดเมนกับ IP นั้นทำได้โดย DNS หรือจากโฮสต์ไฟล์
miono

7

นี่คือmanรายการสำหรับคำตอบที่ได้รับการโหวตมากที่สุดในขณะนี้เนื่องจากมีเพียงลิงก์ไปยังคอมโพเนนต์ของโปรแกรม:

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

แต่เนื่องจากข้อ จำกัด ที่ได้รับ ("หมายความว่าคุณต้องการหลายรายการถ้าคุณต้องการให้ที่อยู่สำหรับโฮสต์เดียวกัน แต่พอร์ตต่างกัน") ฉันจะพิจารณาอีกตัวเลือกใหม่ที่สามารถแปลทั้งสองในเวลาเดียวกัน:

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

4

หากคุณใช้ curl ใน Windows ให้ใช้เครื่องหมายคำพูดคู่

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

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

คุณสามารถข้ามแบบแผน / โปรโตคอลไปข้างหน้า แต่คุณไม่สามารถข้ามหมายเลขพอร์ตใน --resolve สตริง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.