SNIのメモ

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

検証したこと

  1. 俺俺TLS証明書
  2. httpd-ssl.confに以下バーチャルホストを設定
  3. chromeで https://test1.localhost にアクセス
  4. 実際パケット上でサーバー名がどうやって送信されるかwiresharkで確認

httpd-ssl.confの設定例

1
2
3
4
5
6
7
<VirtualHost *:443>
ServerName test1.localhost
DocumentRoot "/usr/local/apache2/htdocs"
SSLEngine on
SSLCertificateFile "/usr/local/apache2/conf/server.crt"
SSLCertificateKeyFile "/usr/local/apache2/conf/server.key"
</VirtualHost>

パケット

TLSハンドシェイクのClient Hello時(Client Helloについてはこちら)にTLS拡張で暗号化せずにserver_nameを送信してる。
おそらくapacheはこの情報をみてバーチャルホストを判定してる。

まとめ

パケットを見て分かるように、クライアントからservernameを暗号せずに送信してるため、当然のごとくクライアント側の実装依存になってしまい、旧ブラウザとか使えない(今はどうか知らない。。。)

apacheの設定をすることもめっきり減りましたが、ちょっとレンタルサーバーいじってて気になったのでメモしてみました(´・ω・`)