주어진 IP 주소로 HTTPS URL을 테스트하는 방법


77

웹 사이트가 여러 서버간에로드 밸런싱되었다고 가정 해 봅시다. 과 같은 작동하는지 테스트하는 명령을 실행하고 싶습니다 curl DOMAIN.TLD. 따라서 각 IP 주소를 분리하기 위해 IP를 수동으로 지정합니다. 그러나 많은 웹 사이트가 서버에서 호스팅 될 수 있으므로 여전히 다음과 같은 호스트 헤더를 제공합니다 curl IP_ADDRESS -H 'Host: DOMAIN.TLD'. 내 이해에 따르면,이 두 명령은 정확히 동일한 HTTP 요청을 만듭니다. 유일한 차이점은 후자에서 cURL에서 DNS 조회 부분을 꺼내 수동으로 수행한다는 것입니다 (잘못되면 수정하십시오).

지금까지는 모두 잘되었습니다. 그러나 이제는 HTTPS URL에 대해서도 똑같이하고 싶습니다. 다시 말하지만, 나는 이것을 다음과 같이 테스트 할 수 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"옵션)를 신경 쓰지 말라고 말하면이 문제를 해결할 수 있지만 이상적이지는 않습니다.

SSL로 인증 된 호스트에서 연결중인 IP 주소를 분리하는 방법이 있습니까?


로드 밸런서가 SSL 종료 지점입니까, 아니면 개별 인스턴스입니까?
rikola

누군가 호스트 헤더가 HTTPS의 백엔드에서 올바른 VHost 및 인증서를 선택하지 않는 이유를 설명 할 수는 있지만 HTTP의 경우에만 작동합니다. 클라이언트는 IP 사용 여부에 상관없이 백엔드 (HTTPS 프로토콜 사용)에 정보를 전달합니까?
NeverEndingQueue

@NeverEndingQueue이를 이해하려면 TLS와 HTTP의 관계를 알아야합니다. 서버는 Host헤더에 액세스하기 전에 인증서를 표시해야 하므로 --resolveIP 주소를 고정하는 올바른 방법입니다.
프랭클린 유

답변:


117

cURL 매뉴얼을 통해 해결책을 찾았습니다.

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

[컬] 7.21.3에서 추가됨. 7.42.0에서 제거 지원이 추가되었습니다.

에서 CURLOPT_RESOLVE 설명



7
내 컴퓨터의 컬 (7.27.0)에 --resolve가 있습니다.
Theron Luhn

curl -vcurl 이 작동하는 것을 볼 수 있으며 curl은 resolve 옵션을 DNS 캐시 시간에 추가하고 adds는 지정한 IP 주소를 사용함을 알 수 있습니다.
CMCDragonkai

CentOS 6.8 curl : 옵션 --resolve : 알 수 없음 curl : 자세한 정보는 'curl --help'또는 'curl --manual'을 시도하십시오 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 ldaps http 파일 https ftps scp sftp 기능 : GSS 협상 IDN IPv6 큰 파일 NTLM SSL libz
Jose Nobile

의 호스트 이름을 사용 IP_ADDRESS하면 옵션이 자동으로 무시됩니다.
Xiong Chiamiov

11

서버가 도메인이 특정 IP에 있다고 생각하도록 / etc / hosts를 변경할 수 있습니다.

이것은 구문입니다.

192.168.10.20 www.domain.tld

그러면 SSL 인증서를 위반하지 않고 cURL이 원하는 IP 주소를 사용하게됩니다.


4
작동하지만 OS 전체를 수정할 필요가없는 방법을 찾고 있습니다.
Martin

솔직히 다른 방법이 있다고 생각하지 않습니다. 인증서가 작동하려면 cURL을 올바른 도메인 이름에 액세스해야하며 특정 도메인을 IP에 매핑하는 방법은 DNS 또는 hosts 파일입니다.
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

Windows에서 curl을 실행하는 경우 큰 따옴표를 사용하십시오.

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.