web-dev-qa-db-ja.com

curl:httpsリクエストのターゲットホスト名を指定する方法

x.examplea.exampleの両方のトラフィックを処理するb.exampleがあります。 x.exampleには、a.exampleb.exampleの両方の証明書があります。 a.exampleおよびb.exampleのDNSはまだ設定されていません。

/etc/hostsのIPを指すa.examplex.exampleエントリを追加してcurl -XGET https://a.exampleを実行すると、200が得られます。

ただし、curl --header 'Host: a.example' https://x.exampleを実行すると、次のようになります。

curl:(51)SSL:代替証明書のサブジェクト名がターゲットホスト名x.exampleと一致しない

ホストとしてa.exampleを使用すると思います。多分私はSNI/TLSがどのように機能するか理解していません。

a.exampleはHTTPヘッダーなので、TLSハンドシェイクはまだそれにアクセスできませんか?しかし、URL自体はアクセスできますか?

7
lf215

実際、TLSのSNIはそのようには機能しません。 TLSに関連するすべてのSNIは、あらゆる種類のHTTPトラフィックの前に発生するため、そのステップではHostヘッダーは考慮されません(ただし、後でWebサーバーが接続しているホストを知るのに役立ちます)も)。

したがって、SNIを有効にするには、HTTPクライアントに特定のスイッチが必要であり、必要なホスト名の値を使用して、ハンドシェイク中に適切なTLS拡張を送信するように指示する必要があります。

curlの場合、少なくともバージョン7.18.1( https://curl.haxx.se/changes.html に基づく)が必要であり、自動的にHostヘッダーで提供される値。また、リンク先のOpenSSL(またはご使用のプラットフォームの同等のライブラリ)バージョンによっても異なります。

https://curl.haxx.se/docs/knownbugs.html のポイント1.10を参照してください。これはバグについて説明していますが、何が起こるかを説明しています。

ホスト名の部分の末尾にドットがあるURLが指定された場合: " https://example.com./ "、libcurlはドットを取り除き、ドットのない名前を内部で使用して送信しますHTTP Host:ヘッダーとTLS SNIフィールドのドットなし。

--connect-toオプションもあなたの場合に役立つかもしれません。または、--resolveの代わりに/etc/hostsを使用します。例については、 https://curl.haxx.se/mail/archive-2015-01/0042.html を参照してください。または https:// makandracards.com/makandra/1613-make-an-http-request-to-a-machine-but-fake-the-hostname すべてのケースで--verboseを追加して、何が起こっているかを詳細に確認できます。この例を参照してください: https://www.claudiokuenzler.com/blog/693/curious-case-of-curl-ssl-tls-sni-http-Host-header ; opensslを使用して直接テストする方法もわかります。

a.example/etc/hostsがある場合は、https://a.example/を指定してcurlを実行するだけで、HostヘッダーとSNIが処理されます(または、代わりに--resolveを使用します)。

10
Patrick Mevzek

選択された回答は、回答を含まないにもかかわらず回答を見つけるのに役立ちました。提供されたメール/アーカイブリンクPatrick Mevzekの回答には、wrongポート番号が含まれています。したがって、その答えに従っても失敗し続けます。

this container を使用して、デバッグサーバーを実行し、リクエストを検査しました。この種の問題をデバッグする人は誰でも同じことを強くお勧めします。

OPの質問に対処する方法は次のとおりです。

# Instead of this:
# curl --header 'Host: a.example'        https://x.example

# Do:
  Host=a.example
  target=x.example

  ip=$(Dig +short x.example | head -n1)
  curl -sv   --resolve $Host:443:$ip https://$Host

:httpsを使用しているため、443引数では--resolveの代わりに80を使用する必要があります。 mail/archive に記載されていました

4
Bruno Bronosky