TLSで接続している時にSNIを利用しているとログにはドメイン名しか残らない

TLSで接続しているとき,SNIを利用しているとログに接続に利用しているServer Nameが残らず,ドメイン名しか残らないという問題にハマりました.

あるアプリケーションでリモートのAPIを叩くときにTLSのエラーが発生しました.

networkError: FetchError: request to xxx

↑のような感じのログです.xxxにはリモートのドメイン名が入っています.リモートに接続を試みると問題なく接続できます. TLSの検証にも成功します.アプリケーション以外の,途中のproxyなどのログはありません.アプリケーションを何度実行しても再現します.

という状況で,考えても何もわからんとなったのでパケットキャプチャして見ることにしました.TLSの場合だと暗号化されていますが,TLSネゴシエーションのどの部分で失敗したか,がわかるとデバッグの助けになるかと思って,です.

すると,Client Helloで失敗しており,パケットを睨むとServer Nameが想定しているリモートのドメイン名と異なることがわかりました.

ログに出力されたドメイン名はあくまで接続先としてしか利用しておらず,TLS的には異なるServer Nameでネゴシエーションしようとしていたため,TLSネゴシエーションに失敗しTLSのエラーが出ていたのでした.

気がついてみるとまぁそういうこともあるよね…ぐらいの気分になるんですが,気がつく前まではなんで手元のcurlだと接続できるのにアプリケーションだとだめなんだよ,嘘だろぐらいの気持ちでした….

結局の所,アプリケーションが何をしているかはコードを読むか,アプリケーションの出力を観察しないとわからないよね,というのが教訓です.

さて,ところでESNIが採用されていたらこの問題には気がつけたでしょうか….