SNIのパケット覗き見
SNI(Server Name Indication)とは?
apacheのTLS通信用バーチャルホストをネームベース(ホスト名)で設定できる技術。
通常TLS通信の場合は、ホスト名も含めて暗号化されるからapacheは対応するバーチャルホストを見つけることができず、IPで見分けるしかなかった。
つまりIPひとつに対して443ポートが一つしか関連付けできないため、
事実上、IPに対してひとつしかTLSのバーチャルホストを設定できなかった。
そこで、ホスト名を暗号せずにブラウザから送信して、ネームベースでバーチャルホストの設定をできるようにする技術をSNI(Server Name Indication)と呼ぶらしい。
TLS拡張(RFC4366)
http://www.ipa.go.jp/security/rfc/RFC4366JA.html
検証したこと
- 俺俺TLS証明書
- httpd-ssl.confに以下バーチャルホストを設定
- chromeで https://test1.localhost にアクセス
- 実際パケット上でサーバー名がどうやって送信されるかwiresharkで確認
httpd-ssl.confの設定例
1 | <VirtualHost *:443> |
パケット
TLSハンドシェイクのClient Hello時(Client Helloについてはこちら)にTLS拡張で暗号化せずにserver_nameを送信してる。
おそらくapacheはこの情報をみてバーチャルホストを判定してる。
まとめ
パケットを見て分かるように、クライアントからservernameを暗号せずに送信してるため、当然のごとくクライアント側の実装依存になってしまい、旧ブラウザとか使えない(今はどうか知らない。。。)
apacheの設定をすることもめっきり減りましたが、ちょっとレンタルサーバーいじってて気になったのでメモしてみました(´・ω・`)