web-dev-qa-db-ja.com

特定のIPアドレスでHTTPS URLをテストする方法

Webサイトが複数のサーバー間で負荷分散されているとしましょう。 curl DOMAIN.TLDなどのコマンドが実行されているかどうかをテストする必要があります。したがって、各IPアドレスを分離するには、IPを手動で指定します。しかし、多くのWebサイトがサーバーでホストされている可能性があるため、curl IP_ADDRESS -H 'Host: DOMAIN.TLD'のようなHostヘッダーを提供します。私の理解では、これら2つのコマンドはまったく同じ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アドレスを分離する方法はありますか?

84
Martin

私がcURLマニュアルを通過する解決策を見つけたと思います:

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

[curl] 7.21.3で追加されました。 7.42.0で追加された削除のサポート。

from CURLOPT_RESOLVEの説明

135
Martin

/ etc/hostsを変更して、ドメインが特定のIPにあるとサーバーに認識させることができます。

これは構文です:

192.168.10.20 www.domain.tld

これにより、cURLはSSL証明書なしで必要なIPアドレスを使用します。

12
miono

プログラムコンポーネントへのリンクしか含まれていないため、現在最も投票されている回答の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.
8
peedee

Windowsでcurlを実行している場合は、二重引用符を使用します

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

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

スキーム/プロトコルは前もってスキップできますが、-resolve文字列のポート番号はスキップできません。

4
davidcsloane