【Nginx】ガラケーからSSL接続できなくて原因を調べたときの話
スポンサーリンク
経緯
ガラケーからアクセスすると
「ユーザ証明書がありません」
の表示が出てアクセスできない、というユーザーからの問い合わせで発覚。
調査
まず設定内容を確認。
ガラケーとそれ以外でドメイン分けて名前ベースのバーチャルホストを切り、それぞれ異なる証明書を設定してました。
わざわざバーチャルホストを切ったのは、メインの証明書はワイルドカード証明書になっていて、ガラケーはそれに対応できないため。めんどくさいですよね。
次に状況を確認。手元にガラケーがないので Mac でアクセスしてみると、問題なくアクセスできてました。ひとまず証明書の期限が切れているわけではなさそう。
サーバー側にクロスルート証明書を仕込み忘れてたのかな?と思いきや、確認してみるとちゃんと入ってました。さすが自分。
となると、サーバー側の設定に問題はないように見える。こうなるとクライアント側の問題なのだろう。
そう思ってルート証明書が入ってないのか等々ガラケーについて調べていたところ、近くにいる人がたまたま docomo のガラケー持っていたので、試させてもらうことができました。
すると「このサイトは安全でない可能性があるため接続できません」というエラーが。
これは何かおかしいと思い、サーバー側に tcpdump を仕込んでSSL通信を確認したところ、なんとガラケー用ではないワイルドカードの証明書が渡されているではないですか。なんてこったい。
ひとまずこれでサーバー側の設定がおかしいことが確定しました。
きっと正しいバーチャルホストへアクセスが行っていなそうだったので、ガラケー側バーチャルホストにだけデバッグログを仕込んでみると、正しくアクセスが来ている。うーん、しかしなんでか SSL のログが少ないような・・・
!!!
ここで閃きました。SSL だけバーチャルホストの設定が効いていないように見える。つまり、SSLだけが別バーチャルホスト(デフォルト設定)で動作している!
ここまでくるともうほぼ原因が見えていて、SNI が効いていない説が濃厚でした。なにしろガラケーは SNI に対応していないんですよね。すっかり忘れておりました。
というわけで、ガラケー用にIPを増やしてバーチャルホスト設定をIPベースにしてみたところ正しく動作するようになりました。(さらっと書いたけどこの作業が一番しんどかった)