chatGPTを使って、「多くのエンジニアは知らないけど、知ると得すること」というテーマでいろんな知識を得ているときに、以下の情報が出てきました。
–resolve {ホスト名}:{ポート}:{IPアドレス}
この記述方法と、-H オプションによってHostヘッダを書き換えた場合でどのような差異があるのかが気になりました。
ただ、この疑問自体、自分のHTTPS通信に対する本質的な理解ができていなかったため、生まれたものでした。
自分は証明書を使ったSANによるサーバ認証はHostヘッダを用いるものかと、うっすら思っていました。
そのため、–resolveを使った場合とHostヘッダを書き換えた場合は同じ挙動になるのではないかと考えていましたが、その認識は誤っていました。
サーバ認証を行うための情報は、TLSハンドシェイクの段階で取得をするものであり、その実態は先述のSANです。
–resolveは、このSANを書き換えるためのオプションでした。
Hostヘッダを書き換えたとしても、SANを書き換えなければ、認証エラーになります。
自分がいまいちしっくりとSANが出てくるタイミングを理解していないために起きた誤りでした。
※そもそもHostヘッダはHTTP内の概念なので、それがTLSハンドシェイクの段階で参照することはできないですよね…
いろいろなパターンでcurlリクエストを送ったパターンを貼っておきます。
(ssldump側のアウトプットでは、extensions内のserver_nameに注目してください。)
curl https://example.com #通常のリクエスト
curl https://23.192.228.84 #IP指定でcurlを実行する場合
curl -H ‘Host: example.com’ https://23.192.228.84 # IP指定でhostヘッダを指定してcurlを実行する場合
curl –resolve example.com:443:23.192.228.84 https://example.com #IPを指定して、SNIを変更して接続できます。