x.example
とa.example
の両方のトラフィックを処理するb.example
があります。 x.example
には、a.example
とb.example
の両方の証明書があります。 a.example
およびb.example
のDNSはまだ設定されていません。
/etc/hosts
のIPを指すa.example
のx.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自体はアクセスできますか?
実際、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
を使用します)。
選択された回答は、回答を含まないにもかかわらず回答を見つけるのに役立ちました。提供されたメール/アーカイブリンク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 に記載されていました