Cách kiểm tra URL HTTPS với một địa chỉ IP nhất định


77

Giả sử một trang web được cân bằng tải giữa một số máy chủ. Tôi muốn chạy một lệnh để kiểm tra xem nó có hoạt động không, chẳng hạn như curl DOMAIN.TLD. Vì vậy, để cách ly từng địa chỉ IP, tôi chỉ định IP theo cách thủ công. Nhưng nhiều trang web có thể được lưu trữ trên máy chủ, vì vậy tôi vẫn cung cấp tiêu đề máy chủ, như thế này : curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. Theo hiểu biết của tôi, hai lệnh này tạo ra cùng một yêu cầu HTTP chính xác. Sự khác biệt duy nhất là trong phần sau tôi lấy phần tra cứu DNS từ cURL và làm điều này bằng tay (vui lòng sửa cho tôi nếu tôi sai).

Tất cả đều tốt cho đến nay. Nhưng bây giờ tôi muốn làm tương tự cho một url HTTPS. Một lần nữa, tôi có thể kiểm tra nó như thế này curl https://DOMAIN.TLD. Nhưng tôi muốn chỉ định IP bằng tay, vì vậy tôi chạy curl https://IP_ADDRESS -H 'Host: DOMAIN.TLD'. Bây giờ tôi nhận được một lỗi cURL:

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

Tất nhiên tôi có thể khắc phục điều này bằng cách nói với cURL không quan tâm đến chứng chỉ (tùy chọn "-k") nhưng nó không lý tưởng.

Có cách nào để cách ly địa chỉ IP được kết nối với máy chủ được chứng nhận bởi SSL không?


Là bộ cân bằng tải của bạn là điểm kết thúc SSL, hay đó là các trường hợp riêng lẻ?
rikola

Ai đó có thể giải thích lý do tại sao tiêu đề Máy chủ không chọn đúng Vhost và chứng chỉ trên back-end cho HTTPS, nhưng riêng điều này cho HTTP hoạt động tốt. Máy khách có chuyển thông tin đến back-end (sử dụng giao thức HTTPS) cho dù IP đã được sử dụng hay miền?
NeverEinatingQueue

@NeverEinatingQueue Để hiểu điều này, bạn cần biết mối quan hệ giữa TLS và HTTP. Máy chủ cần hiển thị chứng chỉ trước khi có quyền truy cập vào Hosttiêu đề, vì vậy đây --resolvelà cách phù hợp để ghim địa chỉ IP.
Franklin Yu

Câu trả lời:


118

Hãy nghĩ rằng tôi đã tìm thấy một giải pháp thông qua hướng dẫn của CURL:

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

Đã thêm vào [curl] 7.21.3. Hỗ trợ loại bỏ được thêm vào trong 7.42.0.

từ CURLOPT_RESOLVE đã giải thích


1
- giải quyết doe không tồn tại trong curl ...
JustAGuy

7
Các lọn tóc trên máy của tôi (7.27.0) có - giải quyết.
Theron Luhn

Bạn có thể thấy nó hoạt động bằng cách sử dụng curl -vvà bạn có thể thấy rằng curl thêm tùy chọn giải quyết vào tạm thời bộ đệm DNS và thêm sử dụng địa chỉ IP bạn đã chỉ định.
CMCDragonkai

CentOS 6.8 curl: tùy chọn --resolve: không xác định curl: thử 'curl --help' hoặc 'curl --manual' để biết thêm thông tin root @ server3 [~] # curl -V curl 7.19.7 (x86_64-redhat-linux -gnu) libcurl / 7.19.7 NSS / 3.21 ECC cơ bản zlib / 1.2.3 libidn / 1.18 libssh2 / 1.4.2 Các giao thức: tftp ftp telnet dict ldap ldaps tệp http https libz
Jose Nobile

Lưu ý rằng nếu bạn sử dụng tên máy chủ cho IP_ADDRESS, nó sẽ âm thầm bỏ qua tùy chọn.
Xiong Chiamiov

11

Bạn có thể thay đổi trong / etc / hosts để làm cho máy chủ nghĩ rằng tên miền được đặt tại một IP nhất định.

Đây là cú pháp:

192.168.10.20 www.domain.tld

Điều này sẽ khiến cURL sử dụng địa chỉ IP bạn muốn mà không cần chứng chỉ SSL để phá vỡ.


4
Điều đó có hiệu quả, nhưng tôi đang xem xét một số phương pháp không yêu cầu sửa đổi toàn bộ HĐH
Martin

Tôi thực sự không nghĩ rằng có một cách khác. Bạn phải nhận được cURL để truy cập tên miền chính xác để chứng chỉ hoạt động và cách để ánh xạ một tên miền nhất định sang IP là bằng DNS hoặc bằng tệp máy chủ.
miono

7

Đây là manmục cho câu trả lời hiện tại được đánh giá cao nhất vì chúng chỉ bao gồm một liên kết đến thành phần lập trình:

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

Nhưng do giới hạn đưa ra ("Điều đó có nghĩa là bạn cần một vài mục nếu bạn muốn cung cấp địa chỉ cho cùng một máy chủ nhưng các cổng khác nhau."), Tôi sẽ xem xét một tùy chọn khác, mới hơn có thể dịch cả hai cùng một lúc:

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

Nếu bạn đang chạy curl trong Windows, hãy sử dụng dấu ngoặc kép

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

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

Bạn có thể bỏ qua sơ đồ / giao thức lên phía trước, nhưng bạn không thể bỏ qua số cổng trong chuỗi --resolve.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.